summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorkinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-14 01:26:49 +0000
committerkinaba@chromium.org <kinaba@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-01-14 01:26:49 +0000
commit90b1e4fe376dc7cdf647548c99c80368c072a98a (patch)
tree42426105da95a44dad03832e368566727fff11cf /ui
parentcf0f7d9ed9f6dd06c3cdb5c3880d79d727d6356f (diff)
downloadchromium_src-90b1e4fe376dc7cdf647548c99c80368c072a98a.zip
chromium_src-90b1e4fe376dc7cdf647548c99c80368c072a98a.tar.gz
chromium_src-90b1e4fe376dc7cdf647548c99c80368c072a98a.tar.bz2
Implement off-the-spot mode for Aura-IBus IME.
When a PPAPI plugin does not support drawing composition text by themselves, the browser is expected to do it instead. This patch is for implementing it for Aura IME. BUG=97189 TEST=Manually tested on ppapi_example_ime. Review URL: http://codereview.chromium.org/9199004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117751 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui')
-rw-r--r--ui/base/ime/ibus_client.h8
-rw-r--r--ui/base/ime/ibus_client_impl.cc9
-rw-r--r--ui/base/ime/ibus_client_impl.h4
-rw-r--r--ui/base/ime/input_method.h3
-rw-r--r--ui/base/ime/input_method_base.cc5
-rw-r--r--ui/base/ime/input_method_base.h3
-rw-r--r--ui/base/ime/input_method_ibus.cc9
-rw-r--r--ui/base/ime/input_method_ibus_unittest.cc13
-rw-r--r--ui/base/ime/mock_ibus_client.cc3
-rw-r--r--ui/base/ime/mock_ibus_client.h4
-rw-r--r--ui/base/ime/mock_input_method.cc6
-rw-r--r--ui/base/ime/mock_input_method.h3
-rw-r--r--ui/base/ime/text_input_client.h5
-rw-r--r--ui/views/controls/textfield/native_textfield_views.cc4
-rw-r--r--ui/views/controls/textfield/native_textfield_views.h3
-rw-r--r--ui/views/ime/input_method_bridge.cc7
-rw-r--r--ui/views/ime/input_method_bridge.h3
-rw-r--r--ui/views/test/views_test_base.cc5
18 files changed, 81 insertions, 16 deletions
diff --git a/ui/base/ime/ibus_client.h b/ui/base/ime/ibus_client.h
index a430023..9292312 100644
--- a/ui/base/ime/ibus_client.h
+++ b/ui/base/ime/ibus_client.h
@@ -48,6 +48,11 @@ class UI_EXPORT IBusClient {
virtual void StoreOrAbandonInputContext(IBusInputContext* ic) = 0;
};
+ enum InlineCompositionCapability {
+ OFF_THE_SPOT_COMPOSITION = 0,
+ INLINE_COMPOSITION = 1,
+ };
+
virtual ~IBusClient() {}
// Gets a D-Bus connection to ibus-daemon. An implementation should establish
@@ -69,7 +74,8 @@ class UI_EXPORT IBusClient {
virtual void DestroyProxy(IBusInputContext* context) = 0;
// Updates the set of capabilities of the |context|.
- virtual void SetCapabilities(IBusInputContext* context) = 0;
+ virtual void SetCapabilities(IBusInputContext* context,
+ InlineCompositionCapability inline_type) = 0;
// Focuses the |context| asynchronously.
virtual void FocusIn(IBusInputContext* context) = 0;
diff --git a/ui/base/ime/ibus_client_impl.cc b/ui/base/ime/ibus_client_impl.cc
index 4438b63..719db75 100644
--- a/ui/base/ime/ibus_client_impl.cc
+++ b/ui/base/ime/ibus_client_impl.cc
@@ -98,10 +98,13 @@ void IBusClientImpl::DestroyProxy(IBusInputContext* context) {
ibus_proxy_destroy(IBUS_PROXY(context));
}
-void IBusClientImpl::SetCapabilities(IBusInputContext* context) {
+void IBusClientImpl::SetCapabilities(IBusInputContext* context,
+ InlineCompositionCapability inline_type) {
// TODO(penghuang): support surrounding text.
- static const guint32 kCapabilities = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS;
- ibus_input_context_set_capabilities(context, kCapabilities);
+ guint32 capabilities =
+ inline_type == INLINE_COMPOSITION ? IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS
+ : IBUS_CAP_FOCUS;
+ ibus_input_context_set_capabilities(context, capabilities);
}
void IBusClientImpl::FocusIn(IBusInputContext* context) {
diff --git a/ui/base/ime/ibus_client_impl.h b/ui/base/ime/ibus_client_impl.h
index 4d076a7..91cb53a 100644
--- a/ui/base/ime/ibus_client_impl.h
+++ b/ui/base/ime/ibus_client_impl.h
@@ -28,7 +28,9 @@ public:
virtual void CreateContext(IBusBus* bus,
PendingCreateICRequest* request) OVERRIDE;
virtual void DestroyProxy(IBusInputContext* context) OVERRIDE;
- virtual void SetCapabilities(IBusInputContext* context) OVERRIDE;
+ virtual void SetCapabilities(
+ IBusInputContext* context,
+ InlineCompositionCapability inline_type) OVERRIDE;
virtual void FocusIn(IBusInputContext* context) OVERRIDE;
virtual void FocusOut(IBusInputContext* context) OVERRIDE;
virtual void Reset(IBusInputContext* context) OVERRIDE;
diff --git a/ui/base/ime/input_method.h b/ui/base/ime/input_method.h
index 4fe184c..1796ceb 100644
--- a/ui/base/ime/input_method.h
+++ b/ui/base/ime/input_method.h
@@ -117,6 +117,9 @@ class UI_EXPORT InputMethod {
// Gets the text input type of the focused text input client. Returns
// ui::TEXT_INPUT_TYPE_NONE if there is no focused client.
virtual TextInputType GetTextInputType() const = 0;
+
+ // Checks if the focused text input client supports inline composition.
+ virtual bool CanComposeInline() const = 0;
};
} // namespace ui
diff --git a/ui/base/ime/input_method_base.cc b/ui/base/ime/input_method_base.cc
index 601887b..ae2d41a4 100644
--- a/ui/base/ime/input_method_base.cc
+++ b/ui/base/ime/input_method_base.cc
@@ -61,6 +61,11 @@ TextInputType InputMethodBase::GetTextInputType() const {
return client ? client->GetTextInputType() : TEXT_INPUT_TYPE_NONE;
}
+bool InputMethodBase::CanComposeInline() const {
+ TextInputClient* client = GetTextInputClient();
+ return client ? client->CanComposeInline() : true;
+}
+
bool InputMethodBase::IsTextInputClientFocused(const TextInputClient* client) {
return client && (client == GetTextInputClient());
}
diff --git a/ui/base/ime/input_method_base.h b/ui/base/ime/input_method_base.h
index 1e511b5..42b7eb2 100644
--- a/ui/base/ime/input_method_base.h
+++ b/ui/base/ime/input_method_base.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -43,6 +43,7 @@ class UI_EXPORT InputMethodBase : public InputMethod {
virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE;
virtual TextInputType GetTextInputType() const OVERRIDE;
+ virtual bool CanComposeInline() const OVERRIDE;
protected:
virtual void OnWillChangeFocusedClient(TextInputClient* focused_before,
diff --git a/ui/base/ime/input_method_ibus.cc b/ui/base/ime/input_method_ibus.cc
index 2cc7820..89727da 100644
--- a/ui/base/ime/input_method_ibus.cc
+++ b/ui/base/ime/input_method_ibus.cc
@@ -405,7 +405,7 @@ void InputMethodIBus::SetContext(IBusInputContext* ic) {
g_signal_connect(ic, "destroy",
G_CALLBACK(OnDestroyThunk), this);
- ibus_client_->SetCapabilities(ic);
+ ibus_client_->SetCapabilities(ic, internal::IBusClient::INLINE_COMPOSITION);
UpdateContextFocusState();
// Since ibus-daemon is launched in an on-demand basis on Chrome OS, RWHVA (or
@@ -497,6 +497,13 @@ void InputMethodIBus::UpdateContextFocusState() {
ibus_client_->FocusOut(context_);
else if (!old_context_focused && context_focused_)
ibus_client_->FocusIn(context_);
+
+ if (context_focused_) {
+ internal::IBusClient::InlineCompositionCapability capability =
+ CanComposeInline() ? internal::IBusClient::INLINE_COMPOSITION
+ : internal::IBusClient::OFF_THE_SPOT_COMPOSITION;
+ ibus_client_->SetCapabilities(context_, capability);
+ }
}
void InputMethodIBus::ProcessKeyEventPostIME(
diff --git a/ui/base/ime/input_method_ibus_unittest.cc b/ui/base/ime/input_method_ibus_unittest.cc
index 025846b..a2afc40 100644
--- a/ui/base/ime/input_method_ibus_unittest.cc
+++ b/ui/base/ime/input_method_ibus_unittest.cc
@@ -88,6 +88,9 @@ class InputMethodIBusTest : public internal::InputMethodDelegate,
virtual TextInputType GetTextInputType() const OVERRIDE {
return input_type_;
}
+ virtual bool CanComposeInline() const OVERRIDE {
+ return can_compose_inline_;
+ }
virtual gfx::Rect GetCaretBounds() OVERRIDE {
return caret_bounds_;
}
@@ -139,6 +142,7 @@ class InputMethodIBusTest : public internal::InputMethodDelegate,
on_input_method_changed_call_count_ = 0;
input_type_ = TEXT_INPUT_TYPE_NONE;
+ can_compose_inline_ = true;
caret_bounds_ = gfx::Rect();
}
@@ -162,6 +166,7 @@ class InputMethodIBusTest : public internal::InputMethodDelegate,
// Variables that will be returned from the ui::TextInputClient functions.
TextInputType input_type_;
+ bool can_compose_inline_;
gfx::Rect caret_bounds_;
};
@@ -196,6 +201,14 @@ TEST_F(InputMethodIBusTest, GetInputTextType) {
EXPECT_EQ(TEXT_INPUT_TYPE_TEXT, ime_->GetTextInputType());
}
+TEST_F(InputMethodIBusTest, CanComposeInline) {
+ ime_->Init(true);
+ EXPECT_EQ(true, ime_->CanComposeInline());
+ can_compose_inline_ = false;
+ ime_->OnTextInputTypeChanged(this);
+ EXPECT_EQ(false, ime_->CanComposeInline());
+}
+
TEST_F(InputMethodIBusTest, GetTextInputClient) {
ime_->Init(true);
EXPECT_EQ(this, ime_->GetTextInputClient());
diff --git a/ui/base/ime/mock_ibus_client.cc b/ui/base/ime/mock_ibus_client.cc
index f4ada55..b06237f 100644
--- a/ui/base/ime/mock_ibus_client.cc
+++ b/ui/base/ime/mock_ibus_client.cc
@@ -177,7 +177,8 @@ void MockIBusClient::DestroyProxy(IBusInputContext* context) {
g_signal_emit_by_name(context, "destroy");
}
-void MockIBusClient::SetCapabilities(IBusInputContext* context) {
+void MockIBusClient::SetCapabilities(IBusInputContext* context,
+ InlineCompositionCapability inline_type) {
++set_capabilities_call_count_;
}
diff --git a/ui/base/ime/mock_ibus_client.h b/ui/base/ime/mock_ibus_client.h
index 56c2e22..01ce75f 100644
--- a/ui/base/ime/mock_ibus_client.h
+++ b/ui/base/ime/mock_ibus_client.h
@@ -27,7 +27,9 @@ public:
virtual void CreateContext(IBusBus* bus,
PendingCreateICRequest* request) OVERRIDE;
virtual void DestroyProxy(IBusInputContext* context) OVERRIDE;
- virtual void SetCapabilities(IBusInputContext* context) OVERRIDE;
+ virtual void SetCapabilities(
+ IBusInputContext* context,
+ InlineCompositionCapability inline_type) OVERRIDE;
virtual void FocusIn(IBusInputContext* context) OVERRIDE;
virtual void FocusOut(IBusInputContext* context) OVERRIDE;
virtual void Reset(IBusInputContext* context) OVERRIDE;
diff --git a/ui/base/ime/mock_input_method.cc b/ui/base/ime/mock_input_method.cc
index 9aba8d5..461f19c 100644
--- a/ui/base/ime/mock_input_method.cc
+++ b/ui/base/ime/mock_input_method.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -115,4 +115,8 @@ ui::TextInputType MockInputMethod::GetTextInputType() const {
return ui::TEXT_INPUT_TYPE_NONE;
}
+bool MockInputMethod::CanComposeInline() const {
+ return true;
+}
+
} // namespace ui
diff --git a/ui/base/ime/mock_input_method.h b/ui/base/ime/mock_input_method.h
index fc1eeb5..73042f3 100644
--- a/ui/base/ime/mock_input_method.h
+++ b/ui/base/ime/mock_input_method.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -36,6 +36,7 @@ class UI_EXPORT MockInputMethod : public InputMethod {
virtual base::i18n::TextDirection GetInputTextDirection() OVERRIDE;
virtual bool IsActive() OVERRIDE;
virtual ui::TextInputType GetTextInputType() const OVERRIDE;
+ virtual bool CanComposeInline() const OVERRIDE;
private:
internal::InputMethodDelegate* delegate_;
diff --git a/ui/base/ime/text_input_client.h b/ui/base/ime/text_input_client.h
index 4d10309..b319ec9 100644
--- a/ui/base/ime/text_input_client.h
+++ b/ui/base/ime/text_input_client.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -60,6 +60,9 @@ class UI_EXPORT TextInputClient {
// TEXT_INPUT_TYPE_NONE at runtime.
virtual ui::TextInputType GetTextInputType() const = 0;
+ // Returns if the client supports inline composition currently.
+ virtual bool CanComposeInline() const = 0;
+
// Returns current caret (insertion point) bounds relative to the screen
// coordinates. If there is selection, then the selection bounds will be
// returned.
diff --git a/ui/views/controls/textfield/native_textfield_views.cc b/ui/views/controls/textfield/native_textfield_views.cc
index 950a7fb..2210052 100644
--- a/ui/views/controls/textfield/native_textfield_views.cc
+++ b/ui/views/controls/textfield/native_textfield_views.cc
@@ -699,6 +699,10 @@ ui::TextInputType NativeTextfieldViews::GetTextInputType() const {
return textfield_->GetTextInputType();
}
+bool NativeTextfieldViews::CanComposeInline() const {
+ return true;
+}
+
gfx::Rect NativeTextfieldViews::GetCaretBounds() {
return GetRenderText()->GetUpdatedCursorBounds();
}
diff --git a/ui/views/controls/textfield/native_textfield_views.h b/ui/views/controls/textfield/native_textfield_views.h
index d074dbf..312ffb1 100644
--- a/ui/views/controls/textfield/native_textfield_views.h
+++ b/ui/views/controls/textfield/native_textfield_views.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -151,6 +151,7 @@ class VIEWS_EXPORT NativeTextfieldViews : public TouchSelectionClientView,
virtual void InsertText(const string16& text) OVERRIDE;
virtual void InsertChar(char16 ch, int flags) OVERRIDE;
virtual ui::TextInputType GetTextInputType() const OVERRIDE;
+ virtual bool CanComposeInline() const OVERRIDE;
virtual gfx::Rect GetCaretBounds() OVERRIDE;
virtual bool HasCompositionText() OVERRIDE;
virtual bool GetTextRange(ui::Range* range) OVERRIDE;
diff --git a/ui/views/ime/input_method_bridge.cc b/ui/views/ime/input_method_bridge.cc
index 1ca1631..26b5242 100644
--- a/ui/views/ime/input_method_bridge.cc
+++ b/ui/views/ime/input_method_bridge.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -126,6 +126,11 @@ ui::TextInputType InputMethodBridge::GetTextInputType() const {
return client ? client->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE;
}
+bool InputMethodBridge::CanComposeInline() const {
+ TextInputClient* client = GetTextInputClient();
+ return client ? client->CanComposeInline() : true;
+}
+
gfx::Rect InputMethodBridge::GetCaretBounds() {
TextInputClient* client = GetTextInputClient();
if (!client || !GetFocusedView())
diff --git a/ui/views/ime/input_method_bridge.h b/ui/views/ime/input_method_bridge.h
index 6f4b384..437856e 100644
--- a/ui/views/ime/input_method_bridge.h
+++ b/ui/views/ime/input_method_bridge.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -51,6 +51,7 @@ class InputMethodBridge : public InputMethodBase,
virtual void InsertText(const string16& text) OVERRIDE;
virtual void InsertChar(char16 ch, int flags) OVERRIDE;
virtual ui::TextInputType GetTextInputType() const OVERRIDE;
+ virtual bool CanComposeInline() const OVERRIDE;
virtual gfx::Rect GetCaretBounds() OVERRIDE;
virtual bool HasCompositionText() OVERRIDE;
virtual bool GetTextRange(ui::Range* range) OVERRIDE;
diff --git a/ui/views/test/views_test_base.cc b/ui/views/test/views_test_base.cc
index d172c17..ee1ab9f 100644
--- a/ui/views/test/views_test_base.cc
+++ b/ui/views/test/views_test_base.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Copyright (c) 2012 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.
@@ -48,6 +48,9 @@ class DummyInputMethod : public ui::InputMethod {
virtual ui::TextInputType GetTextInputType() const OVERRIDE {
return ui::TEXT_INPUT_TYPE_NONE;
}
+ virtual bool CanComposeInline() const OVERRIDE {
+ return true;
+ }
};
} // namespace