Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(332)

Unified Diff: ui/base/ime/win/tsf_bridge.cc

Issue 16648002: Enable TsfBridge to re-initialize (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/base/ime/win/tsf_bridge.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/ime/win/tsf_bridge.cc
diff --git a/ui/base/ime/win/tsf_bridge.cc b/ui/base/ime/win/tsf_bridge.cc
index 145b47a5e2f664261e8bcec59b5ccef62bbac178..4e70f2f65f1fa0befe1fca99d93177738b4f0a59 100644
--- a/ui/base/ime/win/tsf_bridge.cc
+++ b/ui/base/ime/win/tsf_bridge.cc
@@ -9,7 +9,6 @@
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
-#include "base/memory/singleton.h"
#include "base/message_loop.h"
#include "base/threading/thread_local_storage.h"
#include "base/win/scoped_comptr.h"
@@ -37,7 +36,6 @@ class TSFBridgeDelegate : public TSFBridge {
bool Initialize();
// TsfBridge:
- virtual void Shutdown() OVERRIDE;
virtual void OnTextInputTypeChanged(TextInputClient* client) OVERRIDE;
virtual void OnTextLayoutChanged() OVERRIDE;
virtual bool CancelComposition() OVERRIDE;
@@ -48,8 +46,6 @@ class TSFBridgeDelegate : public TSFBridge {
virtual TextInputClient* GetFocusedTextInputClient() const OVERRIDE;
private:
- friend struct DefaultSingletonTraits<TSFBridgeDelegate>;
-
// Returns true if |tsf_document_map_| is successfully initialized. This
// method should be called from and only from Initialize().
bool InitializeDocumentMapInternal();
@@ -122,6 +118,22 @@ TSFBridgeDelegate::TSFBridgeDelegate()
}
TSFBridgeDelegate::~TSFBridgeDelegate() {
+ DCHECK_EQ(base::MessageLoop::TYPE_UI, base::MessageLoop::current()->type());
+ if (!IsInitialized())
+ return;
+ for (TSFDocumentMap::iterator it = tsf_document_map_.begin();
+ it != tsf_document_map_.end(); ++it) {
+ base::win::ScopedComPtr<ITfContext> context;
+ base::win::ScopedComPtr<ITfSource> source;
+ if (it->second.cookie != TF_INVALID_COOKIE &&
+ SUCCEEDED(it->second.document_manager->GetBase(context.Receive())) &&
+ SUCCEEDED(source.QueryFrom(context))) {
+ source->UnadviseSink(it->second.cookie);
+ }
+ }
+ tsf_document_map_.clear();
+
+ client_id_ = TF_CLIENTID_NULL;
}
bool TSFBridgeDelegate::Initialize() {
@@ -172,25 +184,6 @@ bool TSFBridgeDelegate::Initialize() {
return true;
}
-void TSFBridgeDelegate::Shutdown() {
- DCHECK_EQ(base::MessageLoop::TYPE_UI, base::MessageLoop::current()->type());
- if (!IsInitialized())
- return;
- for (TSFDocumentMap::iterator it = tsf_document_map_.begin();
- it != tsf_document_map_.end(); ++it) {
- base::win::ScopedComPtr<ITfContext> context;
- base::win::ScopedComPtr<ITfSource> source;
- if (it->second.cookie != TF_INVALID_COOKIE &&
- SUCCEEDED(it->second.document_manager->GetBase(context.Receive())) &&
- SUCCEEDED(source.QueryFrom(context))) {
- source->UnadviseSink(it->second.cookie);
- }
- }
- tsf_document_map_.clear();
-
- client_id_ = TF_CLIENTID_NULL;
-}
-
void TSFBridgeDelegate::OnTextInputTypeChanged(TextInputClient* client) {
DCHECK_EQ(base::MessageLoop::TYPE_UI, base::MessageLoop::current()->type());
DCHECK(IsInitialized());
@@ -460,11 +453,14 @@ bool TSFBridge::Initialize() {
}
if (!tls_tsf_bridge.initialized()) {
tls_tsf_bridge.Initialize(TSFBridge::Finalize);
- TSFBridgeDelegate* delegate = new TSFBridgeDelegate();
- tls_tsf_bridge.Set(delegate);
- return delegate->Initialize();
}
- return true;
+ TSFBridgeDelegate* delegate =
+ static_cast<TSFBridgeDelegate*>(tls_tsf_bridge.Get());
+ if (delegate)
+ return true;
+ delegate = new TSFBridgeDelegate();
+ tls_tsf_bridge.Set(delegate);
+ return delegate->Initialize();
}
// static
@@ -479,6 +475,19 @@ TSFBridge* TSFBridge::ReplaceForTesting(TSFBridge* bridge) {
}
// static
+void TSFBridge::Shutdown() {
+ if (base::MessageLoop::current()->type() != base::MessageLoop::TYPE_UI) {
+ DVLOG(1) << "Do not use TSFBridge without UI thread.";
+ }
+ if (tls_tsf_bridge.initialized()) {
+ TSFBridgeDelegate* delegate =
+ static_cast<TSFBridgeDelegate*>(tls_tsf_bridge.Get());
+ tls_tsf_bridge.Set(NULL);
+ delete delegate;
+ }
+}
+
+// static
TSFBridge* TSFBridge::GetInstance() {
if (base::MessageLoop::current()->type() != base::MessageLoop::TYPE_UI) {
DVLOG(1) << "Do not use TSFBridge without UI thread.";
« no previous file with comments | « ui/base/ime/win/tsf_bridge.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698