12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/textinput_test_helper.h"
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/test/browser_test_utils.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/ime/composition_underline.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace chromeos {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef TextInputTestBase TextInput_SurroundingTextChangedTest;
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TextInput_SurroundingTextChangedTest,
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       SurroundingTextChangedWithInsertText) {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TextInputTestHelper helper;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("textinput")),
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("simple_textarea.html")));
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* tab =
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "document.getElementById('text_id').focus()"));
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 sample_text1 = base::UTF8ToUTF16("abcde");
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 sample_text2 = base::UTF8ToUTF16("fghij");
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 surrounding_text2 = sample_text1 + sample_text2;
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range expected_range1(5, 5);
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range expected_range2(10, 10);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(helper.GetTextInputClient());
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.GetTextInputClient()->InsertText(sample_text1);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForSurroundingTextChanged(sample_text1, expected_range1);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(sample_text1, helper.GetSurroundingText());
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_range1, helper.GetSelectionRange());
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.GetTextInputClient()->InsertText(sample_text2);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForSurroundingTextChanged(surrounding_text2, expected_range2);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(surrounding_text2, helper.GetSurroundingText());
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_range2, helper.GetSelectionRange());
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TextInput_SurroundingTextChangedTest,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       SurroundingTextChangedWithComposition) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TextInputTestHelper helper;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("textinput")),
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("simple_textarea.html")));
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* tab =
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      tab,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "document.getElementById('text_id').focus()"));
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 sample_text = base::UTF8ToUTF16("abcde");
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  gfx::Range expected_range(5, 5);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::CompositionText composition_text;
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  composition_text.text = sample_text;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  composition_text.selection.set_start(expected_range.length());
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  composition_text.selection.set_end(expected_range.length());
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(helper.GetTextInputClient());
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.GetTextInputClient()->SetCompositionText(composition_text);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(helper.GetTextInputClient()->HasCompositionText());
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(nona): Make sure there is no IPC from renderer.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.GetTextInputClient()->InsertText(sample_text);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.GetTextInputClient()->ClearCompositionText();
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(helper.GetTextInputClient()->HasCompositionText());
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForSurroundingTextChanged(sample_text, expected_range);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(sample_text, helper.GetSurroundingText());
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_range, helper.GetSelectionRange());
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(TextInput_SurroundingTextChangedTest,
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       FocusToTextContainingTextAreaByClickingCase) {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TextInputTestHelper helper;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("textinput")),
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("textarea_with_preset_text.html")));
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, helper.GetTextInputType());
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* tab =
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const gfx::Range zero_range(0, 0);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We expect no surrounding texts.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.ClickElement("empty_textarea", tab);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper.WaitForSurroundingTextChanged(base::string16(), zero_range);
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper.GetSurroundingText().empty());
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(zero_range, helper.GetSelectionRange());
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Click textarea containing text, so expecting new surrounding text comes.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.ClickElement("filled_textarea", tab);
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const base::string16 expected_text = base::UTF8ToUTF16("abcde");
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const gfx::Range expected_range(5, 5);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForSurroundingTextChanged(expected_text, expected_range);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_text, helper.GetSurroundingText());
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(expected_range, helper.GetSelectionRange());
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Then, back to empty text area: expecting empty string.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.ClickElement("empty_textarea", tab);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  helper.WaitForTextInputStateChanged(ui::TEXT_INPUT_TYPE_TEXT_AREA);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT_AREA, helper.GetTextInputType());
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  helper.WaitForSurroundingTextChanged(base::string16(), zero_range);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(helper.GetSurroundingText().empty());
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(zero_range, helper.GetSelectionRange());
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(nona): Add test for JavaScript focusing to textarea containing text.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(nona): Add test for text changing by JavaScript.
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(nona): Add test for onload focusing to textarea containing text.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace chromeos
137