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

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: . 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,
36 extension_ime_util::kHangulExtensionId, 40 IDR_HANGUL_MANIFEST,
37 "/usr/share/chromeos-assets/input_methods/hangul", 41 },
38 }, 42 {// Official Google XKB Input.
39 #if defined(OFFICIAL_BUILD) 43 extension_ime_util::kXkbExtensionId,
40 { 44 IDR_GOOGLE_XKB_MANIFEST,
41 // Official Google XKB Input. 45 },
42 extension_ime_util::kXkbExtensionId, 46 {// Google input tools.
43 "/usr/share/chromeos-assets/input_methods/google_xkb", 47 extension_ime_util::kT13nExtensionId,
44 }, 48 IDR_GOOGLE_INPUT_TOOLS_MANIFEST,
45 { 49 },
46 // Google input tools. 50 {// Open-sourced ChromeOS xkb extension.
47 extension_ime_util::kT13nExtensionId, 51 extension_ime_util::kXkbExtensionId,
48 "/usr/share/chromeos-assets/input_methods/input_tools", 52 IDR_XKB_MANIFEST,
49 }, 53 },
50 #else 54 {// Open-sourced ChromeOS Keyboards extension.
51 { 55 extension_ime_util::kM17nExtensionId,
52 // Open-sourced ChromeOS xkb extension. 56 IDR_M17N_MANIFEST,
53 extension_ime_util::kXkbExtensionId, 57 },
54 "/usr/share/chromeos-assets/input_methods/xkb", 58 {// Open-sourced Pinyin Chinese Input Method.
55 }, 59 extension_ime_util::kChinesePinyinExtensionId,
56 { 60 IDR_PINYIN_MANIFEST,
57 // Open-sourced ChromeOS Keyboards extension. 61 },
58 extension_ime_util::kM17nExtensionId, 62 {// Open-sourced Zhuyin Chinese Input Method.
59 "/usr/share/chromeos-assets/input_methods/keyboard_layouts", 63 extension_ime_util::kChineseZhuyinExtensionId,
60 }, 64 IDR_ZHUYIN_MANIFEST,
61 { 65 },
62 // Open-sourced Pinyin Chinese Input Method. 66 {// Open-sourced Cangjie Chinese Input Method.
63 extension_ime_util::kChinesePinyinExtensionId, 67 extension_ime_util::kChineseCangjieExtensionId,
64 "/usr/share/chromeos-assets/input_methods/pinyin", 68 IDR_CANGJIE_MANIFEST,
65 }, 69 },
66 { 70 {// Japanese Mozc Input.
67 // Open-sourced Zhuyin Chinese Input Method. 71 extension_ime_util::kMozcExtensionId,
68 extension_ime_util::kChineseZhuyinExtensionId, 72 IDR_MOZC_MANIFEST,
69 "/usr/share/chromeos-assets/input_methods/zhuyin", 73 },
70 }, 74 {// Braille hardware keyboard IME that works together with ChromeVox.
71 { 75 extension_misc::kBrailleImeExtensionId,
72 // Open-sourced Cangjie Chinese Input Method. 76 IDR_BRAILLE_MANIFEST,
73 extension_ime_util::kChineseCangjieExtensionId, 77 },
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 }; 78 };
88 79
80 const struct InputMethodNameMap {
81 const char* message_name;
82 int resource_id;
83 bool operator()(const InputMethodNameMap& m1,
84 const InputMethodNameMap& m2) const {
85 return strcmp(m1.message_name, m2.message_name) < 0;
86 }
87 } kInputMethodNameMap[] = {
88 {"__MSG_ARMENIAN_PHONETIC_KEYBOARD__",
89 IDS_IME_NAME_ARMENIAN_PHONETIC_KEYBOARD},
90 {"__MSG_ARRAY_INPUTMETHOD__", IDS_IME_NAME_ARRAY_INPUTMETHOD},
91 {"__MSG_BELARUSIAN_KEYBOARD__", IDS_IME_NAME_BELARUSIAN_KEYBOARD},
92 {"__MSG_BELGIAN_KEYBOARD__", IDS_IME_NAME_BELGIAN_KEYBOARD},
93 {"__MSG_BRAZILIAN_KEYBOARD__", IDS_IME_NAME_BRAZILIAN_KEYBOARD},
94 {"__MSG_BULGARIAN_KEYBOARD__", IDS_IME_NAME_BULGARIAN_KEYBOARD},
95 {"__MSG_BULGARIAN_PHONETIC_KEYBOARD__",
96 IDS_IME_NAME_BULGARIAN_PHONETIC_KEYBOARD},
97 {"__MSG_CANADIAN_ENGLISH_KEYBOARD__",
98 IDS_IME_NAME_CANADIAN_ENGLISH_KEYBOARD},
99 {"__MSG_CANADIAN_FRENCH_KEYBOARD__",
100 IDS_IME_NAME_CANADIAN_FRENCH_KEYBOARD},
101 {"__MSG_CANADIAN_MULTILINGUAL_KEYBOARD__",
102 IDS_IME_NAME_CANADIAN_MULTILINGUAL_KEYBOARD},
103 {"__MSG_CANGJIE_INPUTMETHOD__", IDS_IME_NAME_CANGJIE_INPUTMETHOD},
104 {"__MSG_CATALAN_KEYBOARD__", IDS_IME_NAME_CATALAN_KEYBOARD},
105 {"__MSG_CROATIAN_KEYBOARD__", IDS_IME_NAME_CROATIAN_KEYBOARD},
106 {"__MSG_CZECH_KEYBOARD__", IDS_IME_NAME_CZECH_KEYBOARD},
107 {"__MSG_CZECH_QWERTY_KEYBOARD__", IDS_IME_NAME_CZECH_QWERTY_KEYBOARD},
108 {"__MSG_DANISH_KEYBOARD__", IDS_IME_NAME_DANISH_KEYBOARD},
109 {"__MSG_DAYI_INPUTMETHOD__", IDS_IME_NAME_DAYI_INPUTMETHOD},
110 {"__MSG_ESTONIAN_KEYBOARD__", IDS_IME_NAME_ESTONIAN_KEYBOARD},
111 {"__MSG_FINNISH_KEYBOARD__", IDS_IME_NAME_FINNISH_KEYBOARD},
112 {"__MSG_FRENCH_KEYBOARD__", IDS_IME_NAME_FRENCH_KEYBOARD},
113 {"__MSG_GEORGIAN_KEYBOARD__", IDS_IME_NAME_GEORGIAN_KEYBOARD},
114 {"__MSG_GERMAN_KEYBOARD__", IDS_IME_NAME_GERMAN_KEYBOARD},
115 {"__MSG_GERMAN_NEO_2_KEYBOARD__", IDS_IME_NAME_GERMAN_NEO_2_KEYBOARD},
116 {"__MSG_GREEK_KEYBOARD__", IDS_IME_NAME_GREEK_KEYBOARD},
117 {"__MSG_HANGUL_2_SET__", IDS_IME_NAME_HANGUL_2_SET},
118 {"__MSG_HANGUL_3_SET_390__", IDS_IME_NAME_HANGUL_3_SET_390},
119 {"__MSG_HANGUL_3_SET_FINAL__", IDS_IME_NAME_HANGUL_3_SET_FINAL},
120 {"__MSG_HANGUL_3_SET_NO_SHIFT__", IDS_IME_NAME_HANGUL_3_SET_NO_SHIFT},
121 {"__MSG_HANGUL_AHNMATAE__", IDS_IME_NAME_HANGUL_AHNMATAE},
122 {"__MSG_HANGUL_ROMAJA__", IDS_IME_NAME_HANGUL_ROMAJA},
123 {"__MSG_HEBREW_KEYBOARD__", IDS_IME_NAME_HEBREW_KEYBOARD},
124 {"__MSG_HUNGARIAN_KEYBOARD__", IDS_IME_NAME_HUNGARIAN_KEYBOARD},
125 {"__MSG_ICELANDIC_KEYBOARD__", IDS_IME_NAME_ICELANDIC_KEYBOARD},
126 {"__MSG_IRISH_KEYBOARD__", IDS_IME_NAME_IRISH_KEYBOARD},
127 {"__MSG_ITALIAN_KEYBOARD__", IDS_IME_NAME_ITALIAN_KEYBOARD},
128 {"__MSG_JAPANESE_KEYBOARD__", IDS_IME_NAME_JAPANESE_KEYBOARD},
129 {"__MSG_KEYBOARD_ARABIC__", IDS_IME_NAME_KEYBOARD_ARABIC},
130 {"__MSG_KEYBOARD_BENGALI_PHONETIC__",
131 IDS_IME_NAME_KEYBOARD_BENGALI_PHONETIC},
132 {"__MSG_KEYBOARD_DEVANAGARI_PHONETIC__",
133 IDS_IME_NAME_KEYBOARD_DEVANAGARI_PHONETIC},
134 {"__MSG_KEYBOARD_ETHIOPIC__", IDS_IME_NAME_KEYBOARD_ETHIOPIC},
135 {"__MSG_KEYBOARD_GUJARATI_PHONETIC__",
136 IDS_IME_NAME_KEYBOARD_GUJARATI_PHONETIC},
137 {"__MSG_KEYBOARD_KANNADA_PHONETIC__",
138 IDS_IME_NAME_KEYBOARD_KANNADA_PHONETIC},
139 {"__MSG_KEYBOARD_KHMER__", IDS_IME_NAME_KEYBOARD_KHMER},
140 {"__MSG_KEYBOARD_LAO__", IDS_IME_NAME_KEYBOARD_LAO},
141 {"__MSG_KEYBOARD_MALAYALAM_PHONETIC__",
142 IDS_IME_NAME_KEYBOARD_MALAYALAM_PHONETIC},
143 {"__MSG_KEYBOARD_MYANMAR_MYANSAN__",
144 IDS_IME_NAME_KEYBOARD_MYANMAR_MYANSAN},
145 {"__MSG_KEYBOARD_MYANMAR__", IDS_IME_NAME_KEYBOARD_MYANMAR},
146 {"__MSG_KEYBOARD_NEPALI_INSCRIPT__",
147 IDS_IME_NAME_KEYBOARD_NEPALI_INSCRIPT},
148 {"__MSG_KEYBOARD_NEPALI_PHONETIC__",
149 IDS_IME_NAME_KEYBOARD_NEPALI_PHONETIC},
150 {"__MSG_KEYBOARD_PERSIAN__", IDS_IME_NAME_KEYBOARD_PERSIAN},
151 {"__MSG_KEYBOARD_SINHALA__", IDS_IME_NAME_KEYBOARD_SINHALA},
152 {"__MSG_KEYBOARD_SORANIKURDISH_AR__",
153 IDS_IME_NAME_KEYBOARD_SORANIKURDISH_AR},
154 {"__MSG_KEYBOARD_SORANIKURDISH_EN__",
155 IDS_IME_NAME_KEYBOARD_SORANIKURDISH_EN},
156 {"__MSG_KEYBOARD_TAMIL_INSCRIPT__", IDS_IME_NAME_KEYBOARD_TAMIL_INSCRIPT},
157 {"__MSG_KEYBOARD_TAMIL_ITRANS__", IDS_IME_NAME_KEYBOARD_TAMIL_ITRANS},
158 {"__MSG_KEYBOARD_TAMIL_PHONETIC__", IDS_IME_NAME_KEYBOARD_TAMIL_PHONETIC},
159 {"__MSG_KEYBOARD_TAMIL_TAMIL99__", IDS_IME_NAME_KEYBOARD_TAMIL_TAMIL99},
160 {"__MSG_KEYBOARD_TAMIL_TYPEWRITER__",
161 IDS_IME_NAME_KEYBOARD_TAMIL_TYPEWRITER},
162 {"__MSG_KEYBOARD_TELUGU_PHONETIC__",
163 IDS_IME_NAME_KEYBOARD_TELUGU_PHONETIC},
164 {"__MSG_KEYBOARD_THAI_KEDMANEE__", IDS_IME_NAME_KEYBOARD_THAI_KEDMANEE},
165 {"__MSG_KEYBOARD_THAI_PATTACHOTE__",
166 IDS_IME_NAME_KEYBOARD_THAI_PATTACHOTE},
167 {"__MSG_KEYBOARD_THAI_TIS__", IDS_IME_NAME_KEYBOARD_THAI_TIS},
168 {"__MSG_KEYBOARD_VIETNAMESE_TCVN__",
169 IDS_IME_NAME_KEYBOARD_VIETNAMESE_TCVN},
170 {"__MSG_KEYBOARD_VIETNAMESE_TELEX__",
171 IDS_IME_NAME_KEYBOARD_VIETNAMESE_TELEX},
172 {"__MSG_KEYBOARD_VIETNAMESE_VIQR__",
173 IDS_IME_NAME_KEYBOARD_VIETNAMESE_VIQR},
174 {"__MSG_KEYBOARD_VIETNAMESE_VNI__", IDS_IME_NAME_KEYBOARD_VIETNAMESE_VNI},
175 {"__MSG_LATIN_AMERICAN_KEYBOARD__", IDS_IME_NAME_LATIN_AMERICAN_KEYBOARD},
176 {"__MSG_LATVIAN_KEYBOARD__", IDS_IME_NAME_LATVIAN_KEYBOARD},
177 {"__MSG_LITHUANIAN_KEYBOARD__", IDS_IME_NAME_LITHUANIAN_KEYBOARD},
178 {"__MSG_MONGOLIAN_KEYBOARD__", IDS_IME_NAME_MONGOLIAN_KEYBOARD},
179 {"__MSG_MOZC_JP_INPUTMETHOD__", IDS_IME_NAME_MOZC_JP_INPUTMETHOD},
180 {"__MSG_MOZC_US_INPUTMETHOD__", IDS_IME_NAME_MOZC_US_INPUTMETHOD},
181 {"__MSG_NORWEGIAN_KEYBOARD__", IDS_IME_NAME_NORWEGIAN_KEYBOARD},
182 {"__MSG_PINYIN_INPUTMETHOD__", IDS_IME_NAME_PINYIN_INPUTMETHOD},
183 {"__MSG_POLISH_KEYBOARD__", IDS_IME_NAME_POLISH_KEYBOARD},
184 {"__MSG_PORTUGUESE_KEYBOARD__", IDS_IME_NAME_PORTUGUESE_KEYBOARD},
185 {"__MSG_QUICK_INPUTMETHOD__", IDS_IME_NAME_QUICK_INPUTMETHOD},
186 {"__MSG_ROMANIAN_KEYBOARD__", IDS_IME_NAME_ROMANIAN_KEYBOARD},
187 {"__MSG_RUSSIAN_KEYBOARD__", IDS_IME_NAME_RUSSIAN_KEYBOARD},
188 {"__MSG_RUSSIAN_PHONETIC_KEYBOARD__",
189 IDS_IME_NAME_RUSSIAN_PHONETIC_KEYBOARD},
190 {"__MSG_SERBIAN_KEYBOARD__", IDS_IME_NAME_SERBIAN_KEYBOARD},
191 {"__MSG_SLOVAKIAN_KEYBOARD__", IDS_IME_NAME_SLOVAKIAN_KEYBOARD},
192 {"__MSG_SLOVENIAN_KEYBOARD__", IDS_IME_NAME_SLOVENIAN_KEYBOARD},
193 {"__MSG_SPANISH_KEYBOARD__", IDS_IME_NAME_SPANISH_KEYBOARD},
194 {"__MSG_SWEDISH_KEYBOARD__", IDS_IME_NAME_SWEDISH_KEYBOARD},
195 {"__MSG_SWISS_FRENCH_KEYBOARD__", IDS_IME_NAME_SWISS_FRENCH_KEYBOARD},
196 {"__MSG_SWISS_KEYBOARD__", IDS_IME_NAME_SWISS_KEYBOARD},
197 {"__MSG_TRADITIONAL_PINYIN_INPUTMETHOD__",
198 IDS_IME_NAME_TRADITIONAL_PINYIN_INPUTMETHOD},
199 {"__MSG_TRANSLITERATION_AM__", IDS_IME_NAME_TRANSLITERATION_AM},
200 {"__MSG_TRANSLITERATION_AR__", IDS_IME_NAME_TRANSLITERATION_AR},
201 {"__MSG_TRANSLITERATION_BN__", IDS_IME_NAME_TRANSLITERATION_BN},
202 {"__MSG_TRANSLITERATION_EL__", IDS_IME_NAME_TRANSLITERATION_EL},
203 {"__MSG_TRANSLITERATION_FA__", IDS_IME_NAME_TRANSLITERATION_FA},
204 {"__MSG_TRANSLITERATION_GU__", IDS_IME_NAME_TRANSLITERATION_GU},
205 {"__MSG_TRANSLITERATION_HE__", IDS_IME_NAME_TRANSLITERATION_HE},
206 {"__MSG_TRANSLITERATION_HI__", IDS_IME_NAME_TRANSLITERATION_HI},
207 {"__MSG_TRANSLITERATION_KN__", IDS_IME_NAME_TRANSLITERATION_KN},
208 {"__MSG_TRANSLITERATION_ML__", IDS_IME_NAME_TRANSLITERATION_ML},
209 {"__MSG_TRANSLITERATION_MR__", IDS_IME_NAME_TRANSLITERATION_MR},
210 {"__MSG_TRANSLITERATION_NE__", IDS_IME_NAME_TRANSLITERATION_NE},
211 {"__MSG_TRANSLITERATION_OR__", IDS_IME_NAME_TRANSLITERATION_OR},
212 {"__MSG_TRANSLITERATION_PA__", IDS_IME_NAME_TRANSLITERATION_PA},
213 {"__MSG_TRANSLITERATION_SA__", IDS_IME_NAME_TRANSLITERATION_SA},
214 {"__MSG_TRANSLITERATION_SR__", IDS_IME_NAME_TRANSLITERATION_SR},
215 {"__MSG_TRANSLITERATION_TA__", IDS_IME_NAME_TRANSLITERATION_TA},
216 {"__MSG_TRANSLITERATION_TE__", IDS_IME_NAME_TRANSLITERATION_TE},
217 {"__MSG_TRANSLITERATION_TI__", IDS_IME_NAME_TRANSLITERATION_TI},
218 {"__MSG_TRANSLITERATION_UR__", IDS_IME_NAME_TRANSLITERATION_UR},
219 {"__MSG_TURKISH_KEYBOARD__", IDS_IME_NAME_TURKISH_KEYBOARD},
220 {"__MSG_UKRAINIAN_KEYBOARD__", IDS_IME_NAME_UKRAINIAN_KEYBOARD},
221 {"__MSG_UK_DVORAK_KEYBOARD__", IDS_IME_NAME_UK_DVORAK_KEYBOARD},
222 {"__MSG_UK_KEYBOARD__", IDS_IME_NAME_UK_KEYBOARD},
223 {"__MSG_US_COLEMAK_KEYBOARD__", IDS_IME_NAME_US_COLEMAK_KEYBOARD},
224 {"__MSG_US_DVORAK_KEYBOARD__", IDS_IME_NAME_US_DVORAK_KEYBOARD},
225 {"__MSG_US_EXTENDED_KEYBOARD__", IDS_IME_NAME_US_EXTENDED_KEYBOARD},
226 {"__MSG_US_INTERNATIONAL_KEYBOARD__",
227 IDS_IME_NAME_US_INTERNATIONAL_KEYBOARD},
228 {"__MSG_US_KEYBOARD__", IDS_IME_NAME_US_KEYBOARD},
229 {"__MSG_WUBI_INPUTMETHOD__", IDS_IME_NAME_WUBI_INPUTMETHOD},
230 {"__MSG_ZHUYIN_INPUTMETHOD__", IDS_IME_NAME_ZHUYIN_INPUTMETHOD},
231 };
232
233 const char* kImePathKeyName = "ime_path";
234
89 extensions::ComponentLoader* GetComponentLoader() { 235 extensions::ComponentLoader* GetComponentLoader() {
90 // TODO(skuhne, nkostylev): At this time the only thing which makes sense here 236 // 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 237 // 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 238 // 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. 239 // is done we might have to re-visit this decision.
94 Profile* profile = ProfileManager::GetActiveUserProfile(); 240 Profile* profile = ProfileManager::GetActiveUserProfile();
95 extensions::ExtensionSystem* extension_system = 241 extensions::ExtensionSystem* extension_system =
96 extensions::ExtensionSystem::Get(profile); 242 extensions::ExtensionSystem::Get(profile);
97 ExtensionService* extension_service = extension_system->extension_service(); 243 ExtensionService* extension_service = extension_system->extension_service();
98 return extension_service->component_loader(); 244 return extension_service->component_loader();
99 } 245 }
100 } // namespace 246 } // namespace
101 247
102 ComponentExtensionIMEManagerImpl::ComponentExtensionIMEManagerImpl() 248 ComponentExtensionIMEManagerImpl::ComponentExtensionIMEManagerImpl()
103 : is_initialized_(false), 249 : weak_ptr_factory_(this) {
104 weak_ptr_factory_(this) { 250 ReadComponentExtensionsInfo(&component_extension_list_);
105 } 251 }
106 252
107 ComponentExtensionIMEManagerImpl::~ComponentExtensionIMEManagerImpl() { 253 ComponentExtensionIMEManagerImpl::~ComponentExtensionIMEManagerImpl() {
108 } 254 }
109 255
110 std::vector<ComponentExtensionIME> ComponentExtensionIMEManagerImpl::ListIME() { 256 std::vector<ComponentExtensionIME> ComponentExtensionIMEManagerImpl::ListIME() {
111 DCHECK(thread_checker_.CalledOnValidThread());
112 return component_extension_list_; 257 return component_extension_list_;
113 } 258 }
114 259
115 bool ComponentExtensionIMEManagerImpl::Load(const std::string& extension_id, 260 bool ComponentExtensionIMEManagerImpl::Load(const std::string& extension_id,
116 const std::string& manifest, 261 const std::string& manifest,
117 const base::FilePath& file_path) { 262 const base::FilePath& file_path) {
118 DCHECK(thread_checker_.CalledOnValidThread()); 263 if (!base::PathExists(file_path))
264 return false;
265
119 Profile* profile = ProfileManager::GetActiveUserProfile(); 266 Profile* profile = ProfileManager::GetActiveUserProfile();
120 extensions::ExtensionSystem* extension_system = 267 extensions::ExtensionSystem* extension_system =
121 extensions::ExtensionSystem::Get(profile); 268 extensions::ExtensionSystem::Get(profile);
122 ExtensionService* extension_service = extension_system->extension_service(); 269 ExtensionService* extension_service = extension_system->extension_service();
123 if (extension_service->GetExtensionById(extension_id, false)) 270 if (extension_service->GetExtensionById(extension_id, false))
124 return false; 271 return false;
125 const std::string loaded_extension_id = 272 const std::string loaded_extension_id =
126 GetComponentLoader()->Add(manifest, file_path); 273 GetComponentLoader()->Add(manifest, file_path);
127 DCHECK_EQ(loaded_extension_id, extension_id); 274 DCHECK_EQ(loaded_extension_id, extension_id);
128 return true; 275 return true;
129 } 276 }
130 277
131 void ComponentExtensionIMEManagerImpl::Unload(const std::string& extension_id, 278 void ComponentExtensionIMEManagerImpl::Unload(const std::string& extension_id,
132 const base::FilePath& file_path) { 279 const base::FilePath& file_path) {
133 DCHECK(thread_checker_.CalledOnValidThread());
134 // Remove(extension_id) does nothing when the extension has already been 280 // Remove(extension_id) does nothing when the extension has already been
135 // removed or not been registered. 281 // removed or not been registered.
136 GetComponentLoader()->Remove(extension_id); 282 GetComponentLoader()->Remove(extension_id);
137 } 283 }
138 284
139 scoped_ptr<base::DictionaryValue> ComponentExtensionIMEManagerImpl::GetManifest( 285 scoped_ptr<base::DictionaryValue> ComponentExtensionIMEManagerImpl::GetManifest(
140 const base::FilePath& file_path) { 286 const std::string& manifest_string) {
141 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
142 std::string error; 287 std::string error;
143 scoped_ptr<base::DictionaryValue> manifest( 288 JSONStringValueSerializer serializer(manifest_string);
144 extensions::file_util::LoadManifest(file_path, &error)); 289 scoped_ptr<base::Value> manifest(serializer.Deserialize(NULL, &error));
145 if (!manifest.get()) 290 if (!manifest.get())
146 LOG(ERROR) << "Failed at getting manifest"; 291 LOG(ERROR) << "Failed at getting manifest";
147 if (!extension_l10n_util::LocalizeExtension(file_path, 292 if (!manifest->IsType(base::Value::TYPE_DICTIONARY))
148 manifest.get(), 293 LOG(ERROR) << "Invalid manifest format";
149 &error))
150 LOG(ERROR) << "Localization failed";
151 294
152 return manifest.Pass(); 295 return scoped_ptr<base::DictionaryValue>(
153 } 296 static_cast<base::DictionaryValue*>(manifest.release())).Pass();
154
155 void ComponentExtensionIMEManagerImpl::InitializeAsync(
156 const base::Closure& callback) {
157 DCHECK(!is_initialized_);
158 DCHECK(thread_checker_.CalledOnValidThread());
159
160 std::vector<ComponentExtensionIME>* component_extension_ime_list
161 = new std::vector<ComponentExtensionIME>;
162 content::BrowserThread::PostTaskAndReply(
163 content::BrowserThread::FILE,
164 FROM_HERE,
165 base::Bind(&ComponentExtensionIMEManagerImpl::ReadComponentExtensionsInfo,
166 base::Unretained(component_extension_ime_list)),
167 base::Bind(
168 &ComponentExtensionIMEManagerImpl::OnReadComponentExtensionsInfo,
169 weak_ptr_factory_.GetWeakPtr(),
170 base::Owned(component_extension_ime_list),
171 callback));
172 }
173
174 bool ComponentExtensionIMEManagerImpl::IsInitialized() {
175 return is_initialized_;
176 } 297 }
177 298
178 // static 299 // static
179 bool ComponentExtensionIMEManagerImpl::ReadEngineComponent( 300 bool ComponentExtensionIMEManagerImpl::ReadEngineComponent(
180 const ComponentExtensionIME& component_extension, 301 const ComponentExtensionIME& component_extension,
181 const base::DictionaryValue& dict, 302 const base::DictionaryValue& dict,
182 ComponentExtensionEngine* out) { 303 ComponentExtensionEngine* out) {
183 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
184 DCHECK(out); 304 DCHECK(out);
185 std::string type; 305 std::string type;
186 if (!dict.GetString(extensions::manifest_keys::kType, &type)) 306 if (!dict.GetString(extensions::manifest_keys::kType, &type))
187 return false; 307 return false;
188 if (type != "ime") 308 if (type != "ime")
189 return false; 309 return false;
190 if (!dict.GetString(extensions::manifest_keys::kId, &out->engine_id)) 310 if (!dict.GetString(extensions::manifest_keys::kId, &out->engine_id))
191 return false; 311 return false;
192 if (!dict.GetString(extensions::manifest_keys::kName, &out->display_name)) 312 if (!dict.GetString(extensions::manifest_keys::kName, &out->display_name))
193 return false; 313 return false;
194 314
315 // Localizes the input method name.
316 if (out->display_name.find("__MSG_") == 0) {
317 const InputMethodNameMap* map = kInputMethodNameMap;
318 size_t map_size = arraysize(kInputMethodNameMap);
319 std::string name = StringToUpperASCII(out->display_name);
320 const InputMethodNameMap map_key = {name.c_str(), 0};
321 const InputMethodNameMap* p =
322 std::lower_bound(map, map + map_size, map_key, map_key);
323 if (p != map + map_size && !map_key(*p, map_key) && !map_key(map_key, *p))
324 out->display_name = l10n_util::GetStringUTF8(p->resource_id);
nona 2014/07/14 10:02:47 nit: How about adding DCHECK for preventing shippi
Shu Chen 2014/07/14 15:07:21 Done.
325 }
326
195 std::set<std::string> languages; 327 std::set<std::string> languages;
196 const base::Value* language_value = NULL; 328 const base::Value* language_value = NULL;
197 if (dict.Get(extensions::manifest_keys::kLanguage, &language_value)) { 329 if (dict.Get(extensions::manifest_keys::kLanguage, &language_value)) {
198 if (language_value->GetType() == base::Value::TYPE_STRING) { 330 if (language_value->GetType() == base::Value::TYPE_STRING) {
199 std::string language_str; 331 std::string language_str;
200 language_value->GetAsString(&language_str); 332 language_value->GetAsString(&language_str);
201 languages.insert(language_str); 333 languages.insert(language_str);
202 } else if (language_value->GetType() == base::Value::TYPE_LIST) { 334 } else if (language_value->GetType() == base::Value::TYPE_LIST) {
203 const base::ListValue* language_list = NULL; 335 const base::ListValue* language_list = NULL;
204 language_value->GetAsList(&language_list); 336 language_value->GetAsList(&language_list);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 } 381 }
250 382
251 return true; 383 return true;
252 } 384 }
253 385
254 // static 386 // static
255 bool ComponentExtensionIMEManagerImpl::ReadExtensionInfo( 387 bool ComponentExtensionIMEManagerImpl::ReadExtensionInfo(
256 const base::DictionaryValue& manifest, 388 const base::DictionaryValue& manifest,
257 const std::string& extension_id, 389 const std::string& extension_id,
258 ComponentExtensionIME* out) { 390 ComponentExtensionIME* out) {
259 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
260 if (!manifest.GetString(extensions::manifest_keys::kDescription, 391 if (!manifest.GetString(extensions::manifest_keys::kDescription,
261 &out->description)) 392 &out->description))
262 return false; 393 return false;
394 std::string path;
395 if (manifest.GetString(kImePathKeyName, &path))
396 out->path = base::FilePath(path);
263 std::string url_string; 397 std::string url_string;
264 if (manifest.GetString(extensions::manifest_keys::kOptionsPage, 398 if (manifest.GetString(extensions::manifest_keys::kOptionsPage,
265 &url_string)) { 399 &url_string)) {
266 GURL url = extensions::Extension::GetResourceURL( 400 GURL url = extensions::Extension::GetResourceURL(
267 extensions::Extension::GetBaseURLFromExtensionId(extension_id), 401 extensions::Extension::GetBaseURLFromExtensionId(extension_id),
268 url_string); 402 url_string);
269 if (!url.is_valid()) 403 if (!url.is_valid())
270 return false; 404 return false;
271 out->options_page_url = url; 405 out->options_page_url = url;
272 } 406 }
273 // It's okay to return true on no option page and/or input view page case. 407 // It's okay to return true on no option page and/or input view page case.
274 return true; 408 return true;
275 } 409 }
276 410
277 // static 411 // static
278 void ComponentExtensionIMEManagerImpl::ReadComponentExtensionsInfo( 412 void ComponentExtensionIMEManagerImpl::ReadComponentExtensionsInfo(
279 std::vector<ComponentExtensionIME>* out_imes) { 413 std::vector<ComponentExtensionIME>* out_imes) {
280 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
281 DCHECK(out_imes); 414 DCHECK(out_imes);
282 for (size_t i = 0; i < arraysize(whitelisted_component_extension); ++i) { 415 for (size_t i = 0; i < arraysize(whitelisted_component_extension); ++i) {
283 ComponentExtensionIME component_ime; 416 ComponentExtensionIME component_ime;
284 component_ime.path = base::FilePath( 417 ResourceBundle& rb = ResourceBundle::GetSharedInstance();
285 whitelisted_component_extension[i].path); 418 component_ime.manifest =
286 419 rb.GetRawDataResource(
287 if (!component_ime.path.IsAbsolute()) { 420 whitelisted_component_extension[i].manifest_resource_id)
288 base::FilePath resources_path; 421 .as_string();
289 if (!PathService::Get(chrome::DIR_RESOURCES, &resources_path)) 422 if (component_ime.manifest.empty())
290 NOTREACHED();
291 component_ime.path = resources_path.Append(component_ime.path);
292 }
293 const base::FilePath manifest_path =
294 component_ime.path.Append("manifest.json");
295
296 if (!base::PathExists(component_ime.path) ||
297 !base::PathExists(manifest_path))
298 continue;
299
300 if (!base::ReadFileToString(manifest_path, &component_ime.manifest))
301 continue; 423 continue;
302 424
303 scoped_ptr<base::DictionaryValue> manifest = 425 scoped_ptr<base::DictionaryValue> manifest =
304 GetManifest(component_ime.path); 426 GetManifest(component_ime.manifest);
305 if (!manifest.get()) 427 if (!manifest.get())
306 continue; 428 continue;
307 429
308 if (!ReadExtensionInfo(*manifest.get(), 430 if (!ReadExtensionInfo(*manifest.get(),
309 whitelisted_component_extension[i].id, 431 whitelisted_component_extension[i].id,
310 &component_ime)) 432 &component_ime))
311 continue; 433 continue;
312 component_ime.id = whitelisted_component_extension[i].id; 434 component_ime.id = whitelisted_component_extension[i].id;
313 435
436 if (!component_ime.path.IsAbsolute()) {
437 base::FilePath resources_path;
438 if (!PathService::Get(chrome::DIR_RESOURCES, &resources_path))
439 NOTREACHED();
440 component_ime.path = resources_path.Append(component_ime.path);
441 }
442
314 const base::ListValue* component_list; 443 const base::ListValue* component_list;
315 if (!manifest->GetList(extensions::manifest_keys::kInputComponents, 444 if (!manifest->GetList(extensions::manifest_keys::kInputComponents,
316 &component_list)) 445 &component_list))
317 continue; 446 continue;
318 447
319 for (size_t i = 0; i < component_list->GetSize(); ++i) { 448 for (size_t i = 0; i < component_list->GetSize(); ++i) {
320 const base::DictionaryValue* dictionary; 449 const base::DictionaryValue* dictionary;
321 if (!component_list->GetDictionary(i, &dictionary)) 450 if (!component_list->GetDictionary(i, &dictionary))
322 continue; 451 continue;
323 452
324 ComponentExtensionEngine engine; 453 ComponentExtensionEngine engine;
325 ReadEngineComponent(component_ime, *dictionary, &engine); 454 ReadEngineComponent(component_ime, *dictionary, &engine);
326 component_ime.engines.push_back(engine); 455 component_ime.engines.push_back(engine);
327 } 456 }
328 out_imes->push_back(component_ime); 457 out_imes->push_back(component_ime);
329 } 458 }
330 } 459 }
331 460
332 void ComponentExtensionIMEManagerImpl::OnReadComponentExtensionsInfo(
333 std::vector<ComponentExtensionIME>* result,
334 const base::Closure& callback) {
335 DCHECK(thread_checker_.CalledOnValidThread());
336 DCHECK(result);
337 component_extension_list_ = *result;
338 is_initialized_ = true;
339 callback.Run();
340 }
341
342 } // namespace chromeos 461 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698