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 <map> 9 #include <set> 10 11 #include "base/files/file_path.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/observer_list.h" 14 #include "chromeos/chromeos_export.h" 15 #include "chromeos/ime/input_method_descriptor.h" 16 17 class Profile; 18 19 namespace chromeos { 20 21 // Represents an engine in component extension IME. 22 struct CHROMEOS_EXPORT ComponentExtensionEngine { 23 ComponentExtensionEngine(); 24 ~ComponentExtensionEngine(); 25 std::string engine_id; // The engine id. 26 std::string display_name; // The display name. 27 std::vector<std::string> language_codes; // The engine's language(ex. "en"). 28 std::string description; // The engine description. 29 std::vector<std::string> layouts; // The list of keyboard layout of engine. 30 GURL options_page_url; // an URL to option page. 31 GURL input_view_url; // an URL to input view page. 32 }; 33 34 // Represents a component extension IME. 35 struct CHROMEOS_EXPORT ComponentExtensionIME { 36 ComponentExtensionIME(); 37 ~ComponentExtensionIME(); 38 std::string id; // extension id. 39 std::string manifest; // the contents of manifest.json 40 std::string description; // description of extension. 41 GURL options_page_url; // an URL to option page. 42 base::FilePath path; 43 std::vector<ComponentExtensionEngine> engines; 44 }; 45 46 // Provides an interface to list/load/unload for component extension IME. 47 class CHROMEOS_EXPORT ComponentExtensionIMEManagerDelegate { 48 public: 49 ComponentExtensionIMEManagerDelegate(); 50 virtual ~ComponentExtensionIMEManagerDelegate(); 51 52 // Lists installed component extension IMEs. 53 virtual std::vector<ComponentExtensionIME> ListIME() = 0; 54 55 // Loads component extension IME associated with |extension_id|. 56 // Returns false if it fails, otherwise returns true. 57 virtual void Load(Profile* profile, 58 const std::string& extension_id, 59 const std::string& manifest, 60 const base::FilePath& path) = 0; 61 62 // Unloads component extension IME associated with |extension_id|. 63 virtual void Unload(Profile* profile, 64 const std::string& extension_id, 65 const base::FilePath& path) = 0; 66 }; 67 68 // This class manages component extension input method. 69 class CHROMEOS_EXPORT ComponentExtensionIMEManager { 70 public: 71 ComponentExtensionIMEManager(); 72 virtual ~ComponentExtensionIMEManager(); 73 74 // Initializes component extension manager. This function create internal 75 // mapping between input method id and engine components. This function must 76 // be called before using any other function. 77 void Initialize(scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate); 78 79 // Loads |input_method_id| component extension IME. This function returns true 80 // on success. This function is safe to call multiple times. Returns false if 81 // already corresponding component extension is loaded. 82 bool LoadComponentExtensionIME(Profile* profile, 83 const std::string& input_method_id); 84 85 // Unloads |input_method_id| component extension IME. This function returns 86 // true on success. This function is safe to call multiple times. Returns 87 // false if already corresponding component extension is unloaded. 88 bool UnloadComponentExtensionIME(Profile* profile, 89 const std::string& input_method_id); 90 91 // Returns true if |input_method_id| is whitelisted component extension input 92 // method. 93 bool IsWhitelisted(const std::string& input_method_id); 94 95 // Returns true if |extension_id| is whitelisted component extension. 96 bool IsWhitelistedExtension(const std::string& extension_id); 97 98 // Returns all IME as InputMethodDescriptors. 99 input_method::InputMethodDescriptors GetAllIMEAsInputMethodDescriptor(); 100 101 // Returns all XKB keyboard IME as InputMethodDescriptors. 102 input_method::InputMethodDescriptors GetXkbIMEAsInputMethodDescriptor(); 103 104 private: 105 // Finds ComponentExtensionIME and EngineDescription associated with 106 // |input_method_id|. This function retruns true if it is found, otherwise 107 // returns false. |out_extension| and |out_engine| can be NULL. 108 bool FindEngineEntry(const std::string& input_method_id, 109 ComponentExtensionIME* out_extension); 110 111 bool IsInLoginLayoutWhitelist(const std::vector<std::string>& layouts); 112 113 scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate_; 114 115 // The map of extension_id to ComponentExtensionIME instance. 116 // It's filled by Initialize() method and never changed during runtime. 117 std::map<std::string, ComponentExtensionIME> component_extension_imes_; 118 119 // For quick check the validity of a given input method id. 120 // It's filled by Initialize() method and never changed during runtime. 121 std::set<std::string> input_method_id_set_; 122 123 std::set<std::string> login_layout_set_; 124 125 DISALLOW_COPY_AND_ASSIGN(ComponentExtensionIMEManager); 126 }; 127 128 } // namespace chromeos 129 130 #endif // CHROMEOS_IME_COMPONENT_EXTENSION_IME_MANAGER_H_ 131