| // Copyright 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/chromeos/input_method/textinput_test_helper.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/interactive_test_utils.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace chromeos { |
| |
| namespace { |
| struct InputTypeExpectation { |
| std::string node_id; |
| ui::TextInputType type; |
| }; |
| } // namespace |
| |
| typedef TextInputTestBase TextInput_TextInputStateChangedTest; |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| SwitchToPasswordFieldTest) { |
| TextInputTestHelper helper; |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("ime_enable_disable_test.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| content::WebContents* tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| bool worker_finished = false; |
| ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
| tab, |
| "window.domAutomationController.send(text01_focus());", |
| &worker_finished)); |
| EXPECT_TRUE(worker_finished); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType()); |
| |
| worker_finished = false; |
| ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
| tab, |
| "window.domAutomationController.send(password01_focus());", |
| &worker_finished)); |
| EXPECT_TRUE(worker_finished); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, FocusOnLoadTest) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("focus_input_on_load.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| FocusOnContentJSTest) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("focus_input_on_content_js.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| MouseClickChange) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("focus_input_with_mouse_click.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| content::WebContents* tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| content::WaitForLoadStop(tab); |
| |
| ASSERT_TRUE(helper.ClickElement("text_id", tab)); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType()); |
| |
| ASSERT_TRUE(helper.ClickElement("password_id", tab)); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| FocusChangeOnFocus) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("focus_input_on_anothor_focus.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| content::WebContents* tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| std::string coordinate; |
| ASSERT_TRUE(content::ExecuteScript( |
| tab, |
| "document.getElementById('text_id').focus();")); |
| |
| // Expects PASSWORD text input type because javascript will chagne the focus |
| // to password field in #text_id's onfocus handler. |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType()); |
| |
| ASSERT_TRUE(helper.ClickElement("text_id", tab)); |
| // Expects PASSWORD text input type because javascript will chagne the focus |
| // to password field in #text_id's onfocus handler. |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| NodeEliminationCase) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("simple_textinput.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| content::WebContents* tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| ASSERT_TRUE(content::ExecuteScript( |
| tab, |
| "document.getElementById('text_id').focus();")); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType()); |
| |
| // Changing text input type to password. |
| ASSERT_TRUE(content::ExecuteScript( |
| tab, |
| "document.body.removeChild(document.getElementById('text_id'));")); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_NONE); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| TextInputTypeChangedByJavaScript) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("simple_textinput.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| content::WebContents* tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| ASSERT_TRUE(content::ExecuteScript( |
| tab, |
| "document.getElementById('text_id').focus();")); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType()); |
| |
| // Changing text input type to password. |
| ASSERT_TRUE(content::ExecuteScript( |
| tab, |
| "document.getElementById('text_id').type = 'password';")); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| ChangingToContentEditableCase) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("content_editable.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| content::WebContents* tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| helper.ClickElement("anchor_id", tab); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE, helper.GetTextInputType()); |
| |
| |
| // Disabling content editable, then expecting TEXT_INPUT_TYPE_NONE. |
| ASSERT_TRUE(content::ExecuteScript( |
| tab, |
| "document.getElementById('anchor_id').contentEditable = false;")); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_NONE); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| // Then re-enabling content editable, then expecting CONTENT_EDITABLE. |
| ASSERT_TRUE(content::ExecuteScript( |
| tab, |
| "document.getElementById('anchor_id').contentEditable = true;")); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE, helper.GetTextInputType()); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| SwitchingAllTextInputTest) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("all_input_node.html"))); |
| ui_test_utils::NavigateToURL(browser(), url); |
| content::WebContents* tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| InputTypeExpectation expectations[] = { |
| { "text_id", ui::TEXT_INPUT_TYPE_TEXT }, |
| { "password_id", ui::TEXT_INPUT_TYPE_PASSWORD }, |
| { "search_id", ui::TEXT_INPUT_TYPE_SEARCH }, |
| { "email_id", ui::TEXT_INPUT_TYPE_EMAIL }, |
| { "number_id", ui::TEXT_INPUT_TYPE_NUMBER }, |
| { "tel_id", ui::TEXT_INPUT_TYPE_TELEPHONE }, |
| { "url_id", ui::TEXT_INPUT_TYPE_URL }, |
| { "textarea_id", ui::TEXT_INPUT_TYPE_TEXT_AREA }, |
| { "contenteditable_id", ui::TEXT_INPUT_TYPE_CONTENT_EDITABLE }, |
| }; // The order should be same as tab order in all_input_node.html. |
| |
| for (size_t i = 0; i < arraysize(expectations); ++i) { |
| content::SimulateKeyPress(tab, ui::VKEY_TAB, false, false, false, false); |
| |
| helper.WaitForTextInputStateChanged(expectations[i].type); |
| EXPECT_EQ(expectations[i].type, helper.GetTextInputType()); |
| } |
| |
| for (size_t i = 0; i < arraysize(expectations); ++i) { |
| helper.ClickElement(expectations[i].node_id, tab); |
| |
| helper.WaitForTextInputStateChanged(expectations[i].type); |
| EXPECT_EQ(expectations[i].type, helper.GetTextInputType()); |
| } |
| } |
| |
| IN_PROC_BROWSER_TEST_F(TextInput_TextInputStateChangedTest, |
| OpenNewTabOnloadTest) { |
| TextInputTestHelper helper; |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType()); |
| |
| GURL base_url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("all_input_node.html"))); |
| ui_test_utils::NavigateToURL(browser(), base_url); |
| content::WebContents* base_tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| |
| // Focus to password field. |
| helper.ClickElement("password_id", base_tab); |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_PASSWORD); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, helper.GetTextInputType()); |
| |
| // Then opening new foreground tab and wait new TextInputType. |
| GURL new_url = ui_test_utils::GetTestUrl( |
| base::FilePath(FILE_PATH_LITERAL("textinput")), |
| base::FilePath(FILE_PATH_LITERAL("focus_input_on_load.html"))); |
| ui_test_utils::NavigateToURLWithDisposition(browser(), |
| new_url, |
| NEW_FOREGROUND_TAB, |
| 0); |
| content::WebContents* new_tab = |
| browser()->tab_strip_model()->GetActiveWebContents(); |
| EXPECT_NE(base_tab, new_tab); |
| |
| helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT); |
| EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, helper.GetTextInputType()); |
| } |
| |
| } // namespace chromeos |