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

Side by Side Diff: chrome/browser/chromeos/input_method/component_extension_ime_manager_impl.cc

Issue 389913002: Moving IME manifests to chrome resources. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: modified per comments. Created 6 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/input_method/component_extension_ime_manager_i mpl.h" 5 #include "chrome/browser/chromeos/input_method/component_extension_ime_manager_i mpl.h"
6 6
7 #include <algorithm>
8
7 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/json/json_string_value_serializer.h"
8 #include "base/logging.h" 11 #include "base/logging.h"
9 #include "base/path_service.h" 12 #include "base/path_service.h"
10 #include "chrome/browser/extensions/component_loader.h" 13 #include "chrome/browser/extensions/component_loader.h"
11 #include "chrome/browser/extensions/extension_service.h" 14 #include "chrome/browser/extensions/extension_service.h"
12 #include "chrome/browser/profiles/profile.h" 15 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/profiles/profile_manager.h" 16 #include "chrome/browser/profiles/profile_manager.h"
14 #include "chrome/common/chrome_paths.h" 17 #include "chrome/common/chrome_paths.h"
15 #include "chrome/common/extensions/extension_constants.h" 18 #include "chrome/common/extensions/extension_constants.h"
16 #include "chrome/common/extensions/extension_file_util.h" 19 #include "chrome/common/extensions/extension_file_util.h"
17 #include "chromeos/ime/extension_ime_util.h" 20 #include "chromeos/ime/extension_ime_util.h"
18 #include "content/public/browser/browser_thread.h"
19 #include "extensions/browser/extension_system.h" 21 #include "extensions/browser/extension_system.h"
20 #include "extensions/common/extension.h" 22 #include "extensions/common/extension.h"
21 #include "extensions/common/extension_l10n_util.h" 23 #include "extensions/common/extension_l10n_util.h"
22 #include "extensions/common/file_util.h"
23 #include "extensions/common/manifest_constants.h" 24 #include "extensions/common/manifest_constants.h"
25 #include "grit/browser_resources.h"
26 #include "grit/generated_resources.h"
24 #include "ui/base/l10n/l10n_util.h" 27 #include "ui/base/l10n/l10n_util.h"
28 #include "ui/base/resource/resource_bundle.h"
25 29
26 namespace chromeos { 30 namespace chromeos {
27 31
28 namespace { 32 namespace {
29 33
30 struct WhitelistedComponentExtensionIME { 34 struct WhitelistedComponentExtensionIME {
31 const char* id; 35 const char* id;
32 const char* path; 36 int manifest_resource_id;
33 } whitelisted_component_extension[] = { 37 } whitelisted_component_extension[] = {
34 { 38 {// ChromeOS Hangul Input.
35 // ChromeOS Hangul Input. 39 extension_ime_util::kHangulExtensionId, IDR_HANGUL_MANIFEST,
36 extension_ime_util::kHangulExtensionId, 40 },
37 "/usr/share/chromeos-assets/input_methods/hangul", 41 {// Official Google XKB Input.
38 }, 42 extension_ime_util::kXkbExtensionId, IDR_GOOGLE_XKB_MANIFEST,
39 #if defined(OFFICIAL_BUILD) 43 },
40 { 44 {// Google input tools.
41 // Official Google XKB Input. 45 extension_ime_util::kT13nExtensionId, IDR_GOOGLE_INPUT_TOOLS_MANIFEST,
42 extension_ime_util::kXkbExtensionId, 46 },
43 "/usr/share/chromeos-assets/input_methods/google_xkb", 47 {// Open-sourced ChromeOS xkb extension.
44 }, 48 extension_ime_util::kXkbExtensionId, IDR_XKB_MANIFEST,
45 { 49 },
46 // Google input tools. 50 {// Open-sourced ChromeOS Keyboards extension.
47 extension_ime_util::kT13nExtensionId, 51 extension_ime_util::kM17nExtensionId, IDR_M17N_MANIFEST,
48 "/usr/share/chromeos-assets/input_methods/input_tools", 52 },
49 }, 53 {// Open-sourced Pinyin Chinese Input Method.
50 #else 54 extension_ime_util::kChinesePinyinExtensionId, IDR_PINYIN_MANIFEST,
51 { 55 },
52 // Open-sourced ChromeOS xkb extension. 56 {// Open-sourced Zhuyin Chinese Input Method.
53 extension_ime_util::kXkbExtensionId, 57 extension_ime_util::kChineseZhuyinExtensionId, IDR_ZHUYIN_MANIFEST,
54 "/usr/share/chromeos-assets/input_methods/xkb", 58 },
55 }, 59 {// Open-sourced Cangjie Chinese Input Method.
56 { 60 extension_ime_util::kChineseCangjieExtensionId, IDR_CANGJIE_MANIFEST,
57 // Open-sourced ChromeOS Keyboards extension. 61 },
58 extension_ime_util::kM17nExtensionId, 62 {// Japanese Mozc Input.
59 "/usr/share/chromeos-assets/input_methods/keyboard_layouts", 63 extension_ime_util::kMozcExtensionId, IDR_MOZC_MANIFEST,
60 }, 64 },
61 { 65 {// Braille hardware keyboard IME that works together with ChromeVox.
62 // Open-sourced Pinyin Chinese Input Method. 66 extension_misc::kBrailleImeExtensionId, IDR_BRAILLE_MANIFEST,
63 extension_ime_util::kChinesePinyinExtensionId, 67 },
64 "/usr/share/chromeos-assets/input_methods/pinyin",
65 },
66 {
67 // Open-sourced Zhuyin Chinese Input Method.
68 extension_ime_util::kChineseZhuyinExtensionId,
69 "/usr/share/chromeos-assets/input_methods/zhuyin",
70 },
71 {
72 // Open-sourced Cangjie Chinese Input Method.
73 extension_ime_util::kChineseCangjieExtensionId,
74 "/usr/share/chromeos-assets/input_methods/cangjie",
75 },
76 {
77 // Japanese Mozc Input.
78 extension_ime_util::kMozcExtensionId,
79 "/usr/share/chromeos-assets/input_methods/nacl_mozc",
80 },
81 #endif
82 {
83 // Braille hardware keyboard IME that works together with ChromeVox.
84 extension_misc::kBrailleImeExtensionId,
85 extension_misc::kBrailleImeExtensionPath,
86 },
87 }; 68 };
88 69
70 const struct InputMethodNameMap {
71 const char* message_name;
72 int resource_id;
73 bool operator<(const InputMethodNameMap& other) const {
74 return strcmp(message_name, other.message_name) < 0;
75 }
76 } kInputMethodNameMap[] = {
77 {"__MSG_INPUTMETHOD_ARRAY__", IDS_IME_NAME_INPUTMETHOD_ARRAY},
78 {"__MSG_INPUTMETHOD_CANGJIE__", IDS_IME_NAME_INPUTMETHOD_CANGJIE},
79 {"__MSG_INPUTMETHOD_DAYI__", IDS_IME_NAME_INPUTMETHOD_DAYI},
80 {"__MSG_INPUTMETHOD_HANGUL_2_SET__",
81 IDS_IME_NAME_INPUTMETHOD_HANGUL_2_SET},
82 {"__MSG_INPUTMETHOD_HANGUL_3_SET_390__",
83 IDS_IME_NAME_INPUTMETHOD_HANGUL_3_SET_390},
84 {"__MSG_INPUTMETHOD_HANGUL_3_SET_FINAL__",
85 IDS_IME_NAME_INPUTMETHOD_HANGUL_3_SET_FINAL},
86 {"__MSG_INPUTMETHOD_HANGUL_3_SET_NO_SHIFT__",
87 IDS_IME_NAME_INPUTMETHOD_HANGUL_3_SET_NO_SHIFT},
88 {"__MSG_INPUTMETHOD_HANGUL_AHNMATAE__",
89 IDS_IME_NAME_INPUTMETHOD_HANGUL_AHNMATAE},
90 {"__MSG_INPUTMETHOD_HANGUL_ROMAJA__",
91 IDS_IME_NAME_INPUTMETHOD_HANGUL_ROMAJA},
92 {"__MSG_INPUTMETHOD_MOZC_JP__", IDS_IME_NAME_INPUTMETHOD_MOZC_JP},
93 {"__MSG_INPUTMETHOD_MOZC_US__", IDS_IME_NAME_INPUTMETHOD_MOZC_US},
94 {"__MSG_INPUTMETHOD_PINYIN__", IDS_IME_NAME_INPUTMETHOD_PINYIN},
95 {"__MSG_INPUTMETHOD_QUICK__", IDS_IME_NAME_INPUTMETHOD_QUICK},
96 {"__MSG_INPUTMETHOD_TRADITIONAL_PINYIN__",
97 IDS_IME_NAME_INPUTMETHOD_TRADITIONAL_PINYIN},
98 {"__MSG_INPUTMETHOD_WUBI__", IDS_IME_NAME_INPUTMETHOD_WUBI},
99 {"__MSG_INPUTMETHOD_ZHUYIN__", IDS_IME_NAME_INPUTMETHOD_ZHUYIN},
100 {"__MSG_KEYBOARD_ARABIC__", IDS_IME_NAME_KEYBOARD_ARABIC},
101 {"__MSG_KEYBOARD_ARMENIAN_PHONETIC__",
102 IDS_IME_NAME_KEYBOARD_ARMENIAN_PHONETIC},
103 {"__MSG_KEYBOARD_BELARUSIAN__", IDS_IME_NAME_KEYBOARD_BELARUSIAN},
104 {"__MSG_KEYBOARD_BELGIAN__", IDS_IME_NAME_KEYBOARD_BELGIAN},
105 {"__MSG_KEYBOARD_BENGALI_PHONETIC__",
106 IDS_IME_NAME_KEYBOARD_BENGALI_PHONETIC},
107 {"__MSG_KEYBOARD_BRAZILIAN__", IDS_IME_NAME_KEYBOARD_BRAZILIAN},
108 {"__MSG_KEYBOARD_BULGARIAN_PHONETIC__",
109 IDS_IME_NAME_KEYBOARD_BULGARIAN_PHONETIC},
110 {"__MSG_KEYBOARD_BULGARIAN__", IDS_IME_NAME_KEYBOARD_BULGARIAN},
111 {"__MSG_KEYBOARD_CANADIAN_ENGLISH__",
112 IDS_IME_NAME_KEYBOARD_CANADIAN_ENGLISH},
113 {"__MSG_KEYBOARD_CANADIAN_FRENCH__",
114 IDS_IME_NAME_KEYBOARD_CANADIAN_FRENCH},
115 {"__MSG_KEYBOARD_CANADIAN_MULTILINGUAL__",
116 IDS_IME_NAME_KEYBOARD_CANADIAN_MULTILINGUAL},
117 {"__MSG_KEYBOARD_CATALAN__", IDS_IME_NAME_KEYBOARD_CATALAN},
118 {"__MSG_KEYBOARD_CROATIAN__", IDS_IME_NAME_KEYBOARD_CROATIAN},
119 {"__MSG_KEYBOARD_CZECH_QWERTY__", IDS_IME_NAME_KEYBOARD_CZECH_QWERTY},
120 {"__MSG_KEYBOARD_CZECH__", IDS_IME_NAME_KEYBOARD_CZECH},
121 {"__MSG_KEYBOARD_DANISH__", IDS_IME_NAME_KEYBOARD_DANISH},
122 {"__MSG_KEYBOARD_DEVANAGARI_PHONETIC__",
123 IDS_IME_NAME_KEYBOARD_DEVANAGARI_PHONETIC},
124 {"__MSG_KEYBOARD_ESTONIAN__", IDS_IME_NAME_KEYBOARD_ESTONIAN},
125 {"__MSG_KEYBOARD_ETHIOPIC__", IDS_IME_NAME_KEYBOARD_ETHIOPIC},
126 {"__MSG_KEYBOARD_FINNISH__", IDS_IME_NAME_KEYBOARD_FINNISH},
127 {"__MSG_KEYBOARD_FRENCH__", IDS_IME_NAME_KEYBOARD_FRENCH},
128 {"__MSG_KEYBOARD_GEORGIAN__", IDS_IME_NAME_KEYBOARD_GEORGIAN},
129 {"__MSG_KEYBOARD_GERMAN_NEO_2__", IDS_IME_NAME_KEYBOARD_GERMAN_NEO_2},
130 {"__MSG_KEYBOARD_GERMAN__", IDS_IME_NAME_KEYBOARD_GERMAN},
131 {"__MSG_KEYBOARD_GREEK__", IDS_IME_NAME_KEYBOARD_GREEK},
132 {"__MSG_KEYBOARD_GUJARATI_PHONETIC__",
133 IDS_IME_NAME_KEYBOARD_GUJARATI_PHONETIC},
134 {"__MSG_KEYBOARD_HEBREW__", IDS_IME_NAME_KEYBOARD_HEBREW},
135 {"__MSG_KEYBOARD_HUNGARIAN__", IDS_IME_NAME_KEYBOARD_HUNGARIAN},
136 {"__MSG_KEYBOARD_ICELANDIC__", IDS_IME_NAME_KEYBOARD_ICELANDIC},
137 {"__MSG_KEYBOARD_IRISH__", IDS_IME_NAME_KEYBOARD_IRISH},
138 {"__MSG_KEYBOARD_ITALIAN__", IDS_IME_NAME_KEYBOARD_ITALIAN},
139 {"__MSG_KEYBOARD_JAPANESE__", IDS_IME_NAME_KEYBOARD_JAPANESE},
140 {"__MSG_KEYBOARD_KANNADA_PHONETIC__",
141 IDS_IME_NAME_KEYBOARD_KANNADA_PHONETIC},
142 {"__MSG_KEYBOARD_KHMER__", IDS_IME_NAME_KEYBOARD_KHMER},
143 {"__MSG_KEYBOARD_LAO__", IDS_IME_NAME_KEYBOARD_LAO},
144 {"__MSG_KEYBOARD_LATIN_AMERICAN__", IDS_IME_NAME_KEYBOARD_LATIN_AMERICAN},
145 {"__MSG_KEYBOARD_LATVIAN__", IDS_IME_NAME_KEYBOARD_LATVIAN},
146 {"__MSG_KEYBOARD_LITHUANIAN__", IDS_IME_NAME_KEYBOARD_LITHUANIAN},
147 {"__MSG_KEYBOARD_MALAYALAM_PHONETIC__",
148 IDS_IME_NAME_KEYBOARD_MALAYALAM_PHONETIC},
149 {"__MSG_KEYBOARD_MONGOLIAN__", IDS_IME_NAME_KEYBOARD_MONGOLIAN},
150 {"__MSG_KEYBOARD_MYANMAR_MYANSAN__",
151 IDS_IME_NAME_KEYBOARD_MYANMAR_MYANSAN},
152 {"__MSG_KEYBOARD_MYANMAR__", IDS_IME_NAME_KEYBOARD_MYANMAR},
153 {"__MSG_KEYBOARD_NEPALI_INSCRIPT__",
154 IDS_IME_NAME_KEYBOARD_NEPALI_INSCRIPT},
155 {"__MSG_KEYBOARD_NEPALI_PHONETIC__",
156 IDS_IME_NAME_KEYBOARD_NEPALI_PHONETIC},
157 {"__MSG_KEYBOARD_NORWEGIAN__", IDS_IME_NAME_KEYBOARD_NORWEGIAN},
158 {"__MSG_KEYBOARD_PERSIAN__", IDS_IME_NAME_KEYBOARD_PERSIAN},
159 {"__MSG_KEYBOARD_POLISH__", IDS_IME_NAME_KEYBOARD_POLISH},
160 {"__MSG_KEYBOARD_PORTUGUESE__", IDS_IME_NAME_KEYBOARD_PORTUGUESE},
161 {"__MSG_KEYBOARD_ROMANIAN__", IDS_IME_NAME_KEYBOARD_ROMANIAN},
162 {"__MSG_KEYBOARD_RUSSIAN_PHONETIC__",
163 IDS_IME_NAME_KEYBOARD_RUSSIAN_PHONETIC},
164 {"__MSG_KEYBOARD_RUSSIAN__", IDS_IME_NAME_KEYBOARD_RUSSIAN},
165 {"__MSG_KEYBOARD_SERBIAN__", IDS_IME_NAME_KEYBOARD_SERBIAN},
166 {"__MSG_KEYBOARD_SINHALA__", IDS_IME_NAME_KEYBOARD_SINHALA},
167 {"__MSG_KEYBOARD_SLOVAKIAN__", IDS_IME_NAME_KEYBOARD_SLOVAKIAN},
168 {"__MSG_KEYBOARD_SLOVENIAN__", IDS_IME_NAME_KEYBOARD_SLOVENIAN},
169 {"__MSG_KEYBOARD_SORANIKURDISH_AR__",
170 IDS_IME_NAME_KEYBOARD_SORANIKURDISH_AR},
171 {"__MSG_KEYBOARD_SORANIKURDISH_EN__",
172 IDS_IME_NAME_KEYBOARD_SORANIKURDISH_EN},
173 {"__MSG_KEYBOARD_SPANISH__", IDS_IME_NAME_KEYBOARD_SPANISH},
174 {"__MSG_KEYBOARD_SWEDISH__", IDS_IME_NAME_KEYBOARD_SWEDISH},
175 {"__MSG_KEYBOARD_SWISS_FRENCH__", IDS_IME_NAME_KEYBOARD_SWISS_FRENCH},
176 {"__MSG_KEYBOARD_SWISS__", IDS_IME_NAME_KEYBOARD_SWISS},
177 {"__MSG_KEYBOARD_TAMIL_INSCRIPT__", IDS_IME_NAME_KEYBOARD_TAMIL_INSCRIPT},
178 {"__MSG_KEYBOARD_TAMIL_ITRANS__", IDS_IME_NAME_KEYBOARD_TAMIL_ITRANS},
179 {"__MSG_KEYBOARD_TAMIL_PHONETIC__", IDS_IME_NAME_KEYBOARD_TAMIL_PHONETIC},
180 {"__MSG_KEYBOARD_TAMIL_TAMIL99__", IDS_IME_NAME_KEYBOARD_TAMIL_TAMIL99},
181 {"__MSG_KEYBOARD_TAMIL_TYPEWRITER__",
182 IDS_IME_NAME_KEYBOARD_TAMIL_TYPEWRITER},
183 {"__MSG_KEYBOARD_TELUGU_PHONETIC__",
184 IDS_IME_NAME_KEYBOARD_TELUGU_PHONETIC},
185 {"__MSG_KEYBOARD_THAI_KEDMANEE__", IDS_IME_NAME_KEYBOARD_THAI_KEDMANEE},
186 {"__MSG_KEYBOARD_THAI_PATTACHOTE__",
187 IDS_IME_NAME_KEYBOARD_THAI_PATTACHOTE},
188 {"__MSG_KEYBOARD_THAI_TIS__", IDS_IME_NAME_KEYBOARD_THAI_TIS},
189 {"__MSG_KEYBOARD_TURKISH__", IDS_IME_NAME_KEYBOARD_TURKISH},
190 {"__MSG_KEYBOARD_UKRAINIAN__", IDS_IME_NAME_KEYBOARD_UKRAINIAN},
191 {"__MSG_KEYBOARD_UK_DVORAK__", IDS_IME_NAME_KEYBOARD_UK_DVORAK},
192 {"__MSG_KEYBOARD_UK__", IDS_IME_NAME_KEYBOARD_UK},
193 {"__MSG_KEYBOARD_US_COLEMAK__", IDS_IME_NAME_KEYBOARD_US_COLEMAK},
194 {"__MSG_KEYBOARD_US_DVORAK__", IDS_IME_NAME_KEYBOARD_US_DVORAK},
195 {"__MSG_KEYBOARD_US_EXTENDED__", IDS_IME_NAME_KEYBOARD_US_EXTENDED},
196 {"__MSG_KEYBOARD_US_INTERNATIONAL__",
197 IDS_IME_NAME_KEYBOARD_US_INTERNATIONAL},
198 {"__MSG_KEYBOARD_US__", IDS_IME_NAME_KEYBOARD_US},
199 {"__MSG_KEYBOARD_VIETNAMESE_TCVN__",
200 IDS_IME_NAME_KEYBOARD_VIETNAMESE_TCVN},
201 {"__MSG_KEYBOARD_VIETNAMESE_TELEX__",
202 IDS_IME_NAME_KEYBOARD_VIETNAMESE_TELEX},
203 {"__MSG_KEYBOARD_VIETNAMESE_VIQR__",
204 IDS_IME_NAME_KEYBOARD_VIETNAMESE_VIQR},
205 {"__MSG_KEYBOARD_VIETNAMESE_VNI__", IDS_IME_NAME_KEYBOARD_VIETNAMESE_VNI},
206 {"__MSG_TRANSLITERATION_AM__", IDS_IME_NAME_TRANSLITERATION_AM},
207 {"__MSG_TRANSLITERATION_AR__", IDS_IME_NAME_TRANSLITERATION_AR},
208 {"__MSG_TRANSLITERATION_BN__", IDS_IME_NAME_TRANSLITERATION_BN},
209 {"__MSG_TRANSLITERATION_EL__", IDS_IME_NAME_TRANSLITERATION_EL},
210 {"__MSG_TRANSLITERATION_FA__", IDS_IME_NAME_TRANSLITERATION_FA},
211 {"__MSG_TRANSLITERATION_GU__", IDS_IME_NAME_TRANSLITERATION_GU},
212 {"__MSG_TRANSLITERATION_HE__", IDS_IME_NAME_TRANSLITERATION_HE},
213 {"__MSG_TRANSLITERATION_HI__", IDS_IME_NAME_TRANSLITERATION_HI},
214 {"__MSG_TRANSLITERATION_KN__", IDS_IME_NAME_TRANSLITERATION_KN},
215 {"__MSG_TRANSLITERATION_ML__", IDS_IME_NAME_TRANSLITERATION_ML},
216 {"__MSG_TRANSLITERATION_MR__", IDS_IME_NAME_TRANSLITERATION_MR},
217 {"__MSG_TRANSLITERATION_NE__", IDS_IME_NAME_TRANSLITERATION_NE},
218 {"__MSG_TRANSLITERATION_OR__", IDS_IME_NAME_TRANSLITERATION_OR},
219 {"__MSG_TRANSLITERATION_PA__", IDS_IME_NAME_TRANSLITERATION_PA},
220 {"__MSG_TRANSLITERATION_SA__", IDS_IME_NAME_TRANSLITERATION_SA},
221 {"__MSG_TRANSLITERATION_SR__", IDS_IME_NAME_TRANSLITERATION_SR},
222 {"__MSG_TRANSLITERATION_TA__", IDS_IME_NAME_TRANSLITERATION_TA},
223 {"__MSG_TRANSLITERATION_TE__", IDS_IME_NAME_TRANSLITERATION_TE},
224 {"__MSG_TRANSLITERATION_TI__", IDS_IME_NAME_TRANSLITERATION_TI},
225 {"__MSG_TRANSLITERATION_UR__", IDS_IME_NAME_TRANSLITERATION_UR},
226 };
227
228 const char kImePathKeyName[] = "ime_path";
229
89 extensions::ComponentLoader* GetComponentLoader() { 230 extensions::ComponentLoader* GetComponentLoader() {
90 // TODO(skuhne, nkostylev): At this time the only thing which makes sense here 231 // TODO(skuhne, nkostylev): At this time the only thing which makes sense here
91 // is to use the active profile. Nkostylev is working on getting IME settings 232 // is to use the active profile. Nkostylev is working on getting IME settings
92 // to work for multi user by collecting all settings from all users. Once that 233 // to work for multi user by collecting all settings from all users. Once that
93 // is done we might have to re-visit this decision. 234 // is done we might have to re-visit this decision.
94 Profile* profile = ProfileManager::GetActiveUserProfile(); 235 Profile* profile = ProfileManager::GetActiveUserProfile();
95 extensions::ExtensionSystem* extension_system = 236 extensions::ExtensionSystem* extension_system =
96 extensions::ExtensionSystem::Get(profile); 237 extensions::ExtensionSystem::Get(profile);
97 ExtensionService* extension_service = extension_system->extension_service(); 238 ExtensionService* extension_service = extension_system->extension_service();
98 return extension_service->component_loader(); 239 return extension_service->component_loader();
99 } 240 }
100 } // namespace 241 } // namespace
101 242
102 ComponentExtensionIMEManagerImpl::ComponentExtensionIMEManagerImpl() 243 ComponentExtensionIMEManagerImpl::ComponentExtensionIMEManagerImpl()
103 : is_initialized_(false), 244 : weak_ptr_factory_(this) {
104 weak_ptr_factory_(this) { 245 ReadComponentExtensionsInfo(&component_extension_list_);
105 } 246 }
106 247
107 ComponentExtensionIMEManagerImpl::~ComponentExtensionIMEManagerImpl() { 248 ComponentExtensionIMEManagerImpl::~ComponentExtensionIMEManagerImpl() {
108 } 249 }
109 250
110 std::vector<ComponentExtensionIME> ComponentExtensionIMEManagerImpl::ListIME() { 251 std::vector<ComponentExtensionIME> ComponentExtensionIMEManagerImpl::ListIME() {
111 DCHECK(thread_checker_.CalledOnValidThread());
112 return component_extension_list_; 252 return component_extension_list_;
113 } 253 }
114 254
115 bool ComponentExtensionIMEManagerImpl::Load(const std::string& extension_id, 255 bool ComponentExtensionIMEManagerImpl::Load(const std::string& extension_id,
116 const std::string& manifest, 256 const std::string& manifest,
117 const base::FilePath& file_path) { 257 const base::FilePath& file_path) {
118 DCHECK(thread_checker_.CalledOnValidThread()); 258 if (!base::PathExists(file_path))
259 return false;
260
119 Profile* profile = ProfileManager::GetActiveUserProfile(); 261 Profile* profile = ProfileManager::GetActiveUserProfile();
120 extensions::ExtensionSystem* extension_system = 262 extensions::ExtensionSystem* extension_system =
121 extensions::ExtensionSystem::Get(profile); 263 extensions::ExtensionSystem::Get(profile);
122 ExtensionService* extension_service = extension_system->extension_service(); 264 ExtensionService* extension_service = extension_system->extension_service();
123 if (extension_service->GetExtensionById(extension_id, false)) 265 if (extension_service->GetExtensionById(extension_id, false))
124 return false; 266 return false;
125 const std::string loaded_extension_id = 267 const std::string loaded_extension_id =
126 GetComponentLoader()->Add(manifest, file_path); 268 GetComponentLoader()->Add(manifest, file_path);
127 DCHECK_EQ(loaded_extension_id, extension_id); 269 DCHECK_EQ(loaded_extension_id, extension_id);
128 return true; 270 return true;
129 } 271 }
130 272
131 void ComponentExtensionIMEManagerImpl::Unload(const std::string& extension_id, 273 void ComponentExtensionIMEManagerImpl::Unload(const std::string& extension_id,
132 const base::FilePath& file_path) { 274 const base::FilePath& file_path) {
133 DCHECK(thread_checker_.CalledOnValidThread());
134 // Remove(extension_id) does nothing when the extension has already been 275 // Remove(extension_id) does nothing when the extension has already been
135 // removed or not been registered. 276 // removed or not been registered.
136 GetComponentLoader()->Remove(extension_id); 277 GetComponentLoader()->Remove(extension_id);
137 } 278 }
138 279
139 scoped_ptr<base::DictionaryValue> ComponentExtensionIMEManagerImpl::GetManifest( 280 scoped_ptr<base::DictionaryValue> ComponentExtensionIMEManagerImpl::GetManifest(
140 const base::FilePath& file_path) { 281 const std::string& manifest_string) {
141 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
142 std::string error; 282 std::string error;
143 scoped_ptr<base::DictionaryValue> manifest( 283 JSONStringValueSerializer serializer(manifest_string);
144 extensions::file_util::LoadManifest(file_path, &error)); 284 scoped_ptr<base::Value> manifest(serializer.Deserialize(NULL, &error));
145 if (!manifest.get()) 285 if (!manifest.get())
146 LOG(ERROR) << "Failed at getting manifest"; 286 LOG(ERROR) << "Failed at getting manifest";
147 if (!extension_l10n_util::LocalizeExtension(file_path,
148 manifest.get(),
149 &error)) {
150 LOG(ERROR) << "Localization failed for: " << file_path.value()
151 << " Error: " << error;
152 }
153 return manifest.Pass();
154 }
155 287
156 void ComponentExtensionIMEManagerImpl::InitializeAsync( 288 return scoped_ptr<base::DictionaryValue>(
157 const base::Closure& callback) { 289 static_cast<base::DictionaryValue*>(manifest.release())).Pass();
158 DCHECK(!is_initialized_);
159 DCHECK(thread_checker_.CalledOnValidThread());
160
161 std::vector<ComponentExtensionIME>* component_extension_ime_list
162 = new std::vector<ComponentExtensionIME>;
163 content::BrowserThread::PostTaskAndReply(
164 content::BrowserThread::FILE,
165 FROM_HERE,
166 base::Bind(&ComponentExtensionIMEManagerImpl::ReadComponentExtensionsInfo,
167 base::Unretained(component_extension_ime_list)),
168 base::Bind(
169 &ComponentExtensionIMEManagerImpl::OnReadComponentExtensionsInfo,
170 weak_ptr_factory_.GetWeakPtr(),
171 base::Owned(component_extension_ime_list),
172 callback));
173 }
174
175 bool ComponentExtensionIMEManagerImpl::IsInitialized() {
176 return is_initialized_;
177 } 290 }
178 291
179 // static 292 // static
180 bool ComponentExtensionIMEManagerImpl::ReadEngineComponent( 293 bool ComponentExtensionIMEManagerImpl::ReadEngineComponent(
181 const ComponentExtensionIME& component_extension, 294 const ComponentExtensionIME& component_extension,
182 const base::DictionaryValue& dict, 295 const base::DictionaryValue& dict,
183 ComponentExtensionEngine* out) { 296 ComponentExtensionEngine* out) {
184 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
185 DCHECK(out); 297 DCHECK(out);
186 std::string type; 298 std::string type;
187 if (!dict.GetString(extensions::manifest_keys::kType, &type)) 299 if (!dict.GetString(extensions::manifest_keys::kType, &type))
188 return false; 300 return false;
189 if (type != "ime") 301 if (type != "ime")
190 return false; 302 return false;
191 if (!dict.GetString(extensions::manifest_keys::kId, &out->engine_id)) 303 if (!dict.GetString(extensions::manifest_keys::kId, &out->engine_id))
192 return false; 304 return false;
193 if (!dict.GetString(extensions::manifest_keys::kName, &out->display_name)) 305 if (!dict.GetString(extensions::manifest_keys::kName, &out->display_name))
194 return false; 306 return false;
195 307
308 // Localizes the input method name.
309 if (out->display_name.find("__MSG_") == 0) {
310 const InputMethodNameMap* map = kInputMethodNameMap;
311 size_t map_size = arraysize(kInputMethodNameMap);
312 std::string name = StringToUpperASCII(out->display_name);
313 const InputMethodNameMap map_key = {name.c_str(), 0};
314 const InputMethodNameMap* p =
315 std::lower_bound(map, map + map_size, map_key);
316 if (p != map + map_size && !(*p < map_key) && !(map_key < *p))
Nico 2014/07/23 01:03:10 nit: if (p != map + map_size && name == p->messa
Shu Chen 2014/07/23 03:05:54 Done. Thanks for the good idea. :)
317 out->display_name = l10n_util::GetStringUTF8(p->resource_id);
318 }
319 DCHECK(out->display_name.find("__MSG_") == std::string::npos);
320
196 std::set<std::string> languages; 321 std::set<std::string> languages;
197 const base::Value* language_value = NULL; 322 const base::Value* language_value = NULL;
198 if (dict.Get(extensions::manifest_keys::kLanguage, &language_value)) { 323 if (dict.Get(extensions::manifest_keys::kLanguage, &language_value)) {
199 if (language_value->GetType() == base::Value::TYPE_STRING) { 324 if (language_value->GetType() == base::Value::TYPE_STRING) {
200 std::string language_str; 325 std::string language_str;
201 language_value->GetAsString(&language_str); 326 language_value->GetAsString(&language_str);
202 languages.insert(language_str); 327 languages.insert(language_str);
203 } else if (language_value->GetType() == base::Value::TYPE_LIST) { 328 } else if (language_value->GetType() == base::Value::TYPE_LIST) {
204 const base::ListValue* language_list = NULL; 329 const base::ListValue* language_list = NULL;
205 language_value->GetAsList(&language_list); 330 language_value->GetAsList(&language_list);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 } 375 }
251 376
252 return true; 377 return true;
253 } 378 }
254 379
255 // static 380 // static
256 bool ComponentExtensionIMEManagerImpl::ReadExtensionInfo( 381 bool ComponentExtensionIMEManagerImpl::ReadExtensionInfo(
257 const base::DictionaryValue& manifest, 382 const base::DictionaryValue& manifest,
258 const std::string& extension_id, 383 const std::string& extension_id,
259 ComponentExtensionIME* out) { 384 ComponentExtensionIME* out) {
260 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
261 if (!manifest.GetString(extensions::manifest_keys::kDescription, 385 if (!manifest.GetString(extensions::manifest_keys::kDescription,
262 &out->description)) 386 &out->description))
263 return false; 387 return false;
388 std::string path;
389 if (manifest.GetString(kImePathKeyName, &path))
390 out->path = base::FilePath(path);
264 std::string url_string; 391 std::string url_string;
265 if (manifest.GetString(extensions::manifest_keys::kOptionsPage, 392 if (manifest.GetString(extensions::manifest_keys::kOptionsPage,
266 &url_string)) { 393 &url_string)) {
267 GURL url = extensions::Extension::GetResourceURL( 394 GURL url = extensions::Extension::GetResourceURL(
268 extensions::Extension::GetBaseURLFromExtensionId(extension_id), 395 extensions::Extension::GetBaseURLFromExtensionId(extension_id),
269 url_string); 396 url_string);
270 if (!url.is_valid()) 397 if (!url.is_valid())
271 return false; 398 return false;
272 out->options_page_url = url; 399 out->options_page_url = url;
273 } 400 }
274 // It's okay to return true on no option page and/or input view page case. 401 // It's okay to return true on no option page and/or input view page case.
275 return true; 402 return true;
276 } 403 }
277 404
278 // static 405 // static
279 void ComponentExtensionIMEManagerImpl::ReadComponentExtensionsInfo( 406 void ComponentExtensionIMEManagerImpl::ReadComponentExtensionsInfo(
280 std::vector<ComponentExtensionIME>* out_imes) { 407 std::vector<ComponentExtensionIME>* out_imes) {
281 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
282 DCHECK(out_imes); 408 DCHECK(out_imes);
283 for (size_t i = 0; i < arraysize(whitelisted_component_extension); ++i) { 409 for (size_t i = 0; i < arraysize(whitelisted_component_extension); ++i) {
284 ComponentExtensionIME component_ime; 410 ComponentExtensionIME component_ime;
285 component_ime.path = base::FilePath( 411 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
286 whitelisted_component_extension[i].path); 412 component_ime.manifest =
287 413 rb.GetRawDataResource(
288 if (!component_ime.path.IsAbsolute()) { 414 whitelisted_component_extension[i].manifest_resource_id)
289 base::FilePath resources_path; 415 .as_string();
290 if (!PathService::Get(chrome::DIR_RESOURCES, &resources_path)) 416 if (component_ime.manifest.empty())
291 NOTREACHED();
292 component_ime.path = resources_path.Append(component_ime.path);
293 }
294 const base::FilePath manifest_path =
295 component_ime.path.Append("manifest.json");
296
297 if (!base::PathExists(component_ime.path) ||
298 !base::PathExists(manifest_path))
299 continue;
300
301 if (!base::ReadFileToString(manifest_path, &component_ime.manifest))
302 continue; 417 continue;
303 418
304 scoped_ptr<base::DictionaryValue> manifest = 419 scoped_ptr<base::DictionaryValue> manifest =
305 GetManifest(component_ime.path); 420 GetManifest(component_ime.manifest);
306 if (!manifest.get()) 421 if (!manifest.get())
307 continue; 422 continue;
308 423
309 if (!ReadExtensionInfo(*manifest.get(), 424 if (!ReadExtensionInfo(*manifest.get(),
310 whitelisted_component_extension[i].id, 425 whitelisted_component_extension[i].id,
311 &component_ime)) 426 &component_ime))
312 continue; 427 continue;
313 component_ime.id = whitelisted_component_extension[i].id; 428 component_ime.id = whitelisted_component_extension[i].id;
314 429
430 if (!component_ime.path.IsAbsolute()) {
431 base::FilePath resources_path;
432 if (!PathService::Get(chrome::DIR_RESOURCES, &resources_path))
433 NOTREACHED();
434 component_ime.path = resources_path.Append(component_ime.path);
435 }
436
315 const base::ListValue* component_list; 437 const base::ListValue* component_list;
316 if (!manifest->GetList(extensions::manifest_keys::kInputComponents, 438 if (!manifest->GetList(extensions::manifest_keys::kInputComponents,
317 &component_list)) 439 &component_list))
318 continue; 440 continue;
319 441
320 for (size_t i = 0; i < component_list->GetSize(); ++i) { 442 for (size_t i = 0; i < component_list->GetSize(); ++i) {
321 const base::DictionaryValue* dictionary; 443 const base::DictionaryValue* dictionary;
322 if (!component_list->GetDictionary(i, &dictionary)) 444 if (!component_list->GetDictionary(i, &dictionary))
323 continue; 445 continue;
324 446
325 ComponentExtensionEngine engine; 447 ComponentExtensionEngine engine;
326 ReadEngineComponent(component_ime, *dictionary, &engine); 448 ReadEngineComponent(component_ime, *dictionary, &engine);
327 component_ime.engines.push_back(engine); 449 component_ime.engines.push_back(engine);
328 } 450 }
329 out_imes->push_back(component_ime); 451 out_imes->push_back(component_ime);
330 } 452 }
331 } 453 }
332 454
333 void ComponentExtensionIMEManagerImpl::OnReadComponentExtensionsInfo(
334 std::vector<ComponentExtensionIME>* result,
335 const base::Closure& callback) {
336 DCHECK(thread_checker_.CalledOnValidThread());
337 DCHECK(result);
338 component_extension_list_ = *result;
339 is_initialized_ = true;
340 callback.Run();
341 }
342
343 } // namespace chromeos 455 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698