15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/metrics/field_trial.h" 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string16.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_test.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/renderer/form_autofill_util.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/renderer/form_cache.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/autofill/core/common/autofill_data_validation.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/web_element_descriptor.h" 19424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/entropy_provider.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormControlElement.h" 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormElement.h" 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputElement.h" 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h" 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNode.h" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSelectElement.h" 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "third_party/WebKit/public/web/WebTextAreaElement.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDocument; 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebElement; 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFormControlElement; 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFormElement; 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame; 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputElement; 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebNode; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebSelectElement; 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebTextAreaElement; 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebVector; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)struct AutofillFieldCase { 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const char* const form_control_type; 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* const name; 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* const initial_value; 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* const autocomplete_attribute; // The autocomplete attribute of 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the element. 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool should_be_autofilled; // Whether the filed should be autofilled. 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* const autofill_value; // The value being used to fill the field. 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const char* const expected_value; // The expected value after Autofill 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // or Preview. 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)static const char kFormHtml[] = 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://buh.com' method='post'>" 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname'/>" 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='hidden' id='imhidden'/>" 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='notempty' value='Hi'/>" 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' autocomplete='off' id='noautocomplete'/>" 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' disabled='disabled' id='notenabled'/>" 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' readonly id='readonly'/>" 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' style='visibility: hidden'" 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " id='invisible'/>" 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' style='display: none' id='displaynone'/>" 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='month' id='month'/>" 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='month' id='month-nonempty' value='2011-12'/>" 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SELECT id='select'>" 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " <OPTION></OPTION>" 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='CA'>California</OPTION>" 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='TX'>Texas</OPTION>" 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " </SELECT>" 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SELECT id='select-nonempty'>" 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='CA' selected>California</OPTION>" 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='TX'>Texas</OPTION>" 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " </SELECT>" 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SELECT id='select-unchanged'>" 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='CA' selected>California</OPTION>" 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='TX'>Texas</OPTION>" 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) " </SELECT>" 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TEXTAREA id='textarea'></TEXTAREA>" 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TEXTAREA id='textarea-nonempty'>Go away!</TEXTAREA>" 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "</FORM>"; 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FormAutofillTest : public ChromeRenderViewTest { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormAutofillTest() : ChromeRenderViewTest() {} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~FormAutofillTest() {} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectLabels(const char* html, 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& labels, 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& names, 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& values) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> control_types(labels.size(), "text"); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabelsAndTypes(html, labels, names, values, control_types); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectLabelsAndTypes(const char* html, 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& labels, 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& names, 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<base::string16>& values, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<std::string>& control_types) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(labels.size(), names.size()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(labels.size(), values.size()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(labels.size(), control_types.size()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML(html); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormData& form = forms[0]; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://cnn.com"), form.action); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(labels.size(), fields.size()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < labels.size(); ++i) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int max_length = control_types[i] == "text" ? 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement::defaultMaxLength() : 0; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = labels[i]; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = names[i]; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = values[i]; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = control_types[i]; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = max_length; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SCOPED_TRACE(base::StringPrintf("i: %" PRIuS, i)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[i]); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectJohnSmithLabels(const char* html) { 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("First name:")); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Last name:")); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Email:")); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels(html, labels, names, values); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) typedef void (*FillFormFunction)(const FormData& form, 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const WebFormControlElement& element); 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) typedef WebString (*GetValueFunction)(WebFormControlElement element); 171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Test FormFillxxx functions. 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void TestFormFillFunctions(const char* html, 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const AutofillFieldCase* field_cases, 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t number_of_field_cases, 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FillFormFunction fill_form_function, 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetValueFunction get_value_function) { 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) LoadHTML(html); 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FormCache form_cache; 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) std::vector<FormData> forms; 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Get the input element we want to find. 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WebElement element = web_frame->document().getElementById("firstname"); 190a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 191a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Find the form that contains the input element. 193a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FormData form_data; 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FormFieldData field; 195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE( 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FindFormAndFieldForFormControlElement(input_element, 197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form_data, 198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_AUTOCOMPLETE)); 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form_data.name); 201a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form_data.origin); 202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form_data.action); 203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 204a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::vector<FormFieldData>& fields = form_data.fields; 205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_EQ(number_of_field_cases, fields.size()); 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FormFieldData expected; 208a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Verify field's initial value. 209a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = 0; i < number_of_field_cases; ++i) { 210a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Verify initial value for field %s", 211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) field_cases[i].name)); 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.form_control_type = field_cases[i].form_control_type; 2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.max_length = 2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.form_control_type == "text" ? 2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebInputElement::defaultMaxLength() : 0; 216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected.name = ASCIIToUTF16(field_cases[i].name); 217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected.value = ASCIIToUTF16(field_cases[i].initial_value); 218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected.autocomplete_attribute = field_cases[i].autocomplete_attribute; 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[i]); 220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fill the form_data for the field. 221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) form_data.fields[i].value = ASCIIToUTF16(field_cases[i].autofill_value); 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Set the is_autofilled property for the field. 22346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form_data.fields[i].is_autofilled = field_cases[i].should_be_autofilled; 224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Autofill the form using the given fill form function. 227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) fill_form_function(form_data, input_element); 228a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 229a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Validate Autofill or Preview results. 230a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (size_t i = 0; i < number_of_field_cases; ++i) { 231a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ValidteFilledField(field_cases[i], get_value_function); 232a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Validate an Autofilled field. 236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void ValidteFilledField(const AutofillFieldCase& field_case, 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) GetValueFunction get_value_function) { 238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("Verify autofilled value for field %s", 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) field_case.name)); 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebString value; 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebFormControlElement element = GetMainFrame()->document().getElementById( 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASCIIToUTF16(field_case.name)).to<WebFormControlElement>(); 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if ((element.formControlType() == "select-one") || 244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch (element.formControlType() == "textarea")) { 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) value = get_value_function(element); 246a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } else { 2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_TRUE(element.formControlType() == "text" || 2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) element.formControlType() == "month"); 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) value = get_value_function(element); 250a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const WebString expected_value = ASCIIToUTF16(field_case.expected_value); 2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (expected_value.isEmpty()) 2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_TRUE(value.isEmpty()); 2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) else 2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(expected_value, value); 2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_EQ(field_case.should_be_autofilled, element.isAutofilled()); 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void FillFormIncludingNonFocusableElementsWrapper( 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const FormData& form, 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const WebFormControlElement& element) { 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) FillFormIncludingNonFocusableElements(form, element.form()); 265a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static WebString GetValueWrapper(WebFormControlElement element) { 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (element.formControlType() == "textarea") 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return element.to<WebTextAreaElement>().value(); 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (element.formControlType() == "select-one") 272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return element.to<WebSelectElement>().value(); 273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return element.to<WebInputElement>().value(); 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static WebString GetSuggestedValueWrapper(WebFormControlElement element) { 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (element.formControlType() == "textarea") 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return element.to<WebTextAreaElement>().suggestedValue(); 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (element.formControlType() == "select-one") 282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return element.to<WebSelectElement>().suggestedValue(); 283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return element.to<WebInputElement>().suggestedValue(); 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FormAutofillTest); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to extract a normal text field. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormField) { 2936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<INPUT type='text' id='element' value='value'/>"); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result1; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result1); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("element"); 308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result2; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result2); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("element"); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("value"); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to extract a text field with autocomplete="off". 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompleteOff) { 3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<INPUT type='text' id='element' value='value'" 3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " autocomplete='off'/>"); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("element"); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("value"); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.autocomplete_attribute = "off"; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to extract a text field with maxlength specified. 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMaxLength) { 3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<INPUT type='text' id='element' value='value'" 3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " maxlength='5'/>"); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("element"); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("value"); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 5; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to extract a text field that has been autofilled. 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutofilled) { 3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<INPUT type='text' id='element' value='value'/>"); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement element = web_element.to<WebInputElement>(); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element.setAutofilled(true); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("element"); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("value"); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We should be able to extract a radio or a checkbox field that has been 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// autofilled. 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToClickableFormField) { 3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<INPUT type='checkbox' id='checkbox' value='mail' checked/>" 3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='radio' id='radio' value='male'/>"); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* frame = GetMainFrame(); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebElement web_element = frame->document().getElementById("checkbox"); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebInputElement element = web_element.to<WebInputElement>(); 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element.setAutofilled(true); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormFieldData result; 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormFieldData expected; 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.name = ASCIIToUTF16("checkbox"); 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.value = ASCIIToUTF16("mail"); 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.form_control_type = "checkbox"; 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.is_autofilled = true; 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.is_checkable = true; 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expected.is_checked = true; 4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_element = frame->document().getElementById("radio"); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element = web_element.to<WebInputElement>(); 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) element.setAutofilled(true); 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.name = ASCIIToUTF16("radio"); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.value = ASCIIToUTF16("male"); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.form_control_type = "radio"; 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.is_autofilled = true; 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.is_checkable = true; 417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) expected.is_checked = false; 4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to extract a <select> field. 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldSelect) { 4236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<SELECT id='element'/>" 4246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='CA'>California</OPTION>" 4256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='TX'>Texas</OPTION>" 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</SELECT>"); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result1; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result1); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("element"); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 0; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "select-one"; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("CA"); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result2; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField( 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<autofill::ExtractMask>(autofill::EXTRACT_VALUE | 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_OPTION_TEXT), 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result2); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("California"); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result2); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result3; 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_OPTIONS, 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &result3); 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result3); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, result3.option_values.size()); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, result3.option_contents.size()); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("CA"), result3.option_values[0]); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("California"), result3.option_contents[0]); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TX"), result3.option_values[1]); 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Texas"), result3.option_contents[1]); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// When faced with <select> field with *many* options, we should trim them to a 4680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// reasonable number. 4690529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FormAutofillTest, WebFormControlElementToFormFieldLongSelect) { 4706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string html = "<SELECT id='element'/>"; 4710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t i = 0; i < 2 * kMaxListSize; ++i) { 4726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) html += base::StringPrintf("<OPTION value='%" PRIuS "'>" 4730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch "%" PRIuS "</OPTION>", i, i); 4740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 4750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch html += "</SELECT>"; 4760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch LoadHTML(html.c_str()); 4770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WebFrame* frame = GetMainFrame(); 4790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ASSERT_TRUE(frame); 4800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WebElement web_element = frame->document().getElementById("element"); 4820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WebFormControlElement element = web_element.to<WebFormControlElement>(); 4830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch FormFieldData result; 4840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WebFormControlElementToFormField(element, autofill::EXTRACT_OPTIONS, &result); 4850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(0U, result.option_values.size()); 4870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_EQ(0U, result.option_contents.size()); 4880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 4890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// We should be able to extract a <textarea> field. 4914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldTextArea) { 4926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<TEXTAREA id='element'>" 4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "This element's value " 4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "spans multiple lines." 4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "</TEXTAREA>"); 4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebFrame* frame = GetMainFrame(); 4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FormFieldData result_sans_value; 5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, 5044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &result_sans_value); 5054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FormFieldData expected; 5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.name = ASCIIToUTF16("element"); 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.max_length = 0; 5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.form_control_type = "textarea"; 5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); 5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) FormFieldData result_with_value; 5134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, 5144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) &result_with_value); 5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.value = ASCIIToUTF16("This element's value\n" 5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "spans multiple lines."); 5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); 5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// We should be able to extract an <input type="month"> field. 5211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldMonthInput) { 5226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<INPUT type='month' id='element' value='2011-12'>"); 5231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 5251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 5261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 5281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 5291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FormFieldData result_sans_value; 5301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, 5311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &result_sans_value); 5321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FormFieldData expected; 5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.name = ASCIIToUTF16("element"); 5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.max_length = 0; 5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.form_control_type = "month"; 5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); 5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) FormFieldData result_with_value; 5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, 5411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) &result_with_value); 5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.value = ASCIIToUTF16("2011-12"); 5431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_with_value); 5441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 5451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should not extract the value for non-text and non-select fields. 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldInvalidType) { 5486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 5496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='hidden' id='hidden' value='apple'/>" 5506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' id='submit' value='Send'/>" 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement web_element = frame->document().getElementById("hidden"); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 0; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("hidden"); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "hidden"; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_element = frame->document().getElementById("submit"); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) element = web_element.to<WebFormControlElement>(); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.name = ASCIIToUTF16("submit"); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.form_control_type = "submit"; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We should be able to extract password fields. 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToPasswordFormField) { 5786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 5796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='password' id='password' value='secret'/>" 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "</FORM>"); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* frame = GetMainFrame(); 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebElement web_element = frame->document().getElementById("password"); 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormFieldData result; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormFieldData expected; 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.name = ASCIIToUTF16("password"); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.form_control_type = "password"; 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.value = ASCIIToUTF16("secret"); 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should be able to extract the autocompletetype attribute. 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormControlElementToFormFieldAutocompletetype) { 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string html = 6016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='text' id='absent'/>" 6026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='text' id='empty' autocomplete=''/>" 6036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='text' id='off' autocomplete='off'/>" 6046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='text' id='regular' autocomplete='email'/>" 6056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='text' id='multi-valued' " 6066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " autocomplete='billing email'/>" 6076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='text' id='experimental' x-autocompletetype='email'/>" 6086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='month' id='month' autocomplete='cc-exp'/>" 6096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<SELECT id='select' autocomplete='state'/>" 6106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='CA'>California</OPTION>" 6116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='TX'>Texas</OPTION>" 6124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "</SELECT>" 6136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<TEXTAREA id='textarea' autocomplete='street-address'>" 6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " Some multi-" 6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " lined value" 6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "</TEXTAREA>"; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) html += 6186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='text' id='malicious' autocomplete='" + 6196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string(10000, 'x') + "'/>"; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML(html.c_str()); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct TestCase { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string element_id; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string form_control_type; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string autocomplete_attribute; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCase test_cases[] = { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An absent attribute is equivalent to an empty one. 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "absent", "text", "" }, 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure there are no issues parsing an empty attribute. 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "empty", "text", "" }, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure there are no issues parsing an attribute value that isn't a 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // type hint. 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "off", "text", "off" }, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Common case: exactly one type specified. 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "regular", "text", "email" }, 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that we correctly extract multiple tokens as well. 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "multi-valued", "text", "billing email" }, 6421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Verify that <input type="month"> fields are supported. 6431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) { "month", "month", "cc-exp" }, 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We previously extracted this data from the experimental 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 'x-autocompletetype' attribute. Now that the field type hints are part 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the spec under the autocomplete attribute, we no longer support the 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // experimental version. 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "experimental", "text", "" }, 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <select> elements should behave no differently from text fields here. 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "select", "select-one", "state" }, 6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // <textarea> elements should also behave no differently from text fields. 6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) { "textarea", "textarea", "street-address" }, 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Very long attribute values should be replaced by a default string, to 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // prevent malicious websites from DOSing the browser process. 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "malicious", "text", "x-max-data-length-exceeded" }, 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_cases); ++i) { 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement web_element = frame->document().getElementById( 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASCIIToUTF16(test_cases[i].element_id)); 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData result; 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_NONE, &result); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16(test_cases[i].element_id); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = test_cases[i].form_control_type; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.autocomplete_attribute = test_cases[i].autocomplete_attribute; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (test_cases[i].form_control_type == "text") 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 0; 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(test_cases[i].element_id); 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(FormAutofillTest, DetectTextDirectionFromDirectStyle) { 6806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<STYLE>input{direction:rtl}</STYLE>" 6816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM>" 6826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='element'>" 6836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</FORM>"); 6846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 6866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 6876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 6896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 6906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FormFieldData result; 6926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 6936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); 6946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 6956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(FormAutofillTest, DetectTextDirectionFromDirectDIRAttribute) { 6976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM>" 6986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT dir='rtl' type='text' id='element'/>" 6996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</FORM>"); 7006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 7026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 7036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 7056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 7066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FormFieldData result; 7086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 7096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); 7106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 7116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(FormAutofillTest, DetectTextDirectionFromParentStyle) { 7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<STYLE>form{direction:rtl}</STYLE>" 7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM>" 7156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='element'/>" 7166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</FORM>"); 7176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 7196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 7206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 7226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 7236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FormFieldData result; 7256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 7266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); 7276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 7286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(FormAutofillTest, DetectTextDirectionFromParentDIRAttribute) { 7306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM dir='rtl'>" 7316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='element'/>" 7326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</FORM>"); 7336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 7356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 7366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 7386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 7396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FormFieldData result; 7416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 7426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); 7436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 7446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(FormAutofillTest, DetectTextDirectionWhenStyleAndDIRAttributMixed) { 7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<STYLE>input{direction:ltr}</STYLE>" 7476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM dir='rtl'>" 7486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='element'/>" 7496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</FORM>"); 7506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 7526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 7536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 7556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 7566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FormFieldData result; 7586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 7596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction); 7606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 7616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(FormAutofillTest, 7636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DetectTextDirectionWhenParentHasBothDIRAttributeAndStyle) { 7646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<STYLE>form{direction:ltr}</STYLE>" 7656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM dir='rtl'>" 7666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='element'/>" 7676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</FORM>"); 7686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 7706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 7716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 7736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 7746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FormFieldData result; 7766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 7776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(base::i18n::LEFT_TO_RIGHT, result.text_direction); 7786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 7796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(FormAutofillTest, DetectTextDirectionWhenAncestorHasInlineStyle) { 7816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM style='direction:ltr'>" 7826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SPAN dir='rtl'>" 7836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='element'/>" 7846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " </SPAN>" 7856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</FORM>"); 7866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 7886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 7896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebElement web_element = frame->document().getElementById("element"); 7916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElement element = web_element.to<WebFormControlElement>(); 7926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) FormFieldData result; 7946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) WebFormControlElementToFormField(element, autofill::EXTRACT_VALUE, &result); 7956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(base::i18n::RIGHT_TO_LEFT, result.text_direction); 7966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 7976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormElementToFormData) { 7996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 8006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='firstname'>First name:</LABEL>" 8016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 8026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='lastname'>Last name:</LABEL>" 8036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 8046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='street-address'>Address:</LABEL>" 8056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TEXTAREA id='street-address'>" 8066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "123 Fantasy Ln. " 8076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "Apt. 42" 8086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "</TEXTAREA>" 8096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='state'>State:</LABEL>" 8106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SELECT id='state'/>" 8116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='CA'>California</OPTION>" 8126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='TX'>Texas</OPTION>" 8136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " </SELECT>" 8146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='password'>Password:</LABEL>" 8156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='password' id='password' value='secret'/>" 8166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='month'>Card expiration:</LABEL>" 8176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='month' id='month' value='2011-12'/>" 8186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The below inputs should be ignored 8206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='notvisible'>Hidden:</LABEL>" 8216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='hidden' id='notvisible' value='apple'/>" 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFormElement> forms; 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().forms(forms); 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = frame->document().getElementById("firstname"); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WebFormElementToFormData(forms[0], 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_element, 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::REQUIRE_NONE, 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_VALUE, 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &form, 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &field)); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(frame->document().url()), form.origin); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://cnn.com"), form.action); 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 8471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_EQ(6U, fields.size()); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("John"); 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("First name:"); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("Last name:"); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.name = ASCIIToUTF16("street-address"); 8654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); 8664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.label = ASCIIToUTF16("Address:"); 8674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.form_control_type = "textarea"; 8684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.max_length = 0; 8694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 8704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("state"); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("CA"); 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("State:"); 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "select-one"; 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 0; 8764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.name = ASCIIToUTF16("password"); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.value = ASCIIToUTF16("secret"); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.label = ASCIIToUTF16("Password:"); 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.form_control_type = "password"; 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); 8841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.name = ASCIIToUTF16("month"); 8861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.value = ASCIIToUTF16("2011-12"); 8871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.label = ASCIIToUTF16("Card expiration:"); 8881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.form_control_type = "month"; 8891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.max_length = 0; 8901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should not be able to serialize a form with too many fillable fields. 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormElementToFormDataTooManyFields) { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string html = 8966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>"; 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < (autofill::kMaxParseableFields + 1); ++i) { 8986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) html += "<INPUT type='text'/>"; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) html += "</FORM>"; 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML(html.c_str()); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFormElement> forms; 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().forms(forms); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = frame->document().getElementById("firstname"); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WebFormElementToFormData(forms[0], 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_element, 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::REQUIRE_NONE, 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_VALUE, 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &form, 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &field)); 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ExtractForms) { 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 9256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 9266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " First name: <INPUT type='text' id='firstname' value='John'/>" 9276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " Last name: <INPUT type='text' id='lastname' value='Smith'/>" 9286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " Email: <INPUT type='text' id='email' value='john@example.com'/>" 9296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ExtractMultipleForms) { 9346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 9356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 9366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 9376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 9386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>" 9406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm2' action='http://zoo.com' method='post'>" 9416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='Jack'/>" 9426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Adams'/>" 9436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='jack@example.com'/>" 9446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, forms.size()); 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // First form. 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormData& form = forms[0]; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://cnn.com"), form.action); 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("John"); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("john@example.com"); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Second form. 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormData& form2 = forms[1]; 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm2"), form2.name); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://zoo.com"), form2.action); 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Jack"); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Adams"); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("jack@example.com"); 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(FormAutofillTest, OnlyExtractNewForms) { 1003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadHTML( 1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "<FORM id='testform' action='http://cnn.com' method='post'>" 1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 1006cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "</FORM>"); 1010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 1012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 1013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1014cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FormCache form_cache; 1015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<FormData> forms; 1016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 1018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) forms.clear(); 1019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Second call should give nothing as there are no new forms. 1021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(0U, forms.size()); 1023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Append to the current form will re-extract. 1025cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExecuteJavaScript( 1026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "var newInput = document.createElement('input');" 1027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newInput.setAttribute('type', 'text');" 1028cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newInput.setAttribute('id', 'telephone');" 1029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newInput.value = '12345';" 1030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "document.getElementById('testform').appendChild(newInput);"); 1031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg_loop_.RunUntilIdle(); 1032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1034cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 1035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1036cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<FormFieldData>& fields = forms[0].fields; 1037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(4U, fields.size()); 1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FormFieldData expected; 1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.form_control_type = "text"; 1041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 1042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1043cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 1044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.value = ASCIIToUTF16("John"); 1045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 1046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1047cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 1048cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 1049cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 1050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 1052cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.value = ASCIIToUTF16("john@example.com"); 1053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 1054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.name = ASCIIToUTF16("telephone"); 1056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.value = ASCIIToUTF16("12345"); 1057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 1058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) forms.clear(); 1060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Completely new form will also be extracted. 1062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExecuteJavaScript( 1063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "var newForm=document.createElement('form');" 1064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newForm.id='new_testform';" 1065cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newForm.action='http://google.com';" 1066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newForm.method='post';" 1067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "var newFirstname=document.createElement('input');" 1068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newFirstname.setAttribute('type', 'text');" 1069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newFirstname.setAttribute('id', 'second_firstname');" 1070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newFirstname.value = 'Bob';" 1071cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "var newLastname=document.createElement('input');" 1072cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newLastname.setAttribute('type', 'text');" 1073cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newLastname.setAttribute('id', 'second_lastname');" 1074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newLastname.value = 'Hope';" 1075cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "var newEmail=document.createElement('input');" 1076cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newEmail.setAttribute('type', 'text');" 1077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newEmail.setAttribute('id', 'second_email');" 1078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newEmail.value = 'bobhope@example.com';" 1079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newForm.appendChild(newFirstname);" 1080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newForm.appendChild(newLastname);" 1081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "newForm.appendChild(newEmail);" 1082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "document.body.appendChild(newForm);"); 1083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) msg_loop_.RunUntilIdle(); 1084cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) web_frame = GetMainFrame(); 1086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 1088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = forms[0].fields; 1090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 1091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.name = ASCIIToUTF16("second_firstname"); 1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.value = ASCIIToUTF16("Bob"); 1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.name = ASCIIToUTF16("second_lastname"); 1097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.value = ASCIIToUTF16("Hope"); 1098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.name = ASCIIToUTF16("second_email"); 1101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected.value = ASCIIToUTF16("bobhope@example.com"); 1102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 1103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// We should not extract a form if it has too few fillable fields. 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ExtractFormsTooFewFields) { 11076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 11086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 11096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 11106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 1118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, forms.size()); 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// We should not report additional forms for empty forms. 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(FormAutofillTest, ExtractFormsSkippedForms) { 11246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 11256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 11266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 1127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "</FORM>"); 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 1130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FormCache form_cache; 1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<FormData> forms; 1134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0U, forms.size()); 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// We should not report additional forms for empty forms. 1139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(FormAutofillTest, ExtractFormsNoFields) { 11406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 1141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "</FORM>"); 1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FormCache form_cache; 1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<FormData> forms; 1148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(0U, forms.size()); 1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We should not extract a form if it has too few fillable fields. 11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Make sure radio and checkbox fields don't count. 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FormAutofillTest, ExtractFormsTooFewFieldsSkipsCheckable) { 11556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 11566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 11576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 11586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='radio' id='a_radio' value='0'/>" 11596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='checkbox' id='a_check' value='1'/>" 11606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "</FORM>"); 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FormCache form_cache; 11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<FormData> forms; 1168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0U, forms.size()); 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, WebFormElementToFormDataAutocomplete) { 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Form is not auto-completable due to autocomplete=off. 11756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'" 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " autocomplete=off>" 11776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 11786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 11796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 11806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFormElement> web_forms; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().forms(web_forms); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, web_forms.size()); 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormElement web_form = web_forms[0]; 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WebFormElementToFormData( 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_form, WebFormControlElement(), autofill::REQUIRE_NONE, 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_NONE, &form, NULL)); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(WebFormElementToFormData( 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_form, WebFormControlElement(), autofill::REQUIRE_AUTOCOMPLETE, 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_NONE, &form, NULL)); 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The firstname element is not auto-completable due to autocomplete=off. 12026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://abc.com' " 12036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " method='post'>" 12046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'" 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " autocomplete=off>" 12066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='middlename' value='Jack'/>" 12076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 12086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 12096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply' value='Send'/>" 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFormElement> web_forms; 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().forms(web_forms); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, web_forms.size()); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormElement web_form = web_forms[0]; 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WebFormElementToFormData( 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_form, WebFormControlElement(), autofill::REQUIRE_AUTOCOMPLETE, 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_VALUE, &form, NULL)); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://abc.com"), form.action); 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("middlename"); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Jack"); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("john@example.com"); 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1250effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(FormAutofillTest, FindFormForInputElement) { 12516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 12526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 12536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 12546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'" 12556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "autocomplete='off' />" 12566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='phone' value='1.800.555.1234'/>" 12576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the input element we want to find. 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = web_frame->document().getElementById("firstname"); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the form and verify it's the correct form. 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 1275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 1276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form, 1277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 1278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form.action); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4U, fields.size()); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("John"); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("john@example.com"); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.autocomplete_attribute = "off"; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.autocomplete_attribute = std::string(); // reset 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("phone"); 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("1.800.555.1234"); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Try again, but require autocomplete. 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 1312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement( 1313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch input_element, 1314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 1315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 1316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_AUTOCOMPLETE)); 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form2.action); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("John"); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("phone"); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("1.800.555.1234"); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1341effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(FormAutofillTest, FindFormForTextAreaElement) { 13426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 13436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 13446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 13456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'" 13466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "autocomplete='off' />" 13476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TEXTAREA id='street-address'>" 1348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "123 Fantasy Ln. " 1349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "Apt. 42" 1350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "</TEXTAREA>" 13516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 1352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "</FORM>"); 1353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebFrame* web_frame = GetMainFrame(); 1355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 1356effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FormCache form_cache; 1358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<FormData> forms; 1359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 1360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_EQ(1U, forms.size()); 1361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Get the textarea element we want to find. 1363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebElement element = web_frame->document().getElementById("street-address"); 1364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch WebTextAreaElement textarea_element = element.to<WebTextAreaElement>(); 1365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Find the form and verify it's the correct form. 1367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FormData form; 1368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FormFieldData field; 1369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(textarea_element, 1370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form, 1371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 1372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 1373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 1374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 1375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(GURL("http://buh.com"), form.action); 1376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::vector<FormFieldData>& fields = form.fields; 1378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_EQ(4U, fields.size()); 1379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1380effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FormFieldData expected; 1381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.name = ASCIIToUTF16("firstname"); 1383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.value = ASCIIToUTF16("John"); 1384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.form_control_type = "text"; 1385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.max_length = WebInputElement::defaultMaxLength(); 1386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 1387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.name = ASCIIToUTF16("lastname"); 1389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.value = ASCIIToUTF16("Smith"); 1390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.form_control_type = "text"; 1391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.max_length = WebInputElement::defaultMaxLength(); 1392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 1393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.name = ASCIIToUTF16("email"); 1395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.value = ASCIIToUTF16("john@example.com"); 1396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.autocomplete_attribute = "off"; 1397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.form_control_type = "text"; 1398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.max_length = WebInputElement::defaultMaxLength(); 1399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 1400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.autocomplete_attribute = std::string(); // reset 1401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.name = ASCIIToUTF16("street-address"); 1403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); 1404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.form_control_type = "textarea"; 1405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.max_length = 0; 1406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 1407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); 1408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Try again, but require autocomplete. 1410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FormData form2; 1411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch FormFieldData field2; 1412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement( 1413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch textarea_element, 1414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 1415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 1416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_AUTOCOMPLETE)); 1417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 1418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 1419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(GURL("http://buh.com"), form2.action); 1420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::vector<FormFieldData>& fields2 = form2.fields; 1422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_EQ(3U, fields2.size()); 1423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.name = ASCIIToUTF16("firstname"); 1425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.value = ASCIIToUTF16("John"); 1426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.form_control_type = "text"; 1427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.max_length = WebInputElement::defaultMaxLength(); 1428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 1429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.name = ASCIIToUTF16("lastname"); 1431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.value = ASCIIToUTF16("Smith"); 1432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.form_control_type = "text"; 1433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.max_length = WebInputElement::defaultMaxLength(); 1434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 1435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.name = ASCIIToUTF16("street-address"); 1437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.value = ASCIIToUTF16("123 Fantasy Ln.\nApt. 42"); 1438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.form_control_type = "textarea"; 1439effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch expected.max_length = 0; 1440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 1441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); 1442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 1443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1444a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test regular FillForm function. 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, FillForm) { 1446a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static const AutofillFieldCase field_cases[] = { 14474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // fields: form_control_type, name, initial_value, autocomplete_attribute, 1448a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // should_be_autofilled, autofill_value, expected_value 1449a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1450a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Regular empty fields (firstname & lastname) should be autofilled. 14514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "firstname", "", "", true, "filled firstname", 14524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "filled firstname"}, 14534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "lastname", "", "", true, "filled lastname", "filled lastname"}, 1454a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // hidden fields should not be extracted to form_data. 1455a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Non empty fields should not be autofilled. 14564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "notempty", "Hi", "", false, "filled notempty", "Hi"}, 1457a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // "noautocomplete" should not be extracted to form_data. 1458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Disabled fields should not be autofilled. 14594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "notenabled", "", "", false, "filled notenabled", ""}, 1460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Readonly fields should not be autofilled. 14614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "readonly", "", "", false, "filled readonly", ""}, 1462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fields with "visibility: hidden" should not be autofilled. 14634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "invisible", "", "", false, "filled invisible", ""}, 1464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fields with "display:none" should not be autofilled. 14654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "displaynone", "", "", false, "filled displaynone", ""}, 14661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Regular <input type="month"> should be autofilled. 14671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {"month", "month", "", "", true, "2017-11", "2017-11"}, 14681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Non-empty <input type="month"> should not be autofilled. 14691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {"month", "month-nonempty", "2011-12", "", false, "2017-11", "2011-12"}, 14704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Regular select fields should be autofilled. 14714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"select-one", "select", "", "", true, "TX", "TX"}, 14724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Select fields should be autofilled even if they already have a 14734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // non-empty value. 14744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 147546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Select fields should not be autofilled if no new value is passed from 147646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // autofill profile. The existing value should not be overriden. 147746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {"select-one", "select-unchanged", "CA", "", false, "CA", "CA"}, 14784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Regular textarea elements should be autofilled. 14794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"textarea", "textarea", "", "", true, "some multi-\nline value", 14804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "some multi-\nline value"}, 14814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Non-empty textarea elements should not be autofilled. 14824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"textarea", "textarea-nonempty", "Go\naway!", "", false, 14834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "some multi-\nline value", "Go\naway!"}, 1484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 1485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 14865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FillForm, &GetValueWrapper); 1487a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Verify preview selection. 1488a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WebInputElement firstname = GetMainFrame()->document(). 1489a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) getElementById("firstname").to<WebInputElement>(); 1490a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(16, firstname.selectionStart()); 1491a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(16, firstname.selectionEnd()); 1492a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1494a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(FormAutofillTest, FillFormIncludingNonFocusableElements) { 1495a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static const AutofillFieldCase field_cases[] = { 14964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // fields: form_control_type, name, initial_value, autocomplete_attribute, 1497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // should_be_autofilled, autofill_value, expected_value 1498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Regular empty fields (firstname & lastname) should be autofilled. 15004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "firstname", "", "", true, "filled firstname", 15014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "filled firstname"}, 15024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "lastname", "", "", true, "filled lastname", "filled lastname"}, 1503a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // hidden fields should not be extracted to form_data. 15044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Non empty fields should be overriden. 15054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "notempty", "Hi", "", true, "filled notempty", 15064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "filled notempty"}, 1507a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // "noautocomplete" should not be extracted to form_data. 1508a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Disabled fields should not be autofilled. 15094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "notenabled", "", "", false, "filled notenabled", ""}, 1510a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Readonly fields should not be autofilled. 15114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "readonly", "", "", false, "filled readonly", ""}, 1512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fields with "visibility: hidden" should also be autofilled. 15134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "invisible", "", "", true, "filled invisible", 15144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "filled invisible"}, 1515a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Fields with "display:none" should also be autofilled. 15164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "displaynone", "", "", true, "filled displaynone", 15174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "filled displaynone"}, 15181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Regular <input type="month"> should be autofilled. 15191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {"month", "month", "", "", true, "2017-11", "2017-11"}, 15201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Non-empty <input type="month"> should be overridden. 15211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) {"month", "month-nonempty", "2011-12", "", true, "2017-11", "2017-11"}, 15224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Regular select fields should be autofilled. 15234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"select-one", "select", "", "", true, "TX", "TX"}, 15244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Select fields should be autofilled even if they already have a 15254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // non-empty value. 15264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 152746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Select fields should not be autofilled if no new value is passed from 152846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // autofill profile. The existing value should not be overriden. 152946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {"select-one", "select-unchanged", "CA", "", false, "CA", "CA"}, 15304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Regular textarea elements should be autofilled. 15314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"textarea", "textarea", "", "", true, "some multi-\nline value", 15324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "some multi-\nline value"}, 15334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Nonempty textarea elements should be overridden. 15344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"textarea", "textarea-nonempty", "Go\naway!", "", true, 15354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "some multi-\nline value", "some multi-\nline value"}, 1536a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 1537a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 1538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) &FillFormIncludingNonFocusableElementsWrapper, 15395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &GetValueWrapper); 1540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, PreviewForm) { 1543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static const AutofillFieldCase field_cases[] = { 1544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Normal empty fields should be previewed. 15454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "firstname", "", "", true, "suggested firstname", 15464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "suggested firstname"}, 15474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) {"text", "lastname", "", "", true, "suggested lastname", 15484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) "suggested lastname"}, 15495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Hidden fields should not be extracted to form_data. 1550a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Non empty fields should not be previewed. 15515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"text", "notempty", "Hi", "", false, "suggested notempty", ""}, 1552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // "noautocomplete" should not be extracted to form_data. 1553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Disabled fields should not be previewed. 15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"text", "notenabled", "", "", false, "suggested notenabled", ""}, 15555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Readonly fields should not be previewed. 15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"text", "readonly", "", "", false, "suggested readonly", ""}, 15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fields with "visibility: hidden" should not be previewed. 15585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"text", "invisible", "", "", false, "suggested invisible", 15595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ""}, 15605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fields with "display:none" should not previewed. 15615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"text", "displaynone", "", "", false, "suggested displaynone", 15625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ""}, 1563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Regular <input type="month"> should be previewed. 1564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) {"month", "month", "", "", true, "2017-11", "2017-11"}, 15655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Non-empty <input type="month"> should not be previewed. 15665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"month", "month-nonempty", "2011-12", "", false, "2017-11", ""}, 1567effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Regular select fields should be previewed. 1568effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch {"select-one", "select", "", "", true, "TX", "TX"}, 1569effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Select fields should be previewed even if they already have a 1570effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // non-empty value. 1571effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch {"select-one", "select-nonempty", "CA", "", true, "TX", "TX"}, 157246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Select fields should not be previewed if no suggestion is passed from 157346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // autofill profile. 157446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) {"select-one", "select-unchanged", "CA", "", false, "", ""}, 15755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Normal textarea elements should be previewed. 15765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"textarea", "textarea", "", "", true, "suggested multi-\nline value", 15775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "suggested multi-\nline value"}, 15785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Nonempty textarea elements should not be previewed. 15795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) {"textarea", "textarea-nonempty", "Go\naway!", "", false, 15805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "suggested multi-\nline value", ""}, 1581a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) }; 15825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestFormFillFunctions(kFormHtml, field_cases, arraysize(field_cases), 15835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &PreviewForm, &GetSuggestedValueWrapper); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Verify preview selection. 1586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) WebInputElement firstname = GetMainFrame()->document(). 1587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) getElementById("firstname").to<WebInputElement>(); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, firstname.selectionStart()); 1589a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(19, firstname.selectionEnd()); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, Labels) { 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 15946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 15956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='firstname'> First name: </LABEL>" 15966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 15976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='lastname'> Last name: </LABEL>" 15986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 15996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='email'> Email: </LABEL>" 16006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 16016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsWithSpans) { 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 16076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 16086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='firstname'><span>First name: </span></LABEL>" 16096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 16106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='lastname'><span>Last name: </span></LABEL>" 16116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 16126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='email'><span>Email: </span></LABEL>" 16136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 16146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test is different from FormAutofillTest.Labels in that the label 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// elements for= attribute is set to the name of the form control element it is 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a label for instead of the id of the form control element. This is invalid 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// because the for= attribute must be set to the id of the form control element; 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// however, current label parsing code will extract the text from the previous 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// label element and apply it to the following input field. 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, InvalidLabels) { 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 16266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 16276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='firstname'> First name: </LABEL>" 16286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='firstname' value='John'/>" 16296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='lastname'> Last name: </LABEL>" 16306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='lastname' value='Smith'/>" 16316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='email'> Email: </LABEL>" 16326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='email' value='john@example.com'/>" 16336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test has three form control elements, only one of which has a label 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// element associated with it. 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, OneLabelElement) { 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 16416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " First name:" 16436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 16446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='lastname'>Last name: </LABEL>" 16456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Email:" 16476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 16486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromText) { 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 16546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " First name:" 16566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Last name:" 16586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Email:" 16606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 16616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromParagraph) { 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 16676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 16686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <P>First name:</P><INPUT type='text' " 16696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " id='firstname' value='John'/>" 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <P>Last name:</P>" 16716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <P>Email:</P>" 16736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 16746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromBold) { 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 16806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 16816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <B>First name:</B><INPUT type='text' " 16826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " id='firstname' value='John'/>" 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Last name:</B>" 16846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Email:</B>" 16866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 16876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredPriorToImgOrBr) { 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 16936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 16946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " First name:<IMG/><INPUT type='text' " 16956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " id='firstname' value='John'/>" 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Last name:<IMG/>" 16976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Email:<BR/>" 16996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 17006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableCell) { 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 17066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>First name:</TD>" 17106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TD><INPUT type='text' id='firstname' value='John'/></TD>" 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>Last name:</TD>" 17146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TD><INPUT type='text' id='lastname' value='Smith'/></TD>" 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>Email:</TD>" 17186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TD><INPUT type='text' id='email'" 17196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " value='john@example.com'/></TD>" 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 17246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableCellTH) { 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 17336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TH>First name:</TH>" 17376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TD><INPUT type='text' id='firstname' value='John'/></TD>" 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TH>Last name:</TH>" 17416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TD><INPUT type='text' id='lastname' value='Smith'/></TD>" 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TH>Email:</TH>" 17456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TD><INPUT type='text' id='email'" 17466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " value='john@example.com'/></TD>" 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 17516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableCellNested) { 1759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("First name: Bogus")); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Last name:")); 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Email:")); 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 17746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " First name:" 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Bogus" 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 17876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Last name:" 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 17996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Email:" 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 18116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableEmptyTDs) { 1827a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* First Name")); 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Last Name")); 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Email")); 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 18426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>First Name</B>" 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Last Name</B>" 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Email</B>" 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 18776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromPreviousTD) { 1886a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* First Name")); 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Last Name")); 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Email")); 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 19016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>* First Name</TD>" 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Bogus" 19076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='hidden'/>" 19086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>* Last Name</TD>" 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>* Email</TD>" 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 19325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <script>, <noscript> and <option> tags are excluded when the labels are 19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// inferred. 19365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Also <!-- comment --> is excluded. 19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableWithSpecialElements) { 1938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> control_types; 19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* First Name")); 19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_types.push_back("text"); 19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Middle Name")); 19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("middlename")); 19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Joe")); 19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_types.push_back("text"); 19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Last Name")); 19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_types.push_back("text"); 19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Country")); 19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("country")); 19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("US")); 19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_types.push_back("select-one"); 19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Email")); 19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) control_types.push_back("text"); 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabelsAndTypes( 19676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>First Name</B>" 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SCRIPT> <!-- function test() { alert('ignored as label'); } -->" 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SCRIPT>" 19776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Middle Name</B>" 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <NOSCRIPT>" 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <P>Bad</P>" 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </NOSCRIPT>" 19896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='middlename' value='Joe'/>" 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Last Name</B>" 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 19986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Country</B>" 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SELECT id='country'>" 20086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION VALUE='US'>The value should be ignored as label." 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </OPTION>" 20106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION VALUE='JP'>JAPAN</OPTION>" 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SELECT>" 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN>" 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <B>Email</B>" 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <!-- This comment should be ignored as inferred label.-->" 20216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD></TD>" 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values, control_types); 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableLabels) { 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 20376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <LABEL>First name:</LABEL>" 20426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <LABEL>Last name:</LABEL>" 20486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <LABEL>Email:</LABEL>" 20546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 20586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='submit' name='reply-send' value='Send'/>" 20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableTDInterveningElements) { 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 20646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " First name:" 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <BR>" 20706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Last name:" 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <BR>" 20776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Email:" 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <BR>" 20846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 20886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<INPUT type='submit' name='reply-send' value='Send'/>" 20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we correctly infer labels when the label text spans multiple 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// adjacent HTML elements, not separated by whitespace. 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableAdjacentElements) { 2095a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("*First Name")); 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("*Last Name")); 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("*Email")); 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 21106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN><B>First Name</B>" 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN><B>Last Name</B>" 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>*</SPAN><B>Email</B>" 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>" 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we correctly infer labels when the label text resides in the 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// previous row. 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromTableRow) { 2149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("*First Name *Last Name *Email")); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("*First Name *Last Name *Email")); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("*First Name *Last Name *Email")); 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 21646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<TABLE>" 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>*First Name</TD>" 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>*Last Name</TD>" 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>*Email</TD>" 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TR>" 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <TD>" 21846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TD>" 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </TR>" 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</TABLE>", 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we correctly infer labels when enclosed within a list item. 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromListItem) { 2193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Home Phone")); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("areacode")); 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("415")); 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Home Phone")); 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("prefix")); 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("555")); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* Home Phone")); 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("suffix")); 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("1212")); 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 22086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>" 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <LI>" 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>Bogus</SPAN>" 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </LI>" 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <LI>" 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <LABEL><EM>*</EM> Home Phone</LABEL>" 22156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='areacode' value='415'/>" 22166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='prefix' value='555'/>" 22176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='suffix' value='1212'/>" 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </LI>" 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <LI>" 22206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </LI>" 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromDefinitionList) { 2228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("* First name: Bogus")); 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Last name:")); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Email:")); 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 22436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DL>" 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT>" 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " *" 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " First name:" 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Bogus" 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DT>" 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 22586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT>" 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Last name:" 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DT>" 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 22686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT>" 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Email:" 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DT>" 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 22786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT></DT>" 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 22836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DL>" 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredWithSameName) { 2291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Address Line 1:")); 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("Address")); 2295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Address Line 2:")); 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("Address")); 2299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Address Line 3:")); 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("Address")); 2303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 23066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Address Line 1:" 23086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='Address'/>" 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Address Line 2:" 23106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='Address'/>" 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Address Line 3:" 23126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='Address'/>" 23136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredWithImageTags) { 2319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Phone:")); 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("dayphone1")); 2323a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("-")); 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("dayphone2")); 2327a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("-")); 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("dayphone3")); 2331a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("ext.:")); 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("dayphone4")); 2335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) labels.push_back(base::string16()); 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("dummy")); 2339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) values.push_back(base::string16()); 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 23426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Phone:" 23446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone1'>" 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <img/>" 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -" 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <img/>" 23486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone2'>" 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <img/>" 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -" 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <img/>" 23526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone3'>" 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ext.:" 23546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone4'>" 23556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dummy'>" 23566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='submit' name='reply-send' value='Send'>" 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromDivTable) { 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 23636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>First name:<BR>" 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 23666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='firstname' value='John'>" 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>Last name:<BR>" 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 23716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='lastname' value='Smith'>" 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>Email:<BR>" 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 23766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='email' value='john@example.com'>" 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 23796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<input type='submit' name='reply-send' value='Send'>" 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromDivSiblingTable) { 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 23856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>First name:</DIV>" 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>" 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 23896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='firstname' value='John'>" 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>Last name:</DIV>" 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>" 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 23956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='lastname' value='Smith'>" 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>Email:</DIV>" 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>" 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 24016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' name='email' value='john@example.com'>" 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 24046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<input type='submit' name='reply-send' value='Send'>" 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, LabelsInferredFromDefinitionListRatherThanDivTable) { 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectJohnSmithLabels( 24106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DIV>This is not a label.<BR>" 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<DL>" 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT>" 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " First name:" 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DT>" 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 24206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT>" 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Last name:" 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DT>" 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 24306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT>" 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <SPAN>" 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Email:" 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SPAN>" 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DT>" 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <FONT>" 24406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </FONT>" 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DT></DT>" 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <DD>" 24456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </DD>" 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DL>" 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</DIV>" 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, FillFormMaxLength) { 24536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 24546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' maxlength='5'/>" 24556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' maxlength='7'/>" 24566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' maxlength='9'/>" 24576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 2465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the input element we want to find. 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = web_frame->document().getElementById("firstname"); 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the form that contains the input element. 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 2475effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2476effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form, 2477effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 2478effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form.action); 24825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 5; 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 7; 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 9; 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill the form. 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[0].value = ASCIIToUTF16("Brother"); 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[1].value = ASCIIToUTF16("Jonathan"); 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[2].value = ASCIIToUTF16("brotherj@example.com"); 250846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[0].is_autofilled = true; 250946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[1].is_autofilled = true; 251046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[2].is_autofilled = true; 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillForm(form, input_element); 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the newly-filled form that contains the input element. 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 2516effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2517effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 2518effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 2519effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form2.action); 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Broth"); 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 5; 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Jonatha"); 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 7; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("brotherj@"); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 9; 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test uses negative values of the maxlength attribute for input elements. 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// In this case, the maxlength of the input elements is set to the default 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// maxlength (defined in WebKit.) 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, FillFormNegativeMaxLength) { 25536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 25546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' maxlength='-1'/>" 25556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' maxlength='-10'/>" 25566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' maxlength='-13'/>" 25576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 2565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 25675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the input element we want to find. 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = web_frame->document().getElementById("firstname"); 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the form that contains the input element. 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 2575effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2576effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form, 2577effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 2578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form.action); 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill the form. 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[0].value = ASCIIToUTF16("Brother"); 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[1].value = ASCIIToUTF16("Jonathan"); 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[2].value = ASCIIToUTF16("brotherj@example.com"); 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillForm(form, input_element); 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the newly-filled form that contains the input element. 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 2608effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2609effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 2610effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 2611effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form2.action); 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Brother"); 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 26235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Jonathan"); 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("brotherj@example.com"); 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, FillFormEmptyName) { 26346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 26356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname'/>" 26366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 26376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email'/>" 26386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 2646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the input element we want to find. 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = web_frame->document().getElementById("firstname"); 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the form that contains the input element. 26545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 2656effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2657effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form, 2658effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 2659effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 26615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form.action); 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 26765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill the form. 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[0].value = ASCIIToUTF16("Wyatt"); 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[1].value = ASCIIToUTF16("Earp"); 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[2].value = ASCIIToUTF16("wyatt@example.com"); 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillForm(form, input_element); 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the newly-filled form that contains the input element. 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 2689effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2690effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 2691effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 2692effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form2.action); 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 27055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Wyatt"); 27065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 27075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 27095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Earp"); 27105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 27115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 27135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("wyatt@example.com"); 27145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 27155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, FillFormEmptyFormNames) { 27186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM action='http://buh.com' method='post'>" 27196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname'/>" 27206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='middlename'/>" 27216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 27226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 27235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>" 27246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM action='http://abc.com' method='post'>" 27256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='apple'/>" 27266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='banana'/>" 27276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='cantelope'/>" 27286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 27295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 27305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 27325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 27335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 27355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 2736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 27375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, forms.size()); 27385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the input element we want to find. 27405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = web_frame->document().getElementById("apple"); 27415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 27425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the form that contains the input element. 27445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 27455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 2746effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2747effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form, 2748effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 2749effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 2750a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(base::string16(), form.name); 27515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 27525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://abc.com"), form.action); 27535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 27555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 27565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 27585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 27595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 27605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("apple"); 27625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("banana"); 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("cantelope"); 27705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill the form. 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[0].value = ASCIIToUTF16("Red"); 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[1].value = ASCIIToUTF16("Yellow"); 27765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[2].value = ASCIIToUTF16("Also Yellow"); 277746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[0].is_autofilled = true; 277846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[1].is_autofilled = true; 277946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[2].is_autofilled = true; 27805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillForm(form, input_element); 27815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the newly-filled form that contains the input element. 27835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 27845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 2785effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2786effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 2787effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 2788effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(base::string16(), form2.name); 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://abc.com"), form2.action); 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("apple"); 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Red"); 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("banana"); 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Yellow"); 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("cantelope"); 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Also Yellow"); 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ThreePartPhone) { 28146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Phone:" 28166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone1'>" 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -" 28186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone2'>" 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -" 28206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone3'>" 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ext.:" 28226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='dayphone4'>" 28236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='submit' name='reply-send' value='Send'>" 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFormElement> forms; 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().forms(forms); 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WebFormElementToFormData(forms[0], 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement(), 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::REQUIRE_NONE, 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_VALUE, 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &form, 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(frame->document().url()), form.origin); 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://cnn.com"), form.action); 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(4U, fields.size()); 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("Phone:"); 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone1"); 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("-"); 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone2"); 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("-"); 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone3"); 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("ext.:"); 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone4"); 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, MaxLengthFields) { 28716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Phone:" 28736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' maxlength='3' name='dayphone1'>" 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -" 28756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' maxlength='3' name='dayphone2'>" 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " -" 28776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' maxlength='4' size='5'" 28786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " name='dayphone3'>" 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ext.:" 28806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' maxlength='5' name='dayphone4'>" 28816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' name='default1'>" 28826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='text' maxlength='-1' name='invalid1'>" 28836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <input type='submit' name='reply-send' value='Send'>" 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFormElement> forms; 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().forms(forms); 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WebFormElementToFormData(forms[0], 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement(), 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::REQUIRE_NONE, 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_VALUE, 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &form, 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(frame->document().url()), form.origin); 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://cnn.com"), form.action); 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(6U, fields.size()); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("Phone:"); 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone1"); 29125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 3; 29135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("-"); 29165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone2"); 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 3; 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("-"); 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone3"); 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 4; 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.label = ASCIIToUTF16("ext.:"); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("dayphone4"); 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 5; 29285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); 29295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When unspecified |size|, default is returned. 2931a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.label = base::string16(); 29325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("default1"); 29335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); 29355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When invalid |size|, default is returned. 2937a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.label = base::string16(); 29385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("invalid1"); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test re-creates the experience of typing in a field then selecting a 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// profile from the Autofill suggestions popup. The field that is being typed 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// into should be filled even though it's not technically empty. 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, FillFormNonEmptyField) { 29476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 29486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname'/>" 29496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 29506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email'/>" 29516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 29565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 2959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 29605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 29615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the input element we want to find. 29635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebElement element = web_frame->document().getElementById("firstname"); 29645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement input_element = element.to<WebInputElement>(); 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulate typing by modifying the field value. 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_element.setValue(ASCIIToUTF16("Wy")); 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the form that contains the input element. 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field; 2972effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 2973effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form, 2974effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field, 2975effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form.origin); 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form.action); 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Wy"); 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 2993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 29955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 29965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 2998a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = false; 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Preview the form and verify that the cursor position has been updated. 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[0].value = ASCIIToUTF16("Wyatt"); 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[1].value = ASCIIToUTF16("Earp"); 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields[2].value = ASCIIToUTF16("wyatt@example.com"); 300646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[0].is_autofilled = true; 300746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[1].is_autofilled = true; 300846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) form.fields[2].is_autofilled = true; 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PreviewForm(form, input_element); 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, input_element.selectionStart()); 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, input_element.selectionEnd()); 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fill the form. 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FillForm(form, input_element); 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the newly-filled form that contains the input element. 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 3019effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(input_element, 3020effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 3021effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 3022effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form2.action); 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 30305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Wyatt"); 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Earp"); 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 30405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("email"); 30425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("wyatt@example.com"); 30435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.is_autofilled = true; 30445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 30455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cursor position has been updated. 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, input_element.selectionStart()); 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, input_element.selectionEnd()); 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ClearFormWithNode) { 30525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML( 30536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://buh.com' method='post'>" 30546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='Wyatt'/>" 30556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Earp'/>" 30566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' autocomplete='off' id='noAC' value='one'/>" 30576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='notenabled' disabled='disabled'>" 30586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='month' id='month' value='2012-11'>" 30596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='month' id='month-disabled' value='2012-11'" 30606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " disabled='disabled'>" 30616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TEXTAREA id='textarea'>Apple.</TEXTAREA>" 30626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TEXTAREA id='textarea-disabled' disabled='disabled'>" 30634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " Banana!" 30644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) " </TEXTAREA>" 30656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <TEXTAREA id='textarea-noAC' autocomplete='off'>Carrot?</TEXTAREA>" 30666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 3074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3077f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Set the auto-filled attribute. 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement firstname = 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("firstname").to<WebInputElement>(); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setAutofilled(true); 3081f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement lastname = 3082f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("lastname").to<WebInputElement>(); 3083f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) lastname.setAutofilled(true); 3084f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement month = 3085f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("month").to<WebInputElement>(); 3086f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) month.setAutofilled(true); 3087f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement textarea = 3088f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("textarea").to<WebInputElement>(); 3089f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) textarea.setAutofilled(true); 30905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Set the value of the disabled text input element. 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement notenabled = 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("notenabled").to<WebInputElement>(); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) notenabled.setValue(WebString::fromUTF8("no clear")); 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the form. 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the auto-filled attribute has been turned off. 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(firstname.isAutofilled()); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the form is cleared. 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 31045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 3105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(firstname, 3106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 3107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 3108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form2.action); 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 31141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) ASSERT_EQ(9U, fields2.size()); 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 3121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 3125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("noAC"); 3129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected.value = ASCIIToUTF16("one"); 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.autocomplete_attribute = "off"; 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.autocomplete_attribute = std::string(); // reset 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("notenabled"); 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("no clear"); 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[3]); 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.form_control_type = "month"; 31394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.max_length = 0; 31401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.name = ASCIIToUTF16("month"); 3141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 31424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[4]); 31434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.name = ASCIIToUTF16("month-disabled"); 31451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.value = ASCIIToUTF16("2012-11"); 31461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[5]); 31471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 31481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.form_control_type = "textarea"; 31491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) expected.name = ASCIIToUTF16("textarea"); 3150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 31511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[6]); 31521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 31534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.name = ASCIIToUTF16("textarea-disabled"); 31544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.value = ASCIIToUTF16(" Banana! "); 31551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[7]); 31564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.name = ASCIIToUTF16("textarea-noAC"); 3158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected.value = ASCIIToUTF16("Carrot?"); 31594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.autocomplete_attribute = "off"; 31601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[8]); 31614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected.autocomplete_attribute = std::string(); // reset 31624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cursor position has been updated. 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, firstname.selectionStart()); 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, firstname.selectionEnd()); 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ClearFormWithNodeContainingSelectOne) { 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML( 31706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://buh.com' method='post'>" 31716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='Wyatt'/>" 31726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Earp'/>" 31736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SELECT id='state' name='state'>" 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <OPTION selected>?</OPTION>" 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <OPTION>AA</OPTION>" 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <OPTION>AE</OPTION>" 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " <OPTION>AK</OPTION>" 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SELECT>" 31796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 31805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 3187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Set the auto-filled attribute. 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement firstname = 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("firstname").to<WebInputElement>(); 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setAutofilled(true); 3194f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement lastname = 3195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("lastname").to<WebInputElement>(); 3196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) lastname.setAutofilled(true); 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set the value and auto-filled attribute of the state element. 31991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebSelectElement state = 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("state").to<WebSelectElement>(); 32011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci state.setValue(WebString::fromUTF8("AK")); 32021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci state.setAutofilled(true); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the form. 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the auto-filled attribute has been turned off. 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(firstname.isAutofilled()); 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the form is cleared. 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form2; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData field2; 3213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(FindFormAndFieldForFormControlElement(firstname, 3214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &form2, 3215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch &field2, 3216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch autofill::REQUIRE_NONE)); 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form2.name); 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(web_frame->document().url()), form2.origin); 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://buh.com"), form2.action); 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields2 = form2.fields; 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields2.size()); 32235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 3227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[0]); 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 3233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.value = base::string16(); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[1]); 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("state"); 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("?"); 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "select-one"; 32415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 0; 32425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[2]); 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cursor position has been updated. 32455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, firstname.selectionStart()); 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, firstname.selectionEnd()); 32475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ClearPreviewedFormWithElement) { 32506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 32516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='Wyatt'/>" 32526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 32536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email'/>" 32546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='email' id='email2'/>" 32556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='tel' id='phone'/>" 32566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 32585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 32615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 3264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 32655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the auto-filled attribute. 32685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement firstname = 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("firstname").to<WebInputElement>(); 32705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setAutofilled(true); 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement lastname = 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("lastname").to<WebInputElement>(); 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastname.setAutofilled(true); 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement email = 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("email").to<WebInputElement>(); 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email.setAutofilled(true); 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement email2 = 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("email2").to<WebInputElement>(); 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email2.setAutofilled(true); 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement phone = 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("phone").to<WebInputElement>(); 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phone.setAutofilled(true); 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the suggested values on two of the elements. 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastname.setSuggestedValue(ASCIIToUTF16("Earp")); 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the previewed fields. 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ClearPreviewedFormWithElement(lastname, false)); 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fields with empty suggestions suggestions are not modified. 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(firstname.suggestedValue().isEmpty()); 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(firstname.isAutofilled()); 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the previewed fields are cleared. 32995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lastname.value().isEmpty()); 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lastname.suggestedValue().isEmpty()); 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(lastname.isAutofilled()); 33025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email.value().isEmpty()); 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email.suggestedValue().isEmpty()); 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(email.isAutofilled()); 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email2.value().isEmpty()); 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email2.suggestedValue().isEmpty()); 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(email2.isAutofilled()); 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(phone.value().isEmpty()); 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(phone.suggestedValue().isEmpty()); 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(phone.isAutofilled()); 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify that the cursor position has been updated. 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, lastname.selectionStart()); 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, lastname.selectionEnd()); 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ClearPreviewedFormWithNonEmptyInitiatingNode) { 33186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 33196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='W'/>" 33206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 33216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email'/>" 33226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='email' id='email2'/>" 33236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='tel' id='phone'/>" 33246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 3332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the auto-filled attribute. 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement firstname = 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("firstname").to<WebInputElement>(); 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setAutofilled(true); 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement lastname = 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("lastname").to<WebInputElement>(); 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastname.setAutofilled(true); 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement email = 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("email").to<WebInputElement>(); 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email.setAutofilled(true); 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement email2 = 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("email2").to<WebInputElement>(); 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email2.setAutofilled(true); 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement phone = 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("phone").to<WebInputElement>(); 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phone.setAutofilled(true); 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the suggested values on all of the elements. 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastname.setSuggestedValue(ASCIIToUTF16("Earp")); 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the previewed fields. 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, false)); 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fields with non-empty values are restored. 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(firstname.suggestedValue().isEmpty()); 33665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(firstname.isAutofilled()); 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, firstname.selectionStart()); 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, firstname.selectionEnd()); 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the previewed fields are cleared. 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lastname.value().isEmpty()); 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lastname.suggestedValue().isEmpty()); 33735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(lastname.isAutofilled()); 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email.value().isEmpty()); 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email.suggestedValue().isEmpty()); 33765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(email.isAutofilled()); 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email2.value().isEmpty()); 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email2.suggestedValue().isEmpty()); 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(email2.isAutofilled()); 33805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(phone.value().isEmpty()); 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(phone.suggestedValue().isEmpty()); 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(phone.isAutofilled()); 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, ClearPreviewedFormWithAutofilledInitiatingNode) { 33866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 33876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='W'/>" 33886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 33896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email'/>" 33906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='email' id='email2'/>" 33916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='tel' id='phone'/>" 33926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 3400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the auto-filled attribute. 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement firstname = 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("firstname").to<WebInputElement>(); 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setAutofilled(true); 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement lastname = 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("lastname").to<WebInputElement>(); 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastname.setAutofilled(true); 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement email = 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("email").to<WebInputElement>(); 34125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email.setAutofilled(true); 34135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement email2 = 34145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("email2").to<WebInputElement>(); 34155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email2.setAutofilled(true); 34165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement phone = 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("phone").to<WebInputElement>(); 34185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phone.setAutofilled(true); 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the suggested values on all of the elements. 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setSuggestedValue(ASCIIToUTF16("Wyatt")); 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lastname.setSuggestedValue(ASCIIToUTF16("Earp")); 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) email2.setSuggestedValue(ASCIIToUTF16("wyatt@earp.com")); 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phone.setSuggestedValue(ASCIIToUTF16("650-777-9999")); 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear the previewed fields. 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(ClearPreviewedFormWithElement(firstname, true)); 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fields with non-empty values are restored. 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("W"), firstname.value()); 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(firstname.suggestedValue().isEmpty()); 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(firstname.isAutofilled()); 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, firstname.selectionStart()); 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, firstname.selectionEnd()); 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the previewed fields are cleared. 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lastname.value().isEmpty()); 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lastname.suggestedValue().isEmpty()); 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(lastname.isAutofilled()); 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email.value().isEmpty()); 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email.suggestedValue().isEmpty()); 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(email.isAutofilled()); 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email2.value().isEmpty()); 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(email2.suggestedValue().isEmpty()); 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(email2.isAutofilled()); 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(phone.value().isEmpty()); 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(phone.suggestedValue().isEmpty()); 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(phone.isAutofilled()); 34505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 34515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Autofill's "Clear Form" should clear only autofilled fields 3453f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(FormAutofillTest, ClearOnlyAutofilledFields) { 3454f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Load the form. 3455f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoadHTML( 34566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://buh.com' method='post'>" 34576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='Wyatt'/>" 34586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Earp'/>" 34596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='email' id='email' value='wyatt@earp.com'/>" 34606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='tel' id='phone' value='650-777-9999'/>" 34616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 3462f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) "</FORM>"); 3463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 3465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 3466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3467f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FormCache form_cache; 3468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<FormData> forms; 3469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 3470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 3471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Set the autofilled attribute. 3473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement firstname = 3474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("firstname").to<WebInputElement>(); 3475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) firstname.setAutofilled(false); 3476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement lastname = 3477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("lastname").to<WebInputElement>(); 3478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) lastname.setAutofilled(true); 3479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement email = 3480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("email").to<WebInputElement>(); 3481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) email.setAutofilled(true); 3482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebInputElement phone = 3483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_frame->document().getElementById("phone").to<WebInputElement>(); 3484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) phone.setAutofilled(true); 3485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Clear the fields. 3487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(form_cache.ClearFormWithElement(firstname)); 3488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Verify only autofilled fields are cleared. 3490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Wyatt"), firstname.value()); 3491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(firstname.suggestedValue().isEmpty()); 3492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(firstname.isAutofilled()); 3493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(lastname.value().isEmpty()); 3494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(lastname.suggestedValue().isEmpty()); 3495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(lastname.isAutofilled()); 3496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(email.value().isEmpty()); 3497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(email.suggestedValue().isEmpty()); 3498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(email.isAutofilled()); 3499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(phone.value().isEmpty()); 3500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(phone.suggestedValue().isEmpty()); 3501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_FALSE(phone.isAutofilled()); 3502f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 3503f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, FormWithNodeIsAutofilled) { 35056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://buh.com' method='post'>" 35066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='Wyatt'/>" 35076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname'/>" 35086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email'/>" 35096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='email' id='email2'/>" 35106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='tel' id='phone'/>" 35116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' value='Send'/>" 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* web_frame = GetMainFrame(); 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), web_frame); 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormCache form_cache; 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<FormData> forms; 3519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_cache.ExtractNewForms(*web_frame, &forms); 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 35215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebInputElement firstname = 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_frame->document().getElementById("firstname").to<WebInputElement>(); 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Auto-filled attribute not set yet. 35265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(FormWithElementIsAutofilled(firstname)); 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the auto-filled attribute. 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstname.setAutofilled(true); 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(FormWithElementIsAutofilled(firstname)); 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If we have multiple labels per id, the labels concatenated into label string. 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, MultipleLabelsPerElement) { 3536a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> labels, names, values; 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("First Name:")); 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("firstname")); 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("John")); 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Last Name:")); 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("lastname")); 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("Smith")); 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels.push_back(ASCIIToUTF16("Email: xxx@yyy.com")); 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) names.push_back(ASCIIToUTF16("email")); 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) values.push_back(ASCIIToUTF16("john@example.com")); 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectLabels( 35516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<FORM name='TestForm' action='http://cnn.com' method='post'>" 35526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='firstname'> First Name: </LABEL>" 35536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='firstname'></LABEL>" 35546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 35556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='lastname'></LABEL>" 35566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='lastname'> Last Name: </LABEL>" 35576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 35586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='email'> Email: </LABEL>" 35596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <LABEL for='email'> xxx@yyy.com </LABEL>" 35606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='email' value='john@example.com'/>" 35616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>", 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) labels, names, values); 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FormAutofillTest, ClickElement) { 35676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<BUTTON id='link'>Button</BUTTON>" 35686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) "<BUTTON name='button'>Button</BUTTON>"); 35692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebFrame* frame = GetMainFrame(); 35702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 35712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Successful retrieval by id. 35732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autofill::WebElementDescriptor clicker; 35742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clicker.retrieval_method = autofill::WebElementDescriptor::ID; 35752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clicker.descriptor = "link"; 35762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ClickElement(frame->document(), clicker)); 35772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Successful retrieval by css selector. 35792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clicker.retrieval_method = autofill::WebElementDescriptor::CSS_SELECTOR; 35806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clicker.descriptor = "button[name='button']"; 35812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(ClickElement(frame->document(), clicker)); 35822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unsuccessful retrieval due to invalid CSS selector. 35842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clicker.descriptor = "^*&"; 35852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ClickElement(frame->document(), clicker)); 35862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unsuccessful retrieval because element does not exist. 35882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) clicker.descriptor = "#junk"; 35892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ClickElement(frame->document(), clicker)); 35902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 35912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutofillTest, SelectOneAsText) { 35936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LoadHTML("<FORM name='TestForm' action='http://cnn.com' method='post'>" 35946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='firstname' value='John'/>" 35956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='text' id='lastname' value='Smith'/>" 35966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <SELECT id='country'>" 35976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='AF'>Afghanistan</OPTION>" 35986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='AL'>Albania</OPTION>" 35996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <OPTION value='DZ'>Algeria</OPTION>" 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " </SELECT>" 36016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) " <INPUT type='submit' name='reply-send' value='Send'/>" 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</FORM>"); 36035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFrame* frame = GetMainFrame(); 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_NE(static_cast<WebFrame*>(NULL), frame); 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set the value of the select-one. 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebSelectElement select_element = 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().getElementById("country").to<WebSelectElement>(); 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) select_element.setValue(WebString::fromUTF8("AL")); 36115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebVector<WebFormElement> forms; 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame->document().forms(forms); 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, forms.size()); 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormData form; 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extract the country select-one value as text. 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WebFormElementToFormData( 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) forms[0], WebFormControlElement(), autofill::REQUIRE_NONE, 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<autofill::ExtractMask>( 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_VALUE | autofill::EXTRACT_OPTION_TEXT), 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &form, NULL)); 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(frame->document().url()), form.origin); 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://cnn.com"), form.action); 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::vector<FormFieldData>& fields = form.fields; 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData expected; 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("John"); 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 36385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 36425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("country"); 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Albania"); 36475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "select-one"; 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 0; 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form.fields.clear(); 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Extract the country select-one value as value. 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(WebFormElementToFormData(forms[0], 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebFormControlElement(), 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::REQUIRE_NONE, 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::EXTRACT_VALUE, 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &form, 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL)); 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("TestForm"), form.name); 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL(frame->document().url()), form.origin); 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GURL("http://cnn.com"), form.action); 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, fields.size()); 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("firstname"); 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("John"); 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("lastname"); 36725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("Smith"); 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "text"; 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = WebInputElement::defaultMaxLength(); 36755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.name = ASCIIToUTF16("country"); 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.value = ASCIIToUTF16("AL"); 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.form_control_type = "select-one"; 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected.max_length = 0; 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 3684