• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "chrome/browser/chromeos/input_method/textinput_test_helper.h"
6 #include "chrome/browser/ui/browser.h"
7 #include "chrome/browser/ui/browser_window.h"
8 #include "chrome/browser/ui/tabs/tab_strip_model.h"
9 #include "chrome/test/base/in_process_browser_test.h"
10 #include "chrome/test/base/interactive_test_utils.h"
11 #include "content/public/browser/render_view_host.h"
12 #include "content/public/browser/web_contents.h"
13 #include "content/public/test/browser_test_utils.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 
16 namespace chromeos {
17 
18 namespace {
19 struct InputTypeExpectation {
20   std::string node_id;
21   ui::TextInputType type;
22 };
23 }  // namespace
24 
25 typedef TextInputTestBase TextInput_TextInputStateChangedTest;
26 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,SwitchToPasswordFieldTest)27 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
28                        SwitchToPasswordFieldTest) {
29   TextInputTestHelper helper;
30   GURL url = ui_test_utils::GetTestUrl(
31       base::FilePath(FILE_PATH_LITERAL("textinput")),
32       base::FilePath(FILE_PATH_LITERAL("ime_enable_disable_test.html")));
33   ui_test_utils::NavigateToURL(browser(), url);
34   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
35 
36   content::WebContents* tab =
37       browser()->tab_strip_model()->GetActiveWebContents();
38 
39   bool worker_finished = false;
40   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
41       tab,
42       "window.domAutomationController.send(text01_focus());",
43       &worker_finished));
44   EXPECT_TRUE(worker_finished);
45   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT);
46   EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType());
47 
48   worker_finished = false;
49   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
50       tab,
51       "window.domAutomationController.send(password01_focus());",
52       &worker_finished));
53   EXPECT_TRUE(worker_finished);
54   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD);
55   EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType());
56 }
57 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,FocusOnLoadTest)58 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, FocusOnLoadTest) {
59   TextInputTestHelper helper;
60   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
61 
62   GURL url = ui_test_utils::GetTestUrl(
63       base::FilePath(FILE_PATH_LITERAL("textinput")),
64       base::FilePath(FILE_PATH_LITERAL("focus_input_on_load.html")));
65   ui_test_utils::NavigateToURL(browser(), url);
66 
67   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT);
68   EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType());
69 }
70 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,FocusOnContentJSTest)71 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
72                        FocusOnContentJSTest) {
73   TextInputTestHelper helper;
74   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
75 
76   GURL url = ui_test_utils::GetTestUrl(
77       base::FilePath(FILE_PATH_LITERAL("textinput")),
78       base::FilePath(FILE_PATH_LITERAL("focus_input_on_content_js.html")));
79   ui_test_utils::NavigateToURL(browser(), url);
80 
81   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT);
82   EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType());
83 }
84 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,MouseClickChange)85 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
86                        MouseClickChange) {
87   TextInputTestHelper helper;
88   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
89 
90   GURL url = ui_test_utils::GetTestUrl(
91       base::FilePath(FILE_PATH_LITERAL("textinput")),
92       base::FilePath(FILE_PATH_LITERAL("focus_input_with_mouse_click.html")));
93   ui_test_utils::NavigateToURL(browser(), url);
94 
95   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
96 
97   content::WebContents* tab =
98       browser()->tab_strip_model()->GetActiveWebContents();
99   content::WaitForLoadStop(tab);
100 
101   ASSERT_TRUE(helper.ClickElement("text_id", tab));
102   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT);
103   EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType());
104 
105   ASSERT_TRUE(helper.ClickElement("password_id", tab));
106   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD);
107   EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType());
108 }
109 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,FocusChangeOnFocus)110 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
111                        FocusChangeOnFocus) {
112   TextInputTestHelper helper;
113   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
114 
115   GURL url = ui_test_utils::GetTestUrl(
116       base::FilePath(FILE_PATH_LITERAL("textinput")),
117       base::FilePath(FILE_PATH_LITERAL("focus_input_on_anothor_focus.html")));
118   ui_test_utils::NavigateToURL(browser(), url);
119 
120   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
121 
122   content::WebContents* tab =
123       browser()->tab_strip_model()->GetActiveWebContents();
124 
125   std::string coordinate;
126   ASSERT_TRUE(content::ExecuteScript(
127           tab,
128           "document.getElementById('text_id').focus();"));
129 
130   // Expects PASSWORD text input type because javascript will chagne the focus
131   // to password field in #text_id's onfocus handler.
132   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD);
133   EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType());
134 
135   ASSERT_TRUE(helper.ClickElement("text_id", tab));
136   // Expects PASSWORD text input type because javascript will chagne the focus
137   // to password field in #text_id's onfocus handler.
138   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD);
139   EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType());
140 }
141 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,NodeEliminationCase)142 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
143                        NodeEliminationCase) {
144   TextInputTestHelper helper;
145   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
146 
147   GURL url = ui_test_utils::GetTestUrl(
148       base::FilePath(FILE_PATH_LITERAL("textinput")),
149       base::FilePath(FILE_PATH_LITERAL("simple_textinput.html")));
150   ui_test_utils::NavigateToURL(browser(), url);
151 
152   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
153 
154   content::WebContents* tab =
155       browser()->tab_strip_model()->GetActiveWebContents();
156 
157   ASSERT_TRUE(content::ExecuteScript(
158           tab,
159           "document.getElementById('text_id').focus();"));
160   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT);
161   EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType());
162 
163   // Changing text input type to password.
164   ASSERT_TRUE(content::ExecuteScript(
165           tab,
166           "document.body.removeChild(document.getElementById('text_id'));"));
167   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_NONE);
168   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
169 }
170 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,TextInputTypeChangedByJavaScript)171 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
172                        TextInputTypeChangedByJavaScript) {
173   TextInputTestHelper helper;
174   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
175 
176   GURL url = ui_test_utils::GetTestUrl(
177       base::FilePath(FILE_PATH_LITERAL("textinput")),
178       base::FilePath(FILE_PATH_LITERAL("simple_textinput.html")));
179   ui_test_utils::NavigateToURL(browser(), url);
180 
181   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
182 
183   content::WebContents* tab =
184       browser()->tab_strip_model()->GetActiveWebContents();
185 
186   ASSERT_TRUE(content::ExecuteScript(
187           tab,
188           "document.getElementById('text_id').focus();"));
189   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT);
190   EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType());
191 
192   // Changing text input type to password.
193   ASSERT_TRUE(content::ExecuteScript(
194           tab,
195           "document.getElementById('text_id').type = 'password';"));
196   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD);
197   EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType());
198 }
199 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,ChangingToContentEditableCase)200 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
201                        ChangingToContentEditableCase) {
202   TextInputTestHelper helper;
203   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
204 
205   GURL url = ui_test_utils::GetTestUrl(
206       base::FilePath(FILE_PATH_LITERAL("textinput")),
207       base::FilePath(FILE_PATH_LITERAL("content_editable.html")));
208   ui_test_utils::NavigateToURL(browser(), url);
209   content::WebContents* tab =
210       browser()->tab_strip_model()->GetActiveWebContents();
211 
212   helper.ClickElement("anchor_id", tab);
213   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE);
214   EXPECT_EQ(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE, helper.GetTextInputType());
215 
216 
217   // Disabling content editable, then expecting TEXT_INPUT_TYPE_NONE.
218   ASSERT_TRUE(content::ExecuteScript(
219           tab,
220           "document.getElementById('anchor_id').contentEditable = false;"));
221   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_NONE);
222   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
223 
224   // Then re-enabling content editable, then expecting CONTENT_EDITABLE.
225   ASSERT_TRUE(content::ExecuteScript(
226           tab,
227           "document.getElementById('anchor_id').contentEditable = true;"));
228   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE);
229   EXPECT_EQ(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE, helper.GetTextInputType());
230 }
231 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,SwitchingAllTextInputTest)232 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
233                        SwitchingAllTextInputTest) {
234   TextInputTestHelper helper;
235   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
236 
237   GURL url = ui_test_utils::GetTestUrl(
238       base::FilePath(FILE_PATH_LITERAL("textinput")),
239       base::FilePath(FILE_PATH_LITERAL("all_input_node.html")));
240   ui_test_utils::NavigateToURL(browser(), url);
241   content::WebContents* tab =
242       browser()->tab_strip_model()->GetActiveWebContents();
243 
244   InputTypeExpectation expectations[] = {
245     { "text_id", ui::TEXT_INPUT_TYPE_TEXT },
246     { "password_id", ui::TEXT_INPUT_TYPE_PASSWORD },
247     { "search_id", ui::TEXT_INPUT_TYPE_SEARCH },
248     { "email_id", ui::TEXT_INPUT_TYPE_EMAIL },
249     { "number_id", ui::TEXT_INPUT_TYPE_NUMBER },
250     { "tel_id", ui::TEXT_INPUT_TYPE_TELEPHONE },
251     { "url_id", ui::TEXT_INPUT_TYPE_URL },
252     { "textarea_id", ui::TEXT_INPUT_TYPE_TEXT_AREA },
253     { "contenteditable_id", ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE },
254   };  // The order should be same as tab order in all_input_node.html.
255 
256   for (size_t i = 0; i < arraysize(expectations); ++i) {
257     content::SimulateKeyPress(tab, ui::VKEY_TAB, false, false, false, false);
258 
259     helper.WaitForTextInputStateChanged(expectations[i].type);
260     EXPECT_EQ(expectations[i].type, helper.GetTextInputType());
261   }
262 
263   for (size_t i = 0; i < arraysize(expectations); ++i) {
264     helper.ClickElement(expectations[i].node_id, tab);
265 
266     helper.WaitForTextInputStateChanged(expectations[i].type);
267     EXPECT_EQ(expectations[i].type, helper.GetTextInputType());
268   }
269 }
270 
IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,OpenNewTabOnloadTest)271 IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest,
272                        OpenNewTabOnloadTest) {
273   TextInputTestHelper helper;
274   EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
275 
276   GURL base_url = ui_test_utils::GetTestUrl(
277       base::FilePath(FILE_PATH_LITERAL("textinput")),
278       base::FilePath(FILE_PATH_LITERAL("all_input_node.html")));
279   ui_test_utils::NavigateToURL(browser(), base_url);
280   content::WebContents* base_tab =
281       browser()->tab_strip_model()->GetActiveWebContents();
282 
283   // Focus to password field.
284   helper.ClickElement("password_id", base_tab);
285   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD);
286   EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType());
287 
288   // Then opening new foreground tab and wait new TextInputType.
289   GURL new_url = ui_test_utils::GetTestUrl(
290       base::FilePath(FILE_PATH_LITERAL("textinput")),
291       base::FilePath(FILE_PATH_LITERAL("focus_input_on_load.html")));
292   ui_test_utils::NavigateToURLWithDisposition(browser(),
293                                               new_url,
294                                               NEW_FOREGROUND_TAB,
295                                               0);
296   content::WebContents* new_tab =
297       browser()->tab_strip_model()->GetActiveWebContents();
298   EXPECT_NE(base_tab, new_tab);
299 
300   helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT);
301   EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType());
302 }
303 
304 } // namespace chromeos
305