// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "ui/base/ime/input_method_chromeos.h"
+
#include <X11/Xlib.h>
#undef Bool
#undef FocusIn
#include "base/i18n/char_iterator.h"
#include "base/memory/scoped_ptr.h"
#include "base/strings/utf_string_conversions.h"
+#include "chromeos/ime/composition_text.h"
#include "chromeos/ime/ibus_keymap.h"
-#include "chromeos/ime/ibus_text.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/ime/chromeos/ime_bridge.h"
#include "ui/base/ime/chromeos/mock_ime_candidate_window_handler.h"
#include "ui/base/ime/chromeos/mock_ime_engine_handler.h"
-#include "ui/base/ime/input_method_chromeos.h"
#include "ui/base/ime/input_method_delegate.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/events/event.h"
#include "ui/events/test/events_test_utils_x11.h"
-#include "ui/gfx/rect.h"
+#include "ui/gfx/geometry/rect.h"
using base::UTF8ToUTF16;
using base::UTF16ToUTF8;
typedef chromeos::IMEEngineHandlerInterface::KeyEventDoneCallback
KeyEventCallback;
-uint32 GetOffsetInUTF16(const std::string& utf8_string, uint32 utf8_offset) {
- base::string16 utf16_string = UTF8ToUTF16(utf8_string);
+uint32 GetOffsetInUTF16(
+ const base::string16& utf16_string, uint32 utf8_offset) {
DCHECK_LT(utf8_offset, utf16_string.size());
base::i18n::UTF16CharIterator char_iterator(&utf16_string);
for (size_t i = 0; i < utf8_offset; ++i)
bool handled;
};
- // InputMethodChromeOS override.
+ // Overridden from InputMethodChromeOS:
virtual void ProcessKeyEventPostIME(const ui::KeyEvent& key_event,
bool handled) OVERRIDE {
process_key_event_post_ime_args_.event = &key_event;
};
class InputMethodChromeOSTest : public internal::InputMethodDelegate,
- public testing::Test,
- public TextInputClient {
+ public testing::Test,
+ public TextInputClient {
public:
- InputMethodChromeOSTest() {
+ InputMethodChromeOSTest()
+ : dispatched_key_event_(ui::ET_UNKNOWN, ui::VKEY_UNKNOWN, 0, false) {
ResetFlags();
}
virtual ~InputMethodChromeOSTest() {
}
- // testing::Test overrides:
virtual void SetUp() OVERRIDE {
chromeos::IMEBridge::Initialize();
chromeos::IMEBridge::Shutdown();
}
- // ui::internal::InputMethodDelegate overrides:
- virtual bool DispatchKeyEventPostIME(
- const base::NativeEvent& native_key_event) OVERRIDE {
- dispatched_native_event_ = native_key_event;
- return false;
- }
- virtual bool DispatchFabricatedKeyEventPostIME(ui::EventType type,
- ui::KeyboardCode key_code,
- int flags) OVERRIDE {
- dispatched_fabricated_event_type_ = type;
- dispatched_fabricated_event_key_code_ = key_code;
- dispatched_fabricated_event_flags_ = flags;
+ // Overridden from ui::internal::InputMethodDelegate:
+ virtual bool DispatchKeyEventPostIME(const ui::KeyEvent& event) OVERRIDE {
+ dispatched_key_event_ = event;
return false;
}
- // ui::TextInputClient overrides:
+ // Overridden from ui::TextInputClient:
virtual void SetCompositionText(
const CompositionText& composition) OVERRIDE {
composition_text_ = composition;
virtual bool ChangeTextDirectionAndLayoutAlignment(
base::i18n::TextDirection direction) OVERRIDE { return false; }
virtual void ExtendSelectionAndDelete(size_t before,
- size_t after) OVERRIDE { }
- virtual void EnsureCaretInRect(const gfx::Rect& rect) OVERRIDE { }
- virtual void OnCandidateWindowShown() OVERRIDE { }
- virtual void OnCandidateWindowUpdated() OVERRIDE { }
- virtual void OnCandidateWindowHidden() OVERRIDE { }
+ size_t after) OVERRIDE {}
+ virtual void EnsureCaretInRect(const gfx::Rect& rect) OVERRIDE {}
+ virtual void OnCandidateWindowShown() OVERRIDE {}
+ virtual void OnCandidateWindowUpdated() OVERRIDE {}
+ virtual void OnCandidateWindowHidden() OVERRIDE {}
bool HasNativeEvent() const {
- base::NativeEvent empty;
- std::memset(&empty, 0, sizeof(empty));
- return !!std::memcmp(&dispatched_native_event_,
- &empty,
- sizeof(dispatched_native_event_));
+ return dispatched_key_event_.HasNativeEvent();
}
void ResetFlags() {
- std::memset(&dispatched_native_event_, 0, sizeof(dispatched_native_event_));
- DCHECK(!HasNativeEvent());
- dispatched_fabricated_event_type_ = ET_UNKNOWN;
- dispatched_fabricated_event_key_code_ = VKEY_UNKNOWN;
- dispatched_fabricated_event_flags_ = 0;
+ dispatched_key_event_ = ui::KeyEvent(ui::ET_UNKNOWN, ui::VKEY_UNKNOWN, 0,
+ false);
composition_text_.Clear();
confirmed_text_.Clear();
scoped_ptr<TestableInputMethodChromeOS> ime_;
- // Variables for remembering the parameters that are passed to
- // ui::internal::InputMethodDelegate functions.
- base::NativeEvent dispatched_native_event_;
- ui::EventType dispatched_fabricated_event_type_;
- ui::KeyboardCode dispatched_fabricated_event_key_code_;
- int dispatched_fabricated_event_flags_;
+ // Copy of the dispatched key event.
+ ui::KeyEvent dispatched_key_event_;
// Variables for remembering the parameters that are passed to
// ui::TextInputClient functions.
}
TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_NoAttribute) {
- const char kSampleText[] = "Sample Text";
+ const base::string16 kSampleText = base::UTF8ToUTF16("Sample Text");
const uint32 kCursorPos = 2UL;
- const base::string16 utf16_string = UTF8ToUTF16(kSampleText);
- chromeos::IBusText ibus_text;
- ibus_text.set_text(kSampleText);
+ chromeos::CompositionText chromeos_composition_text;
+ chromeos_composition_text.set_text(kSampleText);
CompositionText composition_text;
- ime_->ExtractCompositionText(ibus_text, kCursorPos, &composition_text);
- EXPECT_EQ(UTF8ToUTF16(kSampleText), composition_text.text);
+ ime_->ExtractCompositionText(
+ chromeos_composition_text, kCursorPos, &composition_text);
+ EXPECT_EQ(kSampleText, composition_text.text);
// If there is no selection, |selection| represents cursor position.
EXPECT_EQ(kCursorPos, composition_text.selection.start());
EXPECT_EQ(kCursorPos, composition_text.selection.end());
// whole text underline.
ASSERT_EQ(1UL, composition_text.underlines.size());
EXPECT_EQ(0UL, composition_text.underlines[0].start_offset);
- EXPECT_EQ(utf16_string.size(), composition_text.underlines[0].end_offset);
+ EXPECT_EQ(kSampleText.size(), composition_text.underlines[0].end_offset);
EXPECT_FALSE(composition_text.underlines[0].thick);
}
TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_SingleUnderline) {
- const char kSampleText[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86"
- "\xE3\x81\x88\xE3\x81\x8A";
+ const base::string16 kSampleText = base::UTF8ToUTF16(
+ "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
const uint32 kCursorPos = 2UL;
- // Set up ibus text with one underline attribute.
- chromeos::IBusText ibus_text;
- ibus_text.set_text(kSampleText);
- chromeos::IBusText::UnderlineAttribute underline;
- underline.type = chromeos::IBusText::IBUS_TEXT_UNDERLINE_SINGLE;
+ // Set up chromeos composition text with one underline attribute.
+ chromeos::CompositionText chromeos_composition_text;
+ chromeos_composition_text.set_text(kSampleText);
+ chromeos::CompositionText::UnderlineAttribute underline;
+ underline.type = chromeos::CompositionText::COMPOSITION_TEXT_UNDERLINE_SINGLE;
underline.start_index = 1UL;
underline.end_index = 4UL;
- ibus_text.mutable_underline_attributes()->push_back(underline);
+ chromeos_composition_text.mutable_underline_attributes()->push_back(
+ underline);
CompositionText composition_text;
- ime_->ExtractCompositionText(ibus_text, kCursorPos, &composition_text);
- EXPECT_EQ(UTF8ToUTF16(kSampleText), composition_text.text);
+ ime_->ExtractCompositionText(
+ chromeos_composition_text, kCursorPos, &composition_text);
+ EXPECT_EQ(kSampleText, composition_text.text);
// If there is no selection, |selection| represents cursor position.
EXPECT_EQ(kCursorPos, composition_text.selection.start());
EXPECT_EQ(kCursorPos, composition_text.selection.end());
}
TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_DoubleUnderline) {
- const char kSampleText[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86"
- "\xE3\x81\x88\xE3\x81\x8A";
+ const base::string16 kSampleText = base::UTF8ToUTF16(
+ "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
const uint32 kCursorPos = 2UL;
- // Set up ibus text with one underline attribute.
- chromeos::IBusText ibus_text;
- ibus_text.set_text(kSampleText);
- chromeos::IBusText::UnderlineAttribute underline;
- underline.type = chromeos::IBusText::IBUS_TEXT_UNDERLINE_DOUBLE;
+ // Set up chromeos composition text with one underline attribute.
+ chromeos::CompositionText chromeos_composition_text;
+ chromeos_composition_text.set_text(kSampleText);
+ chromeos::CompositionText::UnderlineAttribute underline;
+ underline.type = chromeos::CompositionText::COMPOSITION_TEXT_UNDERLINE_DOUBLE;
underline.start_index = 1UL;
underline.end_index = 4UL;
- ibus_text.mutable_underline_attributes()->push_back(underline);
+ chromeos_composition_text.mutable_underline_attributes()->push_back(
+ underline);
CompositionText composition_text;
- ime_->ExtractCompositionText(ibus_text, kCursorPos, &composition_text);
- EXPECT_EQ(UTF8ToUTF16(kSampleText), composition_text.text);
+ ime_->ExtractCompositionText(
+ chromeos_composition_text, kCursorPos, &composition_text);
+ EXPECT_EQ(kSampleText, composition_text.text);
// If there is no selection, |selection| represents cursor position.
EXPECT_EQ(kCursorPos, composition_text.selection.start());
EXPECT_EQ(kCursorPos, composition_text.selection.end());
}
TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_ErrorUnderline) {
- const char kSampleText[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86"
- "\xE3\x81\x88\xE3\x81\x8A";
+ const base::string16 kSampleText = base::UTF8ToUTF16(
+ "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
const uint32 kCursorPos = 2UL;
- // Set up ibus text with one underline attribute.
- chromeos::IBusText ibus_text;
- ibus_text.set_text(kSampleText);
- chromeos::IBusText::UnderlineAttribute underline;
- underline.type = chromeos::IBusText::IBUS_TEXT_UNDERLINE_ERROR;
+ // Set up chromeos composition text with one underline attribute.
+ chromeos::CompositionText chromeos_composition_text;
+ chromeos_composition_text.set_text(kSampleText);
+ chromeos::CompositionText::UnderlineAttribute underline;
+ underline.type = chromeos::CompositionText::COMPOSITION_TEXT_UNDERLINE_ERROR;
underline.start_index = 1UL;
underline.end_index = 4UL;
- ibus_text.mutable_underline_attributes()->push_back(underline);
+ chromeos_composition_text.mutable_underline_attributes()->push_back(
+ underline);
CompositionText composition_text;
- ime_->ExtractCompositionText(ibus_text, kCursorPos, &composition_text);
- EXPECT_EQ(UTF8ToUTF16(kSampleText), composition_text.text);
+ ime_->ExtractCompositionText(
+ chromeos_composition_text, kCursorPos, &composition_text);
+ EXPECT_EQ(kSampleText, composition_text.text);
EXPECT_EQ(kCursorPos, composition_text.selection.start());
EXPECT_EQ(kCursorPos, composition_text.selection.end());
ASSERT_EQ(1UL, composition_text.underlines.size());
}
TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_Selection) {
- const char kSampleText[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86"
- "\xE3\x81\x88\xE3\x81\x8A";
+ const base::string16 kSampleText = base::UTF8ToUTF16(
+ "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
const uint32 kCursorPos = 2UL;
- // Set up ibus text with one underline attribute.
- chromeos::IBusText ibus_text;
- ibus_text.set_text(kSampleText);
- ibus_text.set_selection_start(1UL);
- ibus_text.set_selection_end(4UL);
+ // Set up chromeos composition text with one underline attribute.
+ chromeos::CompositionText chromeos_composition_text;
+ chromeos_composition_text.set_text(kSampleText);
+ chromeos_composition_text.set_selection_start(1UL);
+ chromeos_composition_text.set_selection_end(4UL);
CompositionText composition_text;
- ime_->ExtractCompositionText(ibus_text, kCursorPos, &composition_text);
- EXPECT_EQ(UTF8ToUTF16(kSampleText), composition_text.text);
+ ime_->ExtractCompositionText(
+ chromeos_composition_text, kCursorPos, &composition_text);
+ EXPECT_EQ(kSampleText, composition_text.text);
EXPECT_EQ(kCursorPos, composition_text.selection.start());
EXPECT_EQ(kCursorPos, composition_text.selection.end());
ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_start()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_start()),
composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_end()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_end()),
composition_text.underlines[0].end_offset);
EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
EXPECT_TRUE(composition_text.underlines[0].thick);
TEST_F(InputMethodChromeOSTest,
ExtractCompositionTextTest_SelectionStartWithCursor) {
- const char kSampleText[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86"
- "\xE3\x81\x88\xE3\x81\x8A";
+ const base::string16 kSampleText = base::UTF8ToUTF16(
+ "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
const uint32 kCursorPos = 1UL;
- // Set up ibus text with one underline attribute.
- chromeos::IBusText ibus_text;
- ibus_text.set_text(kSampleText);
- ibus_text.set_selection_start(kCursorPos);
- ibus_text.set_selection_end(4UL);
+ // Set up chromeos composition text with one underline attribute.
+ chromeos::CompositionText chromeos_composition_text;
+ chromeos_composition_text.set_text(kSampleText);
+ chromeos_composition_text.set_selection_start(kCursorPos);
+ chromeos_composition_text.set_selection_end(4UL);
CompositionText composition_text;
- ime_->ExtractCompositionText(ibus_text, kCursorPos, &composition_text);
- EXPECT_EQ(UTF8ToUTF16(kSampleText), composition_text.text);
+ ime_->ExtractCompositionText(
+ chromeos_composition_text, kCursorPos, &composition_text);
+ EXPECT_EQ(kSampleText, composition_text.text);
// If the cursor position is same as selection bounds, selection start
// position become opposit side of selection from cursor.
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_end()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_end()),
composition_text.selection.start());
EXPECT_EQ(GetOffsetInUTF16(kSampleText, kCursorPos),
composition_text.selection.end());
ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_start()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_start()),
composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_end()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_end()),
composition_text.underlines[0].end_offset);
EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
EXPECT_TRUE(composition_text.underlines[0].thick);
TEST_F(InputMethodChromeOSTest,
ExtractCompositionTextTest_SelectionEndWithCursor) {
- const char kSampleText[] = "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86"
- "\xE3\x81\x88\xE3\x81\x8A";
+ const base::string16 kSampleText = base::UTF8ToUTF16(
+ "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
const uint32 kCursorPos = 4UL;
- // Set up ibus text with one underline attribute.
- chromeos::IBusText ibus_text;
- ibus_text.set_text(kSampleText);
- ibus_text.set_selection_start(1UL);
- ibus_text.set_selection_end(kCursorPos);
+ // Set up chromeos composition text with one underline attribute.
+ chromeos::CompositionText chromeos_composition_text;
+ chromeos_composition_text.set_text(kSampleText);
+ chromeos_composition_text.set_selection_start(1UL);
+ chromeos_composition_text.set_selection_end(kCursorPos);
CompositionText composition_text;
- ime_->ExtractCompositionText(ibus_text, kCursorPos, &composition_text);
- EXPECT_EQ(UTF8ToUTF16(kSampleText), composition_text.text);
+ ime_->ExtractCompositionText(
+ chromeos_composition_text, kCursorPos, &composition_text);
+ EXPECT_EQ(kSampleText, composition_text.text);
// If the cursor position is same as selection bounds, selection start
// position become opposit side of selection from cursor.
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_start()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_start()),
composition_text.selection.start());
EXPECT_EQ(GetOffsetInUTF16(kSampleText, kCursorPos),
composition_text.selection.end());
ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_start()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_start()),
composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, ibus_text.selection_end()),
+ EXPECT_EQ(GetOffsetInUTF16(kSampleText,
+ chromeos_composition_text.selection_end()),
composition_text.underlines[0].end_offset);
EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
EXPECT_TRUE(composition_text.underlines[0].thick);
ime_->OnTextInputTypeChanged(this);
// Set the TextInputClient behaviors.
- surrounding_text_ = UTF8ToUTF16("abcdefghij");
+ surrounding_text_ = base::UTF8ToUTF16("abcdefghij");
text_range_ = gfx::Range(5, 10);
selection_range_ = gfx::Range(7, 9);
// Set the TextInputClient behaviors.
// If the surrounding text becomes empty, text_range become (0, 0) and
// selection range become invalid.
- surrounding_text_ = UTF8ToUTF16("");
+ surrounding_text_ = base::UTF8ToUTF16("");
text_range_ = gfx::Range(0, 0);
selection_range_ = gfx::Range::InvalidRange();