OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/extensions/component_loader.h" | 5 #include "chrome/browser/extensions/component_loader.h" |
6 | 6 |
7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
9 #include "base/json/json_string_value_serializer.h" | 9 #include "base/json/json_string_value_serializer.h" |
10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 | 37 |
38 #if defined(USE_ASH) | 38 #if defined(USE_ASH) |
39 #include "grit/chromium_strings.h" | 39 #include "grit/chromium_strings.h" |
40 #include "ui/base/l10n/l10n_util.h" | 40 #include "ui/base/l10n/l10n_util.h" |
41 #endif | 41 #endif |
42 | 42 |
43 namespace extensions { | 43 namespace extensions { |
44 | 44 |
45 namespace { | 45 namespace { |
46 | 46 |
| 47 static bool enable_background_extensions_during_testing = false; |
| 48 |
47 std::string GenerateId(const DictionaryValue* manifest, const FilePath& path) { | 49 std::string GenerateId(const DictionaryValue* manifest, const FilePath& path) { |
48 std::string raw_key; | 50 std::string raw_key; |
49 std::string id_input; | 51 std::string id_input; |
50 std::string id; | 52 std::string id; |
51 CHECK(manifest->GetString(extension_manifest_keys::kPublicKey, &raw_key)); | 53 CHECK(manifest->GetString(extension_manifest_keys::kPublicKey, &raw_key)); |
52 CHECK(Extension::ParsePEMKeyBytes(raw_key, &id_input)); | 54 CHECK(Extension::ParsePEMKeyBytes(raw_key, &id_input)); |
53 CHECK(Extension::GenerateId(id_input, &id)); | 55 CHECK(Extension::GenerateId(id_input, &id)); |
54 return id; | 56 return id; |
55 } | 57 } |
56 | 58 |
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 info.root_directory, | 192 info.root_directory, |
191 Extension::COMPONENT, | 193 Extension::COMPONENT, |
192 *info.manifest, | 194 *info.manifest, |
193 flags, | 195 flags, |
194 &error)); | 196 &error)); |
195 if (!extension.get()) { | 197 if (!extension.get()) { |
196 LOG(ERROR) << error; | 198 LOG(ERROR) << error; |
197 return NULL; | 199 return NULL; |
198 } | 200 } |
199 CHECK_EQ(info.extension_id, extension->id()) << extension->name(); | 201 CHECK_EQ(info.extension_id, extension->id()) << extension->name(); |
200 extension_service_->AddExtension(extension); | 202 extension_service_->AddComponentExtension(extension); |
201 return extension; | 203 return extension; |
202 } | 204 } |
203 | 205 |
204 void ComponentLoader::Remove(const FilePath& root_directory) { | 206 void ComponentLoader::Remove(const FilePath& root_directory) { |
205 // Find the ComponentExtensionInfo for the extension. | 207 // Find the ComponentExtensionInfo for the extension. |
206 RegisteredComponentExtensions::iterator it = component_extensions_.begin(); | 208 RegisteredComponentExtensions::iterator it = component_extensions_.begin(); |
207 for (; it != component_extensions_.end(); ++it) { | 209 for (; it != component_extensions_.end(); ++it) { |
208 if (it->root_directory == root_directory) { | 210 if (it->root_directory == root_directory) { |
209 Remove(GenerateId(it->manifest, root_directory)); | 211 Remove(GenerateId(it->manifest, root_directory)); |
210 break; | 212 break; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
312 } | 314 } |
313 | 315 |
314 void ComponentLoader::AddScriptBubble() { | 316 void ComponentLoader::AddScriptBubble() { |
315 if (FeatureSwitch::script_bubble()->IsEnabled()) { | 317 if (FeatureSwitch::script_bubble()->IsEnabled()) { |
316 script_bubble_id_ = | 318 script_bubble_id_ = |
317 Add(IDR_SCRIPT_BUBBLE_MANIFEST, | 319 Add(IDR_SCRIPT_BUBBLE_MANIFEST, |
318 FilePath(FILE_PATH_LITERAL("script_bubble"))); | 320 FilePath(FILE_PATH_LITERAL("script_bubble"))); |
319 } | 321 } |
320 } | 322 } |
321 | 323 |
| 324 // static |
| 325 void ComponentLoader::EnableBackgroundExtensionsForTesting() { |
| 326 enable_background_extensions_during_testing = true; |
| 327 } |
| 328 |
322 void ComponentLoader::AddDefaultComponentExtensions() { | 329 void ComponentLoader::AddDefaultComponentExtensions() { |
| 330 // Do not add component extensions that have background pages here -- add them |
| 331 // to AddDefaultComponentExtensionsWithBackgroundPages. |
| 332 |
323 #if defined(OS_CHROMEOS) | 333 #if defined(OS_CHROMEOS) |
324 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kGuestSession)) | 334 const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 335 if (!command_line->HasSwitch(switches::kGuestSession)) |
325 Add(IDR_BOOKMARKS_MANIFEST, | 336 Add(IDR_BOOKMARKS_MANIFEST, |
326 FilePath(FILE_PATH_LITERAL("bookmark_manager"))); | 337 FilePath(FILE_PATH_LITERAL("bookmark_manager"))); |
327 #else | 338 #else |
328 Add(IDR_BOOKMARKS_MANIFEST, FilePath(FILE_PATH_LITERAL("bookmark_manager"))); | 339 Add(IDR_BOOKMARKS_MANIFEST, FilePath(FILE_PATH_LITERAL("bookmark_manager"))); |
329 #endif | 340 #endif |
330 | 341 |
331 // Apps Debugger | |
332 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
333 switches::kAppsDebugger)) { | |
334 Add(IDR_APPS_DEBUGGER_MANIFEST, | |
335 FilePath(FILE_PATH_LITERAL("apps_debugger"))); | |
336 } | |
337 | |
338 #if defined(OS_CHROMEOS) | 342 #if defined(OS_CHROMEOS) |
339 Add(IDR_WALLPAPERMANAGER_MANIFEST, | |
340 FilePath(FILE_PATH_LITERAL("chromeos/wallpaper_manager"))); | |
341 #endif | |
342 | |
343 #if defined(FILE_MANAGER_EXTENSION) | |
344 AddFileManagerExtension(); | |
345 #endif | |
346 | |
347 #if defined(OS_CHROMEOS) | |
348 const CommandLine* command_line = CommandLine::ForCurrentProcess(); | |
349 if (command_line->HasSwitch(switches::kEnableBackgroundLoader)) { | |
350 Add(IDR_BACKLOADER_MANIFEST, | |
351 FilePath(FILE_PATH_LITERAL("backloader"))); | |
352 } | |
353 | |
354 Add(IDR_MOBILE_MANIFEST, | 343 Add(IDR_MOBILE_MANIFEST, |
355 FilePath(FILE_PATH_LITERAL("/usr/share/chromeos-assets/mobile"))); | 344 FilePath(FILE_PATH_LITERAL("/usr/share/chromeos-assets/mobile"))); |
356 | 345 |
357 Add(IDR_CROSH_BUILTIN_MANIFEST, FilePath(FILE_PATH_LITERAL( | 346 Add(IDR_CROSH_BUILTIN_MANIFEST, FilePath(FILE_PATH_LITERAL( |
358 "/usr/share/chromeos-assets/crosh_builtin"))); | 347 "/usr/share/chromeos-assets/crosh_builtin"))); |
359 | 348 |
360 AddGaiaAuthExtension(); | 349 AddGaiaAuthExtension(); |
361 | 350 |
362 // TODO(gauravsh): Only include echo extension on official builds. | 351 // TODO(gauravsh): Only include echo extension on official builds. |
363 FilePath echo_extension_path(FILE_PATH_LITERAL( | 352 FilePath echo_extension_path(FILE_PATH_LITERAL( |
364 "/usr/share/chromeos-assets/echo")); | 353 "/usr/share/chromeos-assets/echo")); |
365 if (command_line->HasSwitch(switches::kEchoExtensionPath)) { | 354 if (command_line->HasSwitch(switches::kEchoExtensionPath)) { |
366 echo_extension_path = | 355 echo_extension_path = |
367 command_line->GetSwitchValuePath(switches::kEchoExtensionPath); | 356 command_line->GetSwitchValuePath(switches::kEchoExtensionPath); |
368 } | 357 } |
369 Add(IDR_ECHO_MANIFEST, echo_extension_path); | 358 Add(IDR_ECHO_MANIFEST, echo_extension_path); |
370 | 359 |
371 #if defined(OFFICIAL_BUILD) | 360 #if defined(OFFICIAL_BUILD) |
372 if (browser_defaults::enable_help_app) { | 361 if (browser_defaults::enable_help_app) { |
373 Add(IDR_HELP_MANIFEST, | 362 Add(IDR_HELP_MANIFEST, |
374 FilePath(FILE_PATH_LITERAL("/usr/share/chromeos-assets/helpapp"))); | 363 FilePath(FILE_PATH_LITERAL("/usr/share/chromeos-assets/helpapp"))); |
375 } | 364 } |
376 #endif | 365 #endif |
377 #endif // !defined(OS_CHROMEOS) | 366 #endif // !defined(OS_CHROMEOS) |
378 | 367 |
379 Add(IDR_WEBSTORE_MANIFEST, FilePath(FILE_PATH_LITERAL("web_store"))); | 368 Add(IDR_WEBSTORE_MANIFEST, FilePath(FILE_PATH_LITERAL("web_store"))); |
380 | 369 |
381 #if defined(ENABLE_SETTINGS_APP) | |
382 Add(IDR_SETTINGS_APP_MANIFEST, FilePath(FILE_PATH_LITERAL("settings_app"))); | |
383 #endif | |
384 | |
385 #if !defined(OS_CHROMEOS) | 370 #if !defined(OS_CHROMEOS) |
386 // Cloud Print component app. Not required on Chrome OS. | 371 // Cloud Print component app. Not required on Chrome OS. |
387 Add(IDR_CLOUDPRINT_MANIFEST, FilePath(FILE_PATH_LITERAL("cloud_print"))); | 372 Add(IDR_CLOUDPRINT_MANIFEST, FilePath(FILE_PATH_LITERAL("cloud_print"))); |
388 #endif | 373 #endif |
389 | 374 |
390 #if defined(OS_CHROMEOS) | |
391 // Load ChromeVox extension now if spoken feedback is enabled. | |
392 if (local_state_->GetBoolean(prefs::kSpokenFeedbackEnabled)) { | |
393 FilePath path = FilePath(extension_misc::kChromeVoxExtensionPath); | |
394 Add(IDR_CHROMEVOX_MANIFEST, path); | |
395 } | |
396 #endif | |
397 | |
398 // If a URL for the enterprise webstore has been specified, load the | 375 // If a URL for the enterprise webstore has been specified, load the |
399 // component extension. This extension might also be loaded later, because | 376 // component extension. This extension might also be loaded later, because |
400 // it is specified by policy, and on ChromeOS policies are loaded after | 377 // it is specified by policy, and on ChromeOS policies are loaded after |
401 // the browser process has started. | 378 // the browser process has started. |
402 AddOrReloadEnterpriseWebStore(); | 379 AddOrReloadEnterpriseWebStore(); |
403 | 380 |
404 #if defined(USE_ASH) | 381 #if defined(USE_ASH) |
405 AddChromeApp(); | 382 AddChromeApp(); |
406 #endif | 383 #endif |
407 | 384 |
408 AddScriptBubble(); | 385 AddScriptBubble(); |
| 386 AddDefaultComponentExtensionsWithBackgroundPages(); |
| 387 } |
| 388 |
| 389 void ComponentLoader::AddDefaultComponentExtensionsWithBackgroundPages() { |
| 390 const CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 391 |
| 392 // Component extensions with background pages are not enabled during tests |
| 393 // because they generate a lot of background behavior that can interfere. |
| 394 if (!enable_background_extensions_during_testing && |
| 395 command_line->HasSwitch(switches::kTestType)) { |
| 396 return; |
| 397 } |
| 398 |
| 399 // Apps Debugger |
| 400 if (CommandLine::ForCurrentProcess()->HasSwitch( |
| 401 switches::kAppsDebugger)) { |
| 402 Add(IDR_APPS_DEBUGGER_MANIFEST, |
| 403 FilePath(FILE_PATH_LITERAL("apps_debugger"))); |
| 404 } |
| 405 |
| 406 AddFileManagerExtension(); |
| 407 |
| 408 #if defined(OS_CHROMEOS) |
| 409 Add(IDR_WALLPAPERMANAGER_MANIFEST, |
| 410 FilePath(FILE_PATH_LITERAL("chromeos/wallpaper_manager"))); |
| 411 |
| 412 if (command_line->HasSwitch(switches::kEnableBackgroundLoader)) { |
| 413 Add(IDR_BACKLOADER_MANIFEST, |
| 414 FilePath(FILE_PATH_LITERAL("backloader"))); |
| 415 } |
| 416 |
| 417 // Load ChromeVox extension now if spoken feedback is enabled. |
| 418 if (local_state_->GetBoolean(prefs::kSpokenFeedbackEnabled)) { |
| 419 FilePath path = FilePath(extension_misc::kChromeVoxExtensionPath); |
| 420 Add(IDR_CHROMEVOX_MANIFEST, path); |
| 421 } |
| 422 #endif |
| 423 |
| 424 #if defined(ENABLE_SETTINGS_APP) |
| 425 Add(IDR_SETTINGS_APP_MANIFEST, FilePath(FILE_PATH_LITERAL("settings_app"))); |
| 426 #endif |
409 } | 427 } |
410 | 428 |
411 // static | 429 // static |
412 void ComponentLoader::RegisterUserPrefs(PrefService* prefs) { | 430 void ComponentLoader::RegisterUserPrefs(PrefService* prefs) { |
413 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreURL, | 431 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreURL, |
414 std::string() /* default_value */, | 432 std::string() /* default_value */, |
415 PrefService::UNSYNCABLE_PREF); | 433 PrefService::UNSYNCABLE_PREF); |
416 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreName, | 434 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreName, |
417 std::string() /* default_value */, | 435 std::string() /* default_value */, |
418 PrefService::UNSYNCABLE_PREF); | 436 PrefService::UNSYNCABLE_PREF); |
419 } | 437 } |
420 | 438 |
421 } // namespace extensions | 439 } // namespace extensions |
OLD | NEW |