textinput_surroundingtext_browsertest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
1// Copyright (c) 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/utf_string_conversions.h"
6#include "chrome/browser/chromeos/input_method/textinput_test_helper.h"
7#include "chrome/browser/ui/browser.h"
8#include "chrome/browser/ui/tabs/tab_strip_model.h"
9#include "chrome/test/base/interactive_test_utils.h"
10#include "content/public/browser/web_contents.h"
11#include "content/public/test/browser_test_utils.h"
12#include "testing/gtest/include/gtest/gtest.h"
13#include "ui/base/ime/composition_underline.h"
14
15namespace chromeos {
16
17typedef TextInputTestBase TextInput_SurroundingTextChangedTest;
18
19IN_PROC_BROWSER_TEST_F(TextInput_SurroundingTextChangedTest,
20                       SurroundingTextChangedWithInsertText) {
21  TextInputTestHelper helper;
22  GURL url = ui_test_utils::GetTestUrl(
23      base::FilePath(FILE_PATH_LITERAL("textinput")),
24      base::FilePath(FILE_PATH_LITERAL("simple_textarea.html")));
25  ui_test_utils::NavigateToURL(browser(), url);
26  EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
27
28  content::WebContents* tab =
29      browser()->tab_strip_model()->GetActiveWebContents();
30
31  ASSERT_TRUE(content::ExecuteScript(
32      tab,
33      "document.getElementById('text_id').focus()"));
34  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
35  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
36
37  const base::string16 sample_text1 = UTF8ToUTF16("abcde");
38  const base::string16 sample_text2 = UTF8ToUTF16("fghij");
39  const base::string16 surrounding_text2 = sample_text1 + sample_text2;
40  gfx::Range expected_range1(5, 5);
41  gfx::Range expected_range2(10, 10);
42
43  ASSERT_TRUE(helper.GetTextInputClient());
44
45  helper.GetTextInputClient()->InsertText(sample_text1);
46  helper.WaitForSurroundingTextChanged(sample_text1, expected_range1);
47  EXPECT_EQ(sample_text1, helper.GetSurroundingText());
48  EXPECT_EQ(expected_range1, helper.GetSelectionRange());
49
50  helper.GetTextInputClient()->InsertText(sample_text2);
51  helper.WaitForSurroundingTextChanged(surrounding_text2, expected_range2);
52  EXPECT_EQ(surrounding_text2, helper.GetSurroundingText());
53  EXPECT_EQ(expected_range2, helper.GetSelectionRange());
54}
55
56IN_PROC_BROWSER_TEST_F(TextInput_SurroundingTextChangedTest,
57                       SurroundingTextChangedWithComposition) {
58  TextInputTestHelper helper;
59  GURL url = ui_test_utils::GetTestUrl(
60      base::FilePath(FILE_PATH_LITERAL("textinput")),
61      base::FilePath(FILE_PATH_LITERAL("simple_textarea.html")));
62  ui_test_utils::NavigateToURL(browser(), url);
63  EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
64
65  content::WebContents* tab =
66      browser()->tab_strip_model()->GetActiveWebContents();
67
68  ASSERT_TRUE(content::ExecuteScript(
69      tab,
70      "document.getElementById('text_id').focus()"));
71  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
72  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
73
74  const base::string16 sample_text = UTF8ToUTF16("abcde");
75  gfx::Range expected_range(5, 5);
76
77  ui::CompositionText composition_text;
78  composition_text.text = sample_text;
79  composition_text.selection.set_start(expected_range.length());
80  composition_text.selection.set_end(expected_range.length());
81
82  ASSERT_TRUE(helper.GetTextInputClient());
83  helper.GetTextInputClient()->SetCompositionText(composition_text);
84  ASSERT_TRUE(helper.GetTextInputClient()->HasCompositionText());
85  // TODO(nona): Make sure there is no IPC from renderer.
86  helper.GetTextInputClient()->InsertText(sample_text);
87  helper.GetTextInputClient()->ClearCompositionText();
88
89  ASSERT_FALSE(helper.GetTextInputClient()->HasCompositionText());
90  helper.WaitForSurroundingTextChanged(sample_text, expected_range);
91  EXPECT_EQ(sample_text, helper.GetSurroundingText());
92  EXPECT_EQ(expected_range, helper.GetSelectionRange());
93}
94
95IN_PROC_BROWSER_TEST_F(TextInput_SurroundingTextChangedTest,
96                       FocusToTextContainingTextAreaByClickingCase) {
97  TextInputTestHelper helper;
98  GURL url = ui_test_utils::GetTestUrl(
99      base::FilePath(FILE_PATH_LITERAL("textinput")),
100      base::FilePath(FILE_PATH_LITERAL("textarea_with_preset_text.html")));
101  ui_test_utils::NavigateToURL(browser(), url);
102  EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
103
104  content::WebContents* tab =
105      browser()->tab_strip_model()->GetActiveWebContents();
106  const gfx::Range zero_range(0, 0);
107
108  // We expect no surrounding texts.
109  helper.ClickElement("empty_textarea", tab);
110  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
111  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
112  helper.WaitForSurroundingTextChanged(UTF8ToUTF16(""), zero_range);
113  EXPECT_TRUE(helper.GetSurroundingText().empty());
114  EXPECT_EQ(zero_range, helper.GetSelectionRange());
115
116  // Click textarea containing text, so expecting new surrounding text comes.
117  helper.ClickElement("filled_textarea", tab);
118  const base::string16 expected_text = UTF8ToUTF16("abcde");
119  const gfx::Range expected_range(5, 5);
120  helper.WaitForSurroundingTextChanged(expected_text, expected_range);
121  EXPECT_EQ(expected_text, helper.GetSurroundingText());
122  EXPECT_EQ(expected_range, helper.GetSelectionRange());
123
124  // Then, back to empty text area: expecting empty string.
125  helper.ClickElement("empty_textarea", tab);
126  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
127  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
128  helper.WaitForSurroundingTextChanged(UTF8ToUTF16(""), zero_range);
129  EXPECT_TRUE(helper.GetSurroundingText().empty());
130  EXPECT_EQ(zero_range, helper.GetSelectionRange());
131}
132
133// TODO(nona): Add test for JavaScript focusing to textarea containing text.
134// TODO(nona): Add test for text changing by JavaScript.
135// TODO(nona): Add test for onload focusing to textarea containing text.
136} // namespace chromeos
137