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/extension_service.h" | 5 #include "chrome/browser/extensions/extension_service.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 this, profile_, &external_extension_providers_); | 438 this, profile_, &external_extension_providers_); |
439 } | 439 } |
440 } | 440 } |
441 | 441 |
442 // Use monochrome icons for Omnibox icons. | 442 // Use monochrome icons for Omnibox icons. |
443 omnibox_popup_icon_manager_.set_monochrome(true); | 443 omnibox_popup_icon_manager_.set_monochrome(true); |
444 omnibox_icon_manager_.set_monochrome(true); | 444 omnibox_icon_manager_.set_monochrome(true); |
445 omnibox_icon_manager_.set_padding(gfx::Insets(0, kOmniboxIconPaddingLeft, | 445 omnibox_icon_manager_.set_padding(gfx::Insets(0, kOmniboxIconPaddingLeft, |
446 0, kOmniboxIconPaddingRight)); | 446 0, kOmniboxIconPaddingRight)); |
447 | 447 |
| 448 // Set this as the ExtensionService for extension sorting to ensure it |
| 449 // cause syncs if required. |
| 450 extension_prefs_->extension_sorting()->SetExtensionService(this); |
| 451 |
448 // How long is the path to the Extensions directory? | 452 // How long is the path to the Extensions directory? |
449 UMA_HISTOGRAM_CUSTOM_COUNTS("Extensions.ExtensionRootPathLength", | 453 UMA_HISTOGRAM_CUSTOM_COUNTS("Extensions.ExtensionRootPathLength", |
450 install_directory_.value().length(), 0, 500, 100); | 454 install_directory_.value().length(), 0, 500, 100); |
451 } | 455 } |
452 | 456 |
453 const ExtensionSet* ExtensionService::extensions() const { | 457 const ExtensionSet* ExtensionService::extensions() const { |
454 return &extensions_; | 458 return &extensions_; |
455 } | 459 } |
456 | 460 |
457 const ExtensionSet* ExtensionService::disabled_extensions() const { | 461 const ExtensionSet* ExtensionService::disabled_extensions() const { |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
767 SyncBundle* sync_bundle = GetSyncBundleForExtension(*extension); | 771 SyncBundle* sync_bundle = GetSyncBundleForExtension(*extension); |
768 | 772 |
769 SyncChange sync_change; | 773 SyncChange sync_change; |
770 if (sync_bundle) { | 774 if (sync_bundle) { |
771 ExtensionSyncData extension_sync_data( | 775 ExtensionSyncData extension_sync_data( |
772 *extension, | 776 *extension, |
773 IsExtensionEnabled(extension_id), | 777 IsExtensionEnabled(extension_id), |
774 IsIncognitoEnabled(extension_id), | 778 IsIncognitoEnabled(extension_id), |
775 extension_prefs_->GetAppNotificationClientId(extension_id), | 779 extension_prefs_->GetAppNotificationClientId(extension_id), |
776 extension_prefs_->IsAppNotificationDisabled(extension_id), | 780 extension_prefs_->IsAppNotificationDisabled(extension_id), |
777 GetAppLaunchOrdinal(extension_id), | 781 extension_prefs_->extension_sorting()-> |
778 GetPageOrdinal(extension_id)); | 782 GetAppLaunchOrdinal(extension_id), |
| 783 extension_prefs_->extension_sorting()->GetPageOrdinal(extension_id)); |
779 sync_change = extension_sync_data.GetSyncChange(SyncChange::ACTION_DELETE); | 784 sync_change = extension_sync_data.GetSyncChange(SyncChange::ACTION_DELETE); |
780 } | 785 } |
781 | 786 |
782 UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallType", | 787 UMA_HISTOGRAM_ENUMERATION("Extensions.UninstallType", |
783 extension->GetType(), 100); | 788 extension->GetType(), 100); |
784 RecordPermissionMessagesHistogram( | 789 RecordPermissionMessagesHistogram( |
785 extension, "Extensions.Permissions_Uninstall"); | 790 extension, "Extensions.Permissions_Uninstall"); |
786 | 791 |
787 TemplateURLService* url_service = | 792 TemplateURLService* url_service = |
788 TemplateURLServiceFactory::GetForProfile(profile_); | 793 TemplateURLServiceFactory::GetForProfile(profile_); |
(...skipping 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1267 | 1272 |
1268 bool ExtensionService::SyncBundle::HasExtensionId(const std::string& id) const { | 1273 bool ExtensionService::SyncBundle::HasExtensionId(const std::string& id) const { |
1269 return synced_extensions.find(id) != synced_extensions.end(); | 1274 return synced_extensions.find(id) != synced_extensions.end(); |
1270 } | 1275 } |
1271 | 1276 |
1272 bool ExtensionService::SyncBundle::HasPendingExtensionId(const std::string& id) | 1277 bool ExtensionService::SyncBundle::HasPendingExtensionId(const std::string& id) |
1273 const { | 1278 const { |
1274 return pending_sync_data.find(id) != pending_sync_data.end(); | 1279 return pending_sync_data.find(id) != pending_sync_data.end(); |
1275 } | 1280 } |
1276 | 1281 |
1277 void ExtensionService::SyncExtensionChangeIfNeeded(const Extension& extension) { | |
1278 SyncBundle* sync_bundle = GetSyncBundleForExtension(extension); | |
1279 if (sync_bundle) { | |
1280 ExtensionSyncData extension_sync_data( | |
1281 extension, | |
1282 IsExtensionEnabled(extension.id()), | |
1283 IsIncognitoEnabled(extension.id()), | |
1284 extension_prefs_->GetAppNotificationClientId(extension.id()), | |
1285 extension_prefs_->IsAppNotificationDisabled(extension.id()), | |
1286 GetAppLaunchOrdinal(extension.id()), | |
1287 GetPageOrdinal(extension.id())); | |
1288 | |
1289 SyncChangeList sync_change_list(1, extension_sync_data.GetSyncChange( | |
1290 sync_bundle->HasExtensionId(extension.id()) ? | |
1291 SyncChange::ACTION_UPDATE : SyncChange::ACTION_ADD)); | |
1292 sync_bundle->sync_processor->ProcessSyncChanges( | |
1293 FROM_HERE, sync_change_list); | |
1294 sync_bundle->synced_extensions.insert(extension.id()); | |
1295 sync_bundle->pending_sync_data.erase(extension.id()); | |
1296 } | |
1297 } | |
1298 | |
1299 ExtensionService::SyncBundle* ExtensionService::GetSyncBundleForExtension( | 1282 ExtensionService::SyncBundle* ExtensionService::GetSyncBundleForExtension( |
1300 const Extension& extension) { | 1283 const Extension& extension) { |
1301 if (app_sync_bundle_.filter(extension)) | 1284 if (app_sync_bundle_.filter(extension)) |
1302 return &app_sync_bundle_; | 1285 return &app_sync_bundle_; |
1303 else if (extension_sync_bundle_.filter(extension)) | 1286 else if (extension_sync_bundle_.filter(extension)) |
1304 return &extension_sync_bundle_; | 1287 return &extension_sync_bundle_; |
1305 else | 1288 else |
1306 return NULL; | 1289 return NULL; |
1307 } | 1290 } |
1308 | 1291 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1453 // If we have pending extension data for this extension, then this | 1436 // If we have pending extension data for this extension, then this |
1454 // version is out of date. We'll sync back the version we got from | 1437 // version is out of date. We'll sync back the version we got from |
1455 // sync. | 1438 // sync. |
1456 !bundle.HasPendingExtensionId(extension.id())) { | 1439 !bundle.HasPendingExtensionId(extension.id())) { |
1457 sync_data_list->push_back(ExtensionSyncData( | 1440 sync_data_list->push_back(ExtensionSyncData( |
1458 extension, | 1441 extension, |
1459 IsExtensionEnabled(extension.id()), | 1442 IsExtensionEnabled(extension.id()), |
1460 IsIncognitoEnabled(extension.id()), | 1443 IsIncognitoEnabled(extension.id()), |
1461 extension_prefs_->GetAppNotificationClientId(extension.id()), | 1444 extension_prefs_->GetAppNotificationClientId(extension.id()), |
1462 extension_prefs_->IsAppNotificationDisabled(extension.id()), | 1445 extension_prefs_->IsAppNotificationDisabled(extension.id()), |
1463 GetAppLaunchOrdinal(extension.id()), | 1446 extension_prefs_->extension_sorting()-> |
1464 GetPageOrdinal(extension.id()))); | 1447 GetAppLaunchOrdinal(extension.id()), |
| 1448 extension_prefs_->extension_sorting()-> |
| 1449 GetPageOrdinal(extension.id()))); |
1465 } | 1450 } |
1466 } | 1451 } |
1467 } | 1452 } |
1468 | 1453 |
1469 std::vector<ExtensionSyncData> ExtensionService::GetSyncDataList( | 1454 std::vector<ExtensionSyncData> ExtensionService::GetSyncDataList( |
1470 const SyncBundle& bundle) const { | 1455 const SyncBundle& bundle) const { |
1471 std::vector<ExtensionSyncData> extension_sync_list; | 1456 std::vector<ExtensionSyncData> extension_sync_list; |
1472 GetSyncDataListHelper(extensions_, bundle, &extension_sync_list); | 1457 GetSyncDataListHelper(extensions_, bundle, &extension_sync_list); |
1473 GetSyncDataListHelper(disabled_extensions_, bundle, &extension_sync_list); | 1458 GetSyncDataListHelper(disabled_extensions_, bundle, &extension_sync_list); |
1474 GetSyncDataListHelper(terminated_extensions_, bundle, &extension_sync_list); | 1459 GetSyncDataListHelper(terminated_extensions_, bundle, &extension_sync_list); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1516 // incognito flag invalidates the |extension| pointer (it reloads the | 1501 // incognito flag invalidates the |extension| pointer (it reloads the |
1517 // extension). | 1502 // extension). |
1518 bool extension_installed = (extension != NULL); | 1503 bool extension_installed = (extension != NULL); |
1519 int result = extension ? | 1504 int result = extension ? |
1520 extension->version()->CompareTo(extension_sync_data.version()) : 0; | 1505 extension->version()->CompareTo(extension_sync_data.version()) : 0; |
1521 SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled()); | 1506 SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled()); |
1522 extension = NULL; // No longer safe to use. | 1507 extension = NULL; // No longer safe to use. |
1523 | 1508 |
1524 if (extension_sync_data.app_launch_ordinal().IsValid() && | 1509 if (extension_sync_data.app_launch_ordinal().IsValid() && |
1525 extension_sync_data.page_ordinal().IsValid()) { | 1510 extension_sync_data.page_ordinal().IsValid()) { |
1526 SetAppLaunchOrdinal(id, extension_sync_data.app_launch_ordinal()); | 1511 extension_prefs_->extension_sorting()->SetAppLaunchOrdinal( |
1527 SetPageOrdinal(id, extension_sync_data.page_ordinal()); | 1512 id, |
| 1513 extension_sync_data.app_launch_ordinal()); |
| 1514 extension_prefs_->extension_sorting()->SetPageOrdinal( |
| 1515 id, |
| 1516 extension_sync_data.page_ordinal()); |
1528 } | 1517 } |
1529 | 1518 |
1530 if (extension_installed) { | 1519 if (extension_installed) { |
1531 // If the extension is already installed, check if it's outdated. | 1520 // If the extension is already installed, check if it's outdated. |
1532 if (result < 0) { | 1521 if (result < 0) { |
1533 // Extension is outdated. | 1522 // Extension is outdated. |
1534 bundle.pending_sync_data[extension_sync_data.id()] = extension_sync_data; | 1523 bundle.pending_sync_data[extension_sync_data.id()] = extension_sync_data; |
1535 CheckForUpdatesSoon(); | 1524 CheckForUpdatesSoon(); |
1536 } | 1525 } |
1537 if (extension_sync_data.type() == Extension::SYNC_TYPE_APP && | 1526 if (extension_sync_data.type() == Extension::SYNC_TYPE_APP && |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1653 | 1642 |
1654 bool ExtensionService::CanLoadInIncognito(const Extension* extension) const { | 1643 bool ExtensionService::CanLoadInIncognito(const Extension* extension) const { |
1655 if (extension->is_hosted_app()) | 1644 if (extension->is_hosted_app()) |
1656 return true; | 1645 return true; |
1657 // Packaged apps and regular extensions need to be enabled specifically for | 1646 // Packaged apps and regular extensions need to be enabled specifically for |
1658 // incognito (and split mode should be set). | 1647 // incognito (and split mode should be set). |
1659 return extension->incognito_split_mode() && | 1648 return extension->incognito_split_mode() && |
1660 IsIncognitoEnabled(extension->id()); | 1649 IsIncognitoEnabled(extension->id()); |
1661 } | 1650 } |
1662 | 1651 |
1663 StringOrdinal ExtensionService::GetAppLaunchOrdinal( | |
1664 const std::string& extension_id) const { | |
1665 return | |
1666 extension_prefs_->extension_sorting()->GetAppLaunchOrdinal(extension_id); | |
1667 } | |
1668 | |
1669 void ExtensionService::SetAppLaunchOrdinal( | |
1670 const std::string& extension_id, | |
1671 const StringOrdinal& app_launch_ordinal) { | |
1672 // Only apps should set this value, so we check that it is either an app or | |
1673 // that it is not yet installed (so we can't be sure it is an app). It is | |
1674 // possible to be setting this value through syncing before the app is | |
1675 // installed. | |
1676 const Extension* ext = GetExtensionById(extension_id, true); | |
1677 DCHECK(!ext || ext->is_app()); | |
1678 | |
1679 extension_prefs_->extension_sorting()->SetAppLaunchOrdinal( | |
1680 extension_id, app_launch_ordinal); | |
1681 | |
1682 const Extension* extension = GetInstalledExtension(extension_id); | |
1683 if (extension) | |
1684 SyncExtensionChangeIfNeeded(*extension); | |
1685 } | |
1686 | |
1687 StringOrdinal ExtensionService::GetPageOrdinal( | |
1688 const std::string& extension_id) const { | |
1689 return extension_prefs_->extension_sorting()->GetPageOrdinal(extension_id); | |
1690 } | |
1691 | |
1692 void ExtensionService::SetPageOrdinal(const std::string& extension_id, | |
1693 const StringOrdinal& page_ordinal) { | |
1694 // Only apps should set this value, so we check that it is either an app or | |
1695 // that it is not yet installed (so we can't be sure it is an app). It is | |
1696 // possible to be setting this value through syncing before the app is | |
1697 // installed. | |
1698 const Extension* ext = GetExtensionById(extension_id, true); | |
1699 DCHECK(!ext || ext->is_app()); | |
1700 | |
1701 extension_prefs_->extension_sorting()->SetPageOrdinal( | |
1702 extension_id, page_ordinal); | |
1703 | |
1704 const Extension* extension = GetInstalledExtension(extension_id); | |
1705 if (extension) | |
1706 SyncExtensionChangeIfNeeded(*extension); | |
1707 } | |
1708 | |
1709 void ExtensionService::OnExtensionMoved( | 1652 void ExtensionService::OnExtensionMoved( |
1710 const std::string& moved_extension_id, | 1653 const std::string& moved_extension_id, |
1711 const std::string& predecessor_extension_id, | 1654 const std::string& predecessor_extension_id, |
1712 const std::string& successor_extension_id) { | 1655 const std::string& successor_extension_id) { |
1713 extension_prefs_->extension_sorting()->OnExtensionMoved( | 1656 extension_prefs_->extension_sorting()->OnExtensionMoved( |
1714 moved_extension_id, | 1657 moved_extension_id, |
1715 predecessor_extension_id, | 1658 predecessor_extension_id, |
1716 successor_extension_id); | 1659 successor_extension_id); |
1717 | 1660 |
1718 const Extension* extension = GetInstalledExtension(moved_extension_id); | 1661 const Extension* extension = GetInstalledExtension(moved_extension_id); |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2004 NOTREACHED(); | 1947 NOTREACHED(); |
2005 | 1948 |
2006 // Also garbage-collect themes. We check |profile_| to be | 1949 // Also garbage-collect themes. We check |profile_| to be |
2007 // defensive; in the future, we may call GarbageCollectExtensions() | 1950 // defensive; in the future, we may call GarbageCollectExtensions() |
2008 // from somewhere other than Init() (e.g., in a timer). | 1951 // from somewhere other than Init() (e.g., in a timer). |
2009 if (profile_) { | 1952 if (profile_) { |
2010 ThemeServiceFactory::GetForProfile(profile_)->RemoveUnusedThemes(); | 1953 ThemeServiceFactory::GetForProfile(profile_)->RemoveUnusedThemes(); |
2011 } | 1954 } |
2012 } | 1955 } |
2013 | 1956 |
| 1957 void ExtensionService::SyncExtensionChangeIfNeeded(const Extension& extension) { |
| 1958 SyncBundle* sync_bundle = GetSyncBundleForExtension(extension); |
| 1959 if (sync_bundle) { |
| 1960 ExtensionSyncData extension_sync_data( |
| 1961 extension, |
| 1962 IsExtensionEnabled(extension.id()), |
| 1963 IsIncognitoEnabled(extension.id()), |
| 1964 extension_prefs_->GetAppNotificationClientId(extension.id()), |
| 1965 extension_prefs_->IsAppNotificationDisabled(extension.id()), |
| 1966 extension_prefs_->extension_sorting()-> |
| 1967 GetAppLaunchOrdinal(extension.id()), |
| 1968 extension_prefs_->extension_sorting()->GetPageOrdinal(extension.id())); |
| 1969 |
| 1970 SyncChangeList sync_change_list(1, extension_sync_data.GetSyncChange( |
| 1971 sync_bundle->HasExtensionId(extension.id()) ? |
| 1972 SyncChange::ACTION_UPDATE : SyncChange::ACTION_ADD)); |
| 1973 sync_bundle->sync_processor->ProcessSyncChanges( |
| 1974 FROM_HERE, sync_change_list); |
| 1975 sync_bundle->synced_extensions.insert(extension.id()); |
| 1976 sync_bundle->pending_sync_data.erase(extension.id()); |
| 1977 } |
| 1978 } |
| 1979 |
2014 void ExtensionService::OnLoadedInstalledExtensions() { | 1980 void ExtensionService::OnLoadedInstalledExtensions() { |
2015 if (updater_.get()) { | 1981 if (updater_.get()) { |
2016 updater_->Start(); | 1982 updater_->Start(); |
2017 } | 1983 } |
2018 | 1984 |
2019 ready_ = true; | 1985 ready_ = true; |
2020 content::NotificationService::current()->Notify( | 1986 content::NotificationService::current()->Notify( |
2021 chrome::NOTIFICATION_EXTENSIONS_READY, | 1987 chrome::NOTIFICATION_EXTENSIONS_READY, |
2022 content::Source<Profile>(profile_), | 1988 content::Source<Profile>(profile_), |
2023 content::NotificationService::NoDetails()); | 1989 content::NotificationService::NoDetails()); |
(...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2668 return api_resource_controller_; | 2634 return api_resource_controller_; |
2669 } | 2635 } |
2670 | 2636 |
2671 extensions::RulesRegistryService* ExtensionService::GetRulesRegistryService() { | 2637 extensions::RulesRegistryService* ExtensionService::GetRulesRegistryService() { |
2672 if (!rules_registry_service_.get()) { | 2638 if (!rules_registry_service_.get()) { |
2673 rules_registry_service_.reset( | 2639 rules_registry_service_.reset( |
2674 new extensions::RulesRegistryService(profile_)); | 2640 new extensions::RulesRegistryService(profile_)); |
2675 } | 2641 } |
2676 return rules_registry_service_.get(); | 2642 return rules_registry_service_.get(); |
2677 } | 2643 } |
OLD | NEW |