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