Index: ui/base/win/tsf_bridge.cc |
diff --git a/ui/base/win/tsf_bridge.cc b/ui/base/win/tsf_bridge.cc |
index 58785778dff0834f9a9977b441a2dc939e8aff57..8e98b76d4eb6b4e19a913ed824aa94978eeb88ab 100644 |
--- a/ui/base/win/tsf_bridge.cc |
+++ b/ui/base/win/tsf_bridge.cc |
@@ -104,32 +104,39 @@ class TsfBridgeDelegate : public TsfBridge { |
virtual bool EnableIME() OVERRIDE { |
DCHECK_EQ(MessageLoop::TYPE_UI, MessageLoop::current()->type()); |
DCHECK(IsInitialized()); |
- if (SUCCEEDED(thread_manager_->SetFocus(document_manager_))) { |
- return true; |
- } |
- return false; |
+ |
+ // Since EnableIME and DisableIME are designed to be a swap operation of |
+ // |document_manager_| and |disabled_document_manager_|, do nothing unless |
+ // the current focused document manager is |disabled_document_manager_|. |
+ // In other words, ITfThreadMgr::SetFocus should be called if and only if |
+ // TsfBridge actually has TSF input focus. Otherwise, TSF input focus will |
+ // be inconsistent with Win32 input focus. |
+ if (!IsFocused(disabled_document_manager_)) |
+ return false; |
+ |
+ return SUCCEEDED(thread_manager_->SetFocus(document_manager_)); |
} |
// TsfBridge override. |
virtual bool DisableIME() OVERRIDE { |
DCHECK_EQ(MessageLoop::TYPE_UI, MessageLoop::current()->type()); |
DCHECK(IsInitialized()); |
- if (SUCCEEDED(thread_manager_->SetFocus(disabled_document_manager_))) { |
- return true; |
- } |
- return false; |
+ |
+ // Do nothing unless the current focused document manager is |
+ // |document_manager_|. See the comment in EnableIME. |
+ if (!IsFocused(document_manager_)) |
+ return false; |
+ |
+ return SUCCEEDED(thread_manager_->SetFocus(disabled_document_manager_)); |
} |
// TsfBridge override. |
virtual bool CancelComposition() OVERRIDE { |
DCHECK_EQ(MessageLoop::TYPE_UI, MessageLoop::current()->type()); |
DCHECK(IsInitialized()); |
- // If current focused document manager is not |document_manager_|, do |
+ // If the current focused document manager is not |document_manager_|, do |
// nothing here. |
- base::win::ScopedComPtr<ITfDocumentMgr> focused_document_mangaer; |
- if (FAILED(thread_manager_->GetFocus(focused_document_mangaer.Receive()))) |
- return false; |
- if (!focused_document_mangaer.IsSameObject(document_manager_)) |
+ if (!IsFocused(document_manager_)) |
return false; |
base::win::ScopedComPtr<ITfContext> context; |
@@ -293,6 +300,14 @@ class TsfBridgeDelegate : public TsfBridge { |
return true; |
} |
+ // Returns true if |document_manager| is the focused document manager. |
+ bool IsFocused(base::win::ScopedComPtr<ITfDocumentMgr> document_manager) { |
+ base::win::ScopedComPtr<ITfDocumentMgr> focused_document_mangaer; |
+ if (FAILED(thread_manager_->GetFocus(focused_document_mangaer.Receive()))) |
+ return false; |
+ return focused_document_mangaer.IsSameObject(document_manager); |
+ } |
+ |
// Returns true if already initialized. |
bool IsInitialized() { |
return client_id_ != TF_CLIENTID_NULL; |