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