• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 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 CHROMEOS_IME_COMPONENT_EXTENSION_IME_MANAGER_H_
6 #define CHROMEOS_IME_COMPONENT_EXTENSION_IME_MANAGER_H_
7 
8 #include <set>
9 
10 #include "base/files/file_path.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/observer_list.h"
13 #include "chromeos/chromeos_export.h"
14 #include "chromeos/ime/input_method_descriptor.h"
15 
16 namespace chromeos {
17 
18 // Represents an engine in component extension IME.
19 struct CHROMEOS_EXPORT ComponentExtensionEngine {
20   ComponentExtensionEngine();
21   ~ComponentExtensionEngine();
22   std::string engine_id;  // The engine id.
23   std::string display_name;  // The display name.
24   std::vector<std::string> language_codes;  // The engine's language(ex. "en").
25   std::string description;  // The engine description.
26   std::vector<std::string> layouts;  // The list of keyboard layout of engine.
27   GURL options_page_url; // an URL to option page.
28   GURL input_view_url; // an URL to input view page.
29 };
30 
31 // Represents a component extension IME.
32 struct CHROMEOS_EXPORT ComponentExtensionIME {
33   ComponentExtensionIME();
34   ~ComponentExtensionIME();
35   std::string id;  // extension id.
36   std::string manifest;  // the contents of manifest.json
37   std::string description;  // description of extension.
38   GURL options_page_url; // an URL to option page.
39   base::FilePath path;
40   std::vector<ComponentExtensionEngine> engines;
41 };
42 
43 // Provides an interface to list/load/unload for component extension IME.
44 class CHROMEOS_EXPORT ComponentExtensionIMEManagerDelegate {
45  public:
46   ComponentExtensionIMEManagerDelegate();
47   virtual ~ComponentExtensionIMEManagerDelegate();
48 
49   // Lists installed component extension IMEs.
50   virtual std::vector<ComponentExtensionIME> ListIME() = 0;
51 
52   // Loads component extension IME associated with |extension_id|.
53   // Returns false if it fails, otherwise returns true.
54   virtual bool Load(const std::string& extension_id,
55                     const std::string& manifest,
56                     const base::FilePath& path) = 0;
57 
58   // Unloads component extension IME associated with |extension_id|.
59   virtual void Unload(const std::string& extension_id,
60                       const base::FilePath& path) = 0;
61 };
62 
63 // This class manages component extension input method.
64 class CHROMEOS_EXPORT ComponentExtensionIMEManager {
65  public:
66   class Observer {
67    public:
68     // Called when the initialization is done.
69     virtual void OnImeComponentExtensionInitialized() = 0;
70   };
71 
72   ComponentExtensionIMEManager();
73   virtual ~ComponentExtensionIMEManager();
74 
75   // Initializes component extension manager. This function create internal
76   // mapping between input method id and engine components. This function must
77   // be called before using any other function.
78   void Initialize(scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate);
79 
80   // Notifies the observers for the component extension IMEs are initialized.
81   void NotifyInitialized();
82 
83   // Returns true if the initialization is done, otherwise returns false.
84   bool IsInitialized();
85 
86   // Loads |input_method_id| component extension IME. This function returns true
87   // on success. This function is safe to call multiple times. Returns false if
88   // already corresponding component extension is loaded.
89   bool LoadComponentExtensionIME(const std::string& input_method_id);
90 
91   // Unloads |input_method_id| component extension IME. This function returns
92   // true on success. This function is safe to call multiple times. Returns
93   // false if already corresponding component extension is unloaded.
94   bool UnloadComponentExtensionIME(const std::string& input_method_id);
95 
96   // Returns true if |input_method_id| is whitelisted component extension input
97   // method.
98   bool IsWhitelisted(const std::string& input_method_id);
99 
100   // Returns true if |extension_id| is whitelisted component extension.
101   bool IsWhitelistedExtension(const std::string& extension_id);
102 
103   // Returns InputMethodId. This function returns empty string if |extension_id|
104   // and |engine_id| is not a whitelisted component extention IME.
105   std::string GetId(const std::string& extension_id,
106                     const std::string& engine_id);
107 
108   // Returns localized name of |input_method_id|.
109   std::string GetName(const std::string& input_method_id);
110 
111   // Returns localized description of |input_method_id|.
112   std::string GetDescription(const std::string& input_method_id);
113 
114   // Returns list of input method id associated with |language|.
115   std::vector<std::string> ListIMEByLanguage(const std::string& language);
116 
117   // Returns all IME as InputMethodDescriptors.
118   input_method::InputMethodDescriptors GetAllIMEAsInputMethodDescriptor();
119 
120   // Returns all XKB keyboard IME as InputMethodDescriptors.
121   input_method::InputMethodDescriptors GetXkbIMEAsInputMethodDescriptor();
122 
123   void AddObserver(Observer* observer);
124   void RemoveObserver(Observer* observer);
125 
126  private:
127   // Finds ComponentExtensionIME and EngineDescription associated with
128   // |input_method_id|. This function retruns true if it is found, otherwise
129   // returns false. |out_extension| and |out_engine| can be NULL.
130   bool FindEngineEntry(const std::string& input_method_id,
131                        ComponentExtensionIME* out_extension,
132                        ComponentExtensionEngine* out_engine);
133 
134   bool IsInLoginLayoutWhitelist(const std::vector<std::string>& layouts);
135 
136   scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate_;
137 
138   std::vector<ComponentExtensionIME> component_extension_imes_;
139 
140   ObserverList<Observer> observers_;
141 
142   bool is_initialized_;
143 
144   bool was_initialization_notified_;
145 
146   std::set<std::string> login_layout_set_;
147 
148   DISALLOW_COPY_AND_ASSIGN(ComponentExtensionIMEManager);
149 };
150 
151 }  // namespace chromeos
152 
153 #endif  // CHROMEOS_IME_COMPONENT_EXTENSION_IME_MANAGER_H_
154