Home | History | Annotate | Download | only in win
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef UI_BASE_IME_WIN_TSF_BRIDGE_H_
      6 #define UI_BASE_IME_WIN_TSF_BRIDGE_H_
      7 
      8 #include <Windows.h>
      9 #include <msctf.h>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/win/scoped_comptr.h"
     13 #include "ui/base/ui_export.h"
     14 
     15 namespace ui {
     16 class TextInputClient;
     17 
     18 // TSFBridge provides high level IME related operations on top of Text Services
     19 // Framework (TSF). TSFBridge is managed by TLS because TSF related stuff is
     20 // associated with each thread and not allowed to access across thread boundary.
     21 // To be consistent with IMM32 behavior, TSFBridge is shared in the same thread.
     22 // TSFBridge is used by the web content text inputting field, for example
     23 // DisableIME() should be called if a password field is focused.
     24 //
     25 // TSFBridge also manages connectivity between TSFTextStore which is the backend
     26 // of text inputting and current focused TextInputClient.
     27 //
     28 // All methods in this class must be used in UI thread.
     29 class UI_EXPORT TSFBridge {
     30  public:
     31   virtual ~TSFBridge();
     32 
     33   // Returns the thread local TSFBridge instance. Initialize() must be called
     34   // first. Do not cache this pointer and use it after TSFBridge Shutdown().
     35   static TSFBridge* GetInstance();
     36 
     37   // Sets the thread local instance. Must be called before any calls to
     38   // GetInstance().
     39   static bool Initialize();
     40 
     41   // Injects an alternative TSFBridge such as MockTSFBridge for testing. The
     42   // injected object should be released by the caller. This function returns
     43   // previous TSFBridge pointer with ownership.
     44   static TSFBridge* ReplaceForTesting(TSFBridge* bridge);
     45 
     46   // Destroys the thread local instance.
     47   static void Shutdown();
     48 
     49   // Handles TextInputTypeChanged event. RWHVW is responsible for calling this
     50   // handler whenever renderer's input text type is changed. Does nothing
     51   // unless |client| is focused.
     52   virtual void OnTextInputTypeChanged(const TextInputClient* client) = 0;
     53 
     54   // Sends an event to TSF manager that the text layout should be updated.
     55   virtual void OnTextLayoutChanged() = 0;
     56 
     57   // Cancels the ongoing composition if exists.
     58   // Returns true if there is no composition.
     59   // Returns false if an edit session is on-going.
     60   // Returns false if an error occures.
     61   virtual bool CancelComposition() = 0;
     62 
     63   // Confirms the ongoing composition if exists.
     64   // Returns true if there is no composition.
     65   // Returns false if an edit session is on-going.
     66   // Returns false if an error occures.
     67   virtual bool ConfirmComposition() = 0;
     68 
     69   // Sets currently focused TextInputClient.
     70   // Caller must free |client|.
     71   virtual void SetFocusedClient(HWND focused_window,
     72                                 TextInputClient* client) = 0;
     73 
     74   // Removes currently focused TextInputClient.
     75   // Caller must free |client|.
     76   virtual void RemoveFocusedClient(TextInputClient* client) = 0;
     77 
     78   // Obtains current thread manager.
     79   virtual base::win::ScopedComPtr<ITfThreadMgr> GetThreadManager() = 0;
     80 
     81   // Returns the focused text input client.
     82   virtual TextInputClient* GetFocusedTextInputClient() const = 0;
     83 
     84  protected:
     85   // Uses GetInstance() instead.
     86   TSFBridge();
     87 
     88  private:
     89   // Releases TLS instance.
     90   static void Finalize(void* data);
     91 
     92   DISALLOW_COPY_AND_ASSIGN(TSFBridge);
     93 };
     94 
     95 }  // namespace ui
     96 
     97 #endif  // UI_BASE_IME_WIN_TSF_BRIDGE_H_
     98