15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 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) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_test.h" 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/content/common/autofill_messages.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURLError.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormElement.h" 14a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString; 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebURLError; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ChromeRenderViewTest FormAutocompleteTest; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that submitting a form generates a FormSubmitted message 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with the form fields. 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutocompleteTest, NormalFormSubmit) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load a form. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML("<html><form id='myForm'><input name='fname' value='Rick'/>" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<input name='lname' value='Deckard'/></form></html>"); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Submit the form. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteJavaScript("document.getElementById('myForm').submit();"); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillHostMsg_FormSubmitted::ID); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(message != NULL); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tuple also includes a timestamp, which is ignored. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tuple2<FormData, base::TimeTicks> forms; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillHostMsg_FormSubmitted::Read(message, &forms); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(2U, forms.a.fields.size()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData& form_field = forms.a.fields[0]; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WebString("fname"), form_field.name); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WebString("Rick"), form_field.value); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) form_field = forms.a.fields[1]; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WebString("lname"), form_field.name); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WebString("Deckard"), form_field.value); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that submitting a form that has autocomplete="off" generates a 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// FormSubmitted message. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutocompleteTest, AutoCompleteOffFormSubmit) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load a form. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML("<html><form id='myForm' autocomplete='off'>" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<input name='fname' value='Rick'/>" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<input name='lname' value='Deckard'/>" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</form></html>"); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Submit the form. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteJavaScript("document.getElementById('myForm').submit();"); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AutofillHostMsg_FormSubmitted::ID); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(message != NULL); 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The tuple also includes a timestamp, which is ignored. 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Tuple2<FormData, base::TimeTicks> forms; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AutofillHostMsg_FormSubmitted::Read(message, &forms); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2U, forms.a.fields.size()); 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FormFieldData& form_field = forms.a.fields[0]; 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("fname"), form_field.name); 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("Rick"), form_field.value); 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) form_field = forms.a.fields[1]; 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("lname"), form_field.name); 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("Deckard"), form_field.value); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Tests that fields with autocomplete off are submitted. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutocompleteTest, AutoCompleteOffInputSubmit) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Load a form. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML("<html><form id='myForm'>" 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<input name='fname' value='Rick'/>" 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<input name='lname' value='Deckard' autocomplete='off'/>" 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "</form></html>"); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Submit the form. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteJavaScript("document.getElementById('myForm').submit();"); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillHostMsg_FormSubmitted::ID); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(message != NULL); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The tuple also includes a timestamp, which is ignored. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Tuple2<FormData, base::TimeTicks> forms; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillHostMsg_FormSubmitted::Read(message, &forms); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2U, forms.a.fields.size()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormFieldData& form_field = forms.a.fields[0]; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WebString("fname"), form_field.name); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WebString("Rick"), form_field.value); 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) form_field = forms.a.fields[1]; 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("lname"), form_field.name); 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("Deckard"), form_field.value); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that submitting a form that has been dynamically set as autocomplete 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// off generates a FormSubmitted message. 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Note: We previously did the opposite, for bug http://crbug.com/36520 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormAutocompleteTest, DynamicAutoCompleteOffFormSubmit) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LoadHTML("<html><form id='myForm'><input name='fname' value='Rick'/>" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "<input name='lname' value='Deckard'/></form></html>"); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebElement element = 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) GetMainFrame()->document().getElementById(blink::WebString("myForm")); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(element.isNull()); 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFormElement form = element.to<blink::WebFormElement>(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(form.autoComplete()); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Dynamically mark the form as autocomplete off. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteJavaScript("document.getElementById('myForm')." 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "setAttribute('autocomplete', 'off');"); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(form.autoComplete()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Submit the form. 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExecuteJavaScript("document.getElementById('myForm').submit();"); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ProcessPendingMessages(); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching( 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AutofillHostMsg_FormSubmitted::ID); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(message != NULL); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The tuple also includes a timestamp, which is ignored. 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Tuple2<FormData, base::TimeTicks> forms; 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AutofillHostMsg_FormSubmitted::Read(message, &forms); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_EQ(2U, forms.a.fields.size()); 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FormFieldData& form_field = forms.a.fields[0]; 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("fname"), form_field.name); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("Rick"), form_field.value); 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) form_field = forms.a.fields[1]; 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("lname"), form_field.name); 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(WebString("Deckard"), form_field.value); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 155