Home | History | Annotate | Download | only in autofill
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "base/time/time.h"
      6 #include "chrome/test/base/chrome_render_view_test.h"
      7 #include "components/autofill/content/common/autofill_messages.h"
      8 #include "components/autofill/core/common/form_data.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 #include "third_party/WebKit/public/platform/WebString.h"
     11 #include "third_party/WebKit/public/platform/WebURLError.h"
     12 #include "third_party/WebKit/public/web/WebDocument.h"
     13 #include "third_party/WebKit/public/web/WebFormElement.h"
     14 
     15 using blink::WebFrame;
     16 using blink::WebString;
     17 using blink::WebURLError;
     18 
     19 typedef ChromeRenderViewTest FormAutocompleteTest;
     20 
     21 namespace autofill {
     22 
     23 // Tests that submitting a form generates a FormSubmitted message
     24 // with the form fields.
     25 TEST_F(FormAutocompleteTest, NormalFormSubmit) {
     26   // Load a form.
     27   LoadHTML("<html><form id='myForm'><input name='fname' value='Rick'/>"
     28            "<input name='lname' value='Deckard'/></form></html>");
     29 
     30   // Submit the form.
     31   ExecuteJavaScript("document.getElementById('myForm').submit();");
     32   ProcessPendingMessages();
     33 
     34   const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
     35       AutofillHostMsg_FormSubmitted::ID);
     36   ASSERT_TRUE(message != NULL);
     37 
     38   // The tuple also includes a timestamp, which is ignored.
     39   Tuple2<FormData, base::TimeTicks> forms;
     40   AutofillHostMsg_FormSubmitted::Read(message, &forms);
     41   ASSERT_EQ(2U, forms.a.fields.size());
     42 
     43   FormFieldData& form_field = forms.a.fields[0];
     44   EXPECT_EQ(WebString("fname"), form_field.name);
     45   EXPECT_EQ(WebString("Rick"), form_field.value);
     46 
     47   form_field = forms.a.fields[1];
     48   EXPECT_EQ(WebString("lname"), form_field.name);
     49   EXPECT_EQ(WebString("Deckard"), form_field.value);
     50 }
     51 
     52 // Tests that submitting a form that has autocomplete="off" does not generate a
     53 // FormSubmitted message.
     54 TEST_F(FormAutocompleteTest, AutoCompleteOffFormSubmit) {
     55   // Load a form.
     56   LoadHTML("<html><form id='myForm' autocomplete='off'>"
     57            "<input name='fname' value='Rick'/>"
     58            "<input name='lname' value='Deckard'/>"
     59            "</form></html>");
     60 
     61   // Submit the form.
     62   ExecuteJavaScript("document.getElementById('myForm').submit();");
     63   ProcessPendingMessages();
     64 
     65   // No FormSubmitted message should have been sent.
     66   EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
     67       AutofillHostMsg_FormSubmitted::ID));
     68 }
     69 
     70 // Tests that fields with autocomplete off are not submitted.
     71 TEST_F(FormAutocompleteTest, AutoCompleteOffInputSubmit) {
     72   // Load a form.
     73   LoadHTML("<html><form id='myForm'>"
     74            "<input name='fname' value='Rick'/>"
     75            "<input name='lname' value='Deckard' autocomplete='off'/>"
     76            "</form></html>");
     77 
     78   // Submit the form.
     79   ExecuteJavaScript("document.getElementById('myForm').submit();");
     80   ProcessPendingMessages();
     81 
     82   // No FormSubmitted message should have been sent.
     83   const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
     84       AutofillHostMsg_FormSubmitted::ID);
     85   ASSERT_TRUE(message != NULL);
     86 
     87   // The tuple also includes a timestamp, which is ignored.
     88   Tuple2<FormData, base::TimeTicks> forms;
     89   AutofillHostMsg_FormSubmitted::Read(message, &forms);
     90   ASSERT_EQ(1U, forms.a.fields.size());
     91 
     92   FormFieldData& form_field = forms.a.fields[0];
     93   EXPECT_EQ(WebString("fname"), form_field.name);
     94   EXPECT_EQ(WebString("Rick"), form_field.value);
     95 }
     96 
     97 // Tests that submitting a form that has been dynamically set as autocomplete
     98 // off does not generate a FormSubmitted message.
     99 // http://crbug.com/36520
    100 TEST_F(FormAutocompleteTest, DynamicAutoCompleteOffFormSubmit) {
    101   LoadHTML("<html><form id='myForm'><input name='fname' value='Rick'/>"
    102            "<input name='lname' value='Deckard'/></form></html>");
    103 
    104   blink::WebElement element =
    105       GetMainFrame()->document().getElementById(blink::WebString("myForm"));
    106   ASSERT_FALSE(element.isNull());
    107   blink::WebFormElement form = element.to<blink::WebFormElement>();
    108   EXPECT_TRUE(form.autoComplete());
    109 
    110   // Dynamically mark the form as autocomplete off.
    111   ExecuteJavaScript("document.getElementById('myForm')."
    112                     "setAttribute('autocomplete', 'off');");
    113   ProcessPendingMessages();
    114   EXPECT_FALSE(form.autoComplete());
    115 
    116   // Submit the form.
    117   ExecuteJavaScript("document.getElementById('myForm').submit();");
    118   ProcessPendingMessages();
    119 
    120   // No FormSubmitted message should have been sent.
    121   EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
    122       AutofillHostMsg_FormSubmitted::ID));
    123 }
    124 
    125 }  // namespace autofill
    126