OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 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/extensions/extension_service.h" | 5 #include "chrome/browser/extensions/extension_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <iterator> | 8 #include <iterator> |
9 #include <set> | 9 #include <set> |
10 | 10 |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "base/values.h" | 28 #include "base/values.h" |
29 #include "base/version.h" | 29 #include "base/version.h" |
30 #include "chrome/browser/browser_process.h" | 30 #include "chrome/browser/browser_process.h" |
31 #include "chrome/browser/devtools/devtools_window.h" | 31 #include "chrome/browser/devtools/devtools_window.h" |
32 #include "chrome/browser/extensions/api/app_runtime/app_runtime_api.h" | 32 #include "chrome/browser/extensions/api/app_runtime/app_runtime_api.h" |
33 #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" | 33 #include "chrome/browser/extensions/api/declarative/rules_registry_service.h" |
34 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" | 34 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" |
35 #include "chrome/browser/extensions/api/profile_keyed_api_factory.h" | 35 #include "chrome/browser/extensions/api/profile_keyed_api_factory.h" |
36 #include "chrome/browser/extensions/api/runtime/runtime_api.h" | 36 #include "chrome/browser/extensions/api/runtime/runtime_api.h" |
37 #include "chrome/browser/extensions/api/storage/settings_frontend.h" | 37 #include "chrome/browser/extensions/api/storage/settings_frontend.h" |
38 #include "chrome/browser/extensions/app_notification_manager.h" | |
39 #include "chrome/browser/extensions/app_sync_data.h" | 38 #include "chrome/browser/extensions/app_sync_data.h" |
40 #include "chrome/browser/extensions/browser_event_router.h" | 39 #include "chrome/browser/extensions/browser_event_router.h" |
41 #include "chrome/browser/extensions/component_loader.h" | 40 #include "chrome/browser/extensions/component_loader.h" |
42 #include "chrome/browser/extensions/crx_installer.h" | 41 #include "chrome/browser/extensions/crx_installer.h" |
43 #include "chrome/browser/extensions/data_deleter.h" | 42 #include "chrome/browser/extensions/data_deleter.h" |
44 #include "chrome/browser/extensions/extension_disabled_ui.h" | 43 #include "chrome/browser/extensions/extension_disabled_ui.h" |
45 #include "chrome/browser/extensions/extension_error_reporter.h" | 44 #include "chrome/browser/extensions/extension_error_reporter.h" |
46 #include "chrome/browser/extensions/extension_error_ui.h" | 45 #include "chrome/browser/extensions/extension_error_ui.h" |
47 #include "chrome/browser/extensions/extension_host.h" | 46 #include "chrome/browser/extensions/extension_host.h" |
48 #include "chrome/browser/extensions/extension_install_ui.h" | 47 #include "chrome/browser/extensions/extension_install_ui.h" |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 blacklist_(blacklist), | 341 blacklist_(blacklist), |
343 settings_frontend_(extensions::SettingsFrontend::Create(profile)), | 342 settings_frontend_(extensions::SettingsFrontend::Create(profile)), |
344 pending_extension_manager_(*ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 343 pending_extension_manager_(*ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
345 install_directory_(install_directory), | 344 install_directory_(install_directory), |
346 extensions_enabled_(extensions_enabled), | 345 extensions_enabled_(extensions_enabled), |
347 show_extensions_prompts_(true), | 346 show_extensions_prompts_(true), |
348 install_updates_when_idle_(true), | 347 install_updates_when_idle_(true), |
349 ready_(false), | 348 ready_(false), |
350 toolbar_model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 349 toolbar_model_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
351 menu_manager_(profile), | 350 menu_manager_(profile), |
352 app_notification_manager_( | |
353 new extensions::AppNotificationManager(profile)), | |
354 event_routers_initialized_(false), | 351 event_routers_initialized_(false), |
355 update_once_all_providers_are_ready_(false), | 352 update_once_all_providers_are_ready_(false), |
356 browser_terminating_(false), | 353 browser_terminating_(false), |
357 installs_delayed_(false), | 354 installs_delayed_(false), |
358 wipeout_is_active_(false), | 355 wipeout_is_active_(false), |
359 wipeout_count_(0u), | 356 wipeout_count_(0u), |
360 app_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 357 app_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
361 extension_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { | 358 extension_sync_bundle_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
362 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 359 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
363 | 360 |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 profile, | 398 profile, |
402 blacklist, | 399 blacklist, |
403 update_frequency)); | 400 update_frequency)); |
404 } | 401 } |
405 | 402 |
406 component_loader_.reset( | 403 component_loader_.reset( |
407 new extensions::ComponentLoader(this, | 404 new extensions::ComponentLoader(this, |
408 profile->GetPrefs(), | 405 profile->GetPrefs(), |
409 g_browser_process->local_state())); | 406 g_browser_process->local_state())); |
410 | 407 |
411 app_notification_manager_->Init(); | |
412 | |
413 if (extensions_enabled_) { | 408 if (extensions_enabled_) { |
414 CHECK(!ProfileManager::IsImportProcess(*command_line)); | 409 CHECK(!ProfileManager::IsImportProcess(*command_line)); |
415 extensions::ExternalProviderImpl::CreateExternalProviders( | 410 extensions::ExternalProviderImpl::CreateExternalProviders( |
416 this, profile_, &external_extension_providers_); | 411 this, profile_, &external_extension_providers_); |
417 } | 412 } |
418 | 413 |
419 // Set this as the ExtensionService for extension sorting to ensure it | 414 // Set this as the ExtensionService for extension sorting to ensure it |
420 // cause syncs if required. | 415 // cause syncs if required. |
421 extension_prefs_->extension_sorting()->SetExtensionService(this); | 416 extension_prefs_->extension_sorting()->SetExtensionService(this); |
422 | 417 |
(...skipping 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1395 IsExtensionEnabled(extension.id()), | 1390 IsExtensionEnabled(extension.id()), |
1396 IsIncognitoEnabled(extension.id())); | 1391 IsIncognitoEnabled(extension.id())); |
1397 } | 1392 } |
1398 | 1393 |
1399 extensions::AppSyncData ExtensionService::GetAppSyncData( | 1394 extensions::AppSyncData ExtensionService::GetAppSyncData( |
1400 const Extension& extension) const { | 1395 const Extension& extension) const { |
1401 return extensions::AppSyncData( | 1396 return extensions::AppSyncData( |
1402 extension, | 1397 extension, |
1403 IsExtensionEnabled(extension.id()), | 1398 IsExtensionEnabled(extension.id()), |
1404 IsIncognitoEnabled(extension.id()), | 1399 IsIncognitoEnabled(extension.id()), |
1405 extension_prefs_->GetAppNotificationClientId(extension.id()), | |
1406 extension_prefs_->IsAppNotificationDisabled(extension.id()), | |
1407 extension_prefs_->extension_sorting()->GetAppLaunchOrdinal( | 1400 extension_prefs_->extension_sorting()->GetAppLaunchOrdinal( |
1408 extension.id()), | 1401 extension.id()), |
1409 extension_prefs_->extension_sorting()->GetPageOrdinal(extension.id())); | 1402 extension_prefs_->extension_sorting()->GetPageOrdinal(extension.id())); |
1410 } | 1403 } |
1411 | 1404 |
1412 std::vector<extensions::ExtensionSyncData> | 1405 std::vector<extensions::ExtensionSyncData> |
1413 ExtensionService::GetExtensionSyncDataList() const { | 1406 ExtensionService::GetExtensionSyncDataList() const { |
1414 std::vector<extensions::ExtensionSyncData> extension_sync_list; | 1407 std::vector<extensions::ExtensionSyncData> extension_sync_list; |
1415 extension_sync_bundle_.GetExtensionSyncDataListHelper(extensions_, | 1408 extension_sync_bundle_.GetExtensionSyncDataListHelper(extensions_, |
1416 &extension_sync_list); | 1409 &extension_sync_list); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1455 CheckForUpdatesSoon(); | 1448 CheckForUpdatesSoon(); |
1456 return false; | 1449 return false; |
1457 } | 1450 } |
1458 | 1451 |
1459 return true; | 1452 return true; |
1460 } | 1453 } |
1461 | 1454 |
1462 bool ExtensionService::ProcessAppSyncData( | 1455 bool ExtensionService::ProcessAppSyncData( |
1463 const extensions::AppSyncData& app_sync_data) { | 1456 const extensions::AppSyncData& app_sync_data) { |
1464 const std::string& id = app_sync_data.id(); | 1457 const std::string& id = app_sync_data.id(); |
1465 const Extension* extension = GetInstalledExtension(id); | |
1466 bool extension_installed = (extension != NULL); | |
1467 | 1458 |
1468 if (app_sync_data.app_launch_ordinal().IsValid() && | 1459 if (app_sync_data.app_launch_ordinal().IsValid() && |
1469 app_sync_data.page_ordinal().IsValid()) { | 1460 app_sync_data.page_ordinal().IsValid()) { |
1470 extension_prefs_->extension_sorting()->SetAppLaunchOrdinal( | 1461 extension_prefs_->extension_sorting()->SetAppLaunchOrdinal( |
1471 id, | 1462 id, |
1472 app_sync_data.app_launch_ordinal()); | 1463 app_sync_data.app_launch_ordinal()); |
1473 extension_prefs_->extension_sorting()->SetPageOrdinal( | 1464 extension_prefs_->extension_sorting()->SetPageOrdinal( |
1474 id, | 1465 id, |
1475 app_sync_data.page_ordinal()); | 1466 app_sync_data.page_ordinal()); |
1476 } | 1467 } |
1477 | 1468 |
1478 if (extension_installed) { | |
1479 if (app_sync_data.notifications_disabled() != | |
1480 extension_prefs_->IsAppNotificationDisabled(id)) { | |
1481 extension_prefs_->SetAppNotificationDisabled( | |
1482 id, app_sync_data.notifications_disabled()); | |
1483 } | |
1484 } | |
1485 | |
1486 if (!ProcessExtensionSyncDataHelper(app_sync_data.extension_sync_data(), | 1469 if (!ProcessExtensionSyncDataHelper(app_sync_data.extension_sync_data(), |
1487 syncer::APPS)) { | 1470 syncer::APPS)) { |
1488 app_sync_bundle_.AddPendingApp(id, app_sync_data); | 1471 app_sync_bundle_.AddPendingApp(id, app_sync_data); |
1489 CheckForUpdatesSoon(); | 1472 CheckForUpdatesSoon(); |
1490 return false; | 1473 return false; |
1491 } | 1474 } |
1492 | 1475 |
1493 return true; | 1476 return true; |
1494 } | 1477 } |
1495 | 1478 |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1636 std::string id = extension_id; | 1619 std::string id = extension_id; |
1637 if (extension_is_enabled) | 1620 if (extension_is_enabled) |
1638 ReloadExtension(id); | 1621 ReloadExtension(id); |
1639 | 1622 |
1640 // Reloading the extension invalidates the |extension| pointer. | 1623 // Reloading the extension invalidates the |extension| pointer. |
1641 extension = GetInstalledExtension(id); | 1624 extension = GetInstalledExtension(id); |
1642 if (extension) | 1625 if (extension) |
1643 SyncExtensionChangeIfNeeded(*extension); | 1626 SyncExtensionChangeIfNeeded(*extension); |
1644 } | 1627 } |
1645 | 1628 |
1646 void ExtensionService::SetAppNotificationSetupDone( | |
1647 const std::string& extension_id, | |
1648 const std::string& oauth_client_id) { | |
1649 const Extension* extension = GetInstalledExtension(extension_id); | |
1650 // This method is called when the user sets up app notifications. | |
1651 // So it is not expected to be called until the extension is installed. | |
1652 if (!extension) { | |
1653 NOTREACHED(); | |
1654 return; | |
1655 } | |
1656 extension_prefs_->SetAppNotificationClientId(extension_id, oauth_client_id); | |
1657 SyncExtensionChangeIfNeeded(*extension); | |
1658 } | |
1659 | |
1660 void ExtensionService::SetAppNotificationDisabled( | |
1661 const std::string& extension_id, | |
1662 bool value) { | |
1663 const Extension* extension = GetInstalledExtension(extension_id); | |
1664 // This method is called when the user enables/disables app notifications. | |
1665 // So it is not expected to be called until the extension is installed. | |
1666 if (!extension) { | |
1667 NOTREACHED(); | |
1668 return; | |
1669 } | |
1670 if (value) | |
1671 UMA_HISTOGRAM_COUNTS("Apps.SetAppNotificationsDisabled", 1); | |
1672 else | |
1673 UMA_HISTOGRAM_COUNTS("Apps.SetAppNotificationsEnabled", 1); | |
1674 extension_prefs_->SetAppNotificationDisabled(extension_id, value); | |
1675 SyncExtensionChangeIfNeeded(*extension); | |
1676 } | |
1677 | |
1678 bool ExtensionService::CanCrossIncognito(const Extension* extension) const { | 1629 bool ExtensionService::CanCrossIncognito(const Extension* extension) const { |
1679 // We allow the extension to see events and data from another profile iff it | 1630 // We allow the extension to see events and data from another profile iff it |
1680 // uses "spanning" behavior and it has incognito access. "split" mode | 1631 // uses "spanning" behavior and it has incognito access. "split" mode |
1681 // extensions only see events for a matching profile. | 1632 // extensions only see events for a matching profile. |
1682 CHECK(extension); | 1633 CHECK(extension); |
1683 return IsIncognitoEnabled(extension->id()) && | 1634 return IsIncognitoEnabled(extension->id()) && |
1684 !extension->incognito_split_mode(); | 1635 !extension->incognito_split_mode(); |
1685 } | 1636 } |
1686 | 1637 |
1687 bool ExtensionService::CanLoadInIncognito(const Extension* extension) const { | 1638 bool ExtensionService::CanLoadInIncognito(const Extension* extension) const { |
(...skipping 1451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3139 if (!extension) | 3090 if (!extension) |
3140 continue; | 3091 continue; |
3141 blacklisted_extensions_.Insert(extension); | 3092 blacklisted_extensions_.Insert(extension); |
3142 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST); | 3093 UnloadExtension(*it, extension_misc::UNLOAD_REASON_BLACKLIST); |
3143 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.BlacklistInstalled", | 3094 UMA_HISTOGRAM_ENUMERATION("ExtensionBlacklist.BlacklistInstalled", |
3144 extension->location(), Manifest::NUM_LOCATIONS); | 3095 extension->location(), Manifest::NUM_LOCATIONS); |
3145 } | 3096 } |
3146 | 3097 |
3147 IdentifyAlertableExtensions(); | 3098 IdentifyAlertableExtensions(); |
3148 } | 3099 } |
OLD | NEW |