password_form_conversion_utils_browsertest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
1// Copyright 2013 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/strings/string16.h"
6#include "base/strings/utf_string_conversions.h"
7#include "components/autofill/content/renderer/password_form_conversion_utils.h"
8#include "components/autofill/core/common/password_form.h"
9#include "content/public/test/render_view_test.h"
10#include "testing/gtest/include/gtest/gtest.h"
11#include "third_party/WebKit/public/platform/WebVector.h"
12#include "third_party/WebKit/public/web/WebDocument.h"
13#include "third_party/WebKit/public/web/WebFormElement.h"
14#include "third_party/WebKit/public/web/WebLocalFrame.h"
15
16using blink::WebFormElement;
17using blink::WebFrame;
18using blink::WebVector;
19
20namespace autofill {
21namespace {
22
23class PasswordFormConversionUtilsTest : public content::RenderViewTest {
24 public:
25  PasswordFormConversionUtilsTest() : content::RenderViewTest() {}
26  virtual ~PasswordFormConversionUtilsTest() {}
27
28 private:
29  DISALLOW_COPY_AND_ASSIGN(PasswordFormConversionUtilsTest);
30};
31
32}  // namespace
33
34TEST_F(PasswordFormConversionUtilsTest, ValidWebFormElementToPasswordForm) {
35  LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
36           " <INPUT type=\"text\" name=\"username\" "
37               " id=\"username\" value=\"johnsmith\"/>"
38           " <INPUT type=\"submit\" name=\"submit\" value=\"Submit\"/>"
39           " <INPUT type=\"password\" name=\"password\" id=\"password\" "
40               " value=\"secret\"/>"
41           "</FORM>");
42
43  WebFrame* frame = GetMainFrame();
44  ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
45
46  WebVector<WebFormElement> forms;
47  frame->document().forms(forms);
48  ASSERT_EQ(1U, forms.size());
49
50  scoped_ptr<PasswordForm> password_form = CreatePasswordForm(forms[0]);
51  ASSERT_NE(static_cast<PasswordForm*>(NULL), password_form.get());
52
53  EXPECT_EQ("data:", password_form->signon_realm);
54  EXPECT_EQ(GURL("http://cnn.com"), password_form->action);
55  EXPECT_EQ(base::UTF8ToUTF16("username"), password_form->username_element);
56  EXPECT_EQ(base::UTF8ToUTF16("johnsmith"), password_form->username_value);
57  EXPECT_EQ(base::UTF8ToUTF16("password"), password_form->password_element);
58  EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value);
59  EXPECT_EQ(PasswordForm::SCHEME_HTML, password_form->scheme);
60  EXPECT_FALSE(password_form->ssl_valid);
61  EXPECT_FALSE(password_form->preferred);
62  EXPECT_FALSE(password_form->blacklisted_by_user);
63  EXPECT_EQ(PasswordForm::TYPE_MANUAL, password_form->type);
64}
65
66TEST_F(PasswordFormConversionUtilsTest, InvalidWebFormElementToPasswordForm) {
67  LoadHTML("<FORM name=\"TestForm\" action=\"invalid\" method=\"post\">"
68           " <INPUT type=\"text\" name=\"username\" "
69               " id=\"username\" value=\"johnsmith\"/>"
70           " <INPUT type=\"submit\" name=\"submit\" value=\"Submit\"/>"
71           " <INPUT type=\"password\" name=\"password\" id=\"password\" "
72               " value=\"secret\"/>"
73           "</FORM>");
74
75  WebFrame* frame = GetMainFrame();
76  ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
77
78  WebVector<WebFormElement> forms;
79  frame->document().forms(forms);
80  ASSERT_EQ(1U, forms.size());
81
82  scoped_ptr<PasswordForm> password_form = CreatePasswordForm(forms[0]);
83  EXPECT_EQ(static_cast<PasswordForm*>(NULL), password_form.get());
84}
85
86TEST_F(PasswordFormConversionUtilsTest,
87       WebFormWithMultipleUseNameAndPassWordFieldsToPasswordForm) {
88  LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
89           " <INPUT type=\"text\" name=\"username1\" "
90               " id=\"username1\" value=\"John\"/>"
91           " <INPUT type=\"password\" name=\"password1\" id=\"password1\" "
92               " value=\"encrypted\"/>"
93           " <INPUT type=\"text\" name=\"username2\" "
94               " id=\"username2\" value=\"Smith\"/>"
95           " <INPUT type=\"password\" name=\"password2\" id=\"password2\" "
96               " value=\"secret\"/>"
97           " <INPUT type=\"text\" name=\"username3\" "
98               " id=\"username3\" value=\"JohnSmith\"/>"
99           " <INPUT type=\"password\" name=\"password3\" id=\"password3\" "
100               " value=\"secret\"/>"
101           " <INPUT type=\"submit\" name=\"submit\" value=\"Submit\"/>"
102           "</FORM>");
103
104  WebFrame* frame = GetMainFrame();
105  ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
106
107  WebVector<WebFormElement> forms;
108  frame->document().forms(forms);
109  ASSERT_EQ(1U, forms.size());
110
111  scoped_ptr<PasswordForm> password_form = CreatePasswordForm(forms[0]);
112  ASSERT_NE(static_cast<PasswordForm*>(NULL), password_form.get());
113
114  EXPECT_EQ("data:", password_form->signon_realm);
115  EXPECT_EQ(GURL("http://cnn.com"), password_form->action);
116  EXPECT_EQ(base::UTF8ToUTF16("username1"), password_form->username_element);
117  EXPECT_EQ(base::UTF8ToUTF16("John"), password_form->username_value);
118  EXPECT_EQ(base::UTF8ToUTF16("password2"), password_form->password_element);
119  EXPECT_EQ(base::UTF8ToUTF16("secret"), password_form->password_value);
120  EXPECT_EQ(base::UTF8ToUTF16("password1"),
121            password_form->old_password_element);
122  EXPECT_EQ(base::UTF8ToUTF16("encrypted"), password_form->old_password_value);
123  EXPECT_EQ(base::UTF8ToUTF16("Smith"),
124            password_form->other_possible_usernames[0]);
125  EXPECT_EQ(base::UTF8ToUTF16("JohnSmith"),
126            password_form->other_possible_usernames[1]);
127  EXPECT_EQ(PasswordForm::SCHEME_HTML, password_form->scheme);
128  EXPECT_FALSE(password_form->ssl_valid);
129  EXPECT_FALSE(password_form->preferred);
130  EXPECT_FALSE(password_form->blacklisted_by_user);
131  EXPECT_EQ(PasswordForm::TYPE_MANUAL, password_form->type);
132}
133
134TEST_F(PasswordFormConversionUtilsTest,
135       WebFormwithThreeDifferentPasswordsToPasswordForm) {
136  LoadHTML("<FORM name=\"TestForm\" action=\"http://cnn.com\" method=\"post\">"
137           " <INPUT type=\"text\" name=\"username\" "
138               " id=\"username\" value=\"John\"/>"
139           " <INPUT type=\"password\" name=\"password1\" id=\"password1\" "
140               " value=\"secret\"/>"
141           " <INPUT type=\"password\" name=\"password2\" id=\"password2\" "
142               " value=\"encrypted\"/>"
143           " <INPUT type=\"password\" name=\"password3\" id=\"password3\" "
144               " value=\"key\"/>"
145           " <INPUT type=\"submit\" name=\"submit\" value=\"Submit\"/>"
146           "</FORM>");
147
148  WebFrame* frame = GetMainFrame();
149  ASSERT_NE(static_cast<WebFrame*>(NULL), frame);
150
151  WebVector<WebFormElement> forms;
152  frame->document().forms(forms);
153  ASSERT_EQ(1U, forms.size());
154
155  scoped_ptr<PasswordForm> password_form = CreatePasswordForm(forms[0]);
156  ASSERT_EQ(static_cast<PasswordForm*>(NULL), password_form.get());
157}
158
159}  // namespace autofill
160