OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 731 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 } | 742 } |
743 | 743 |
744 bool ExtensionService::IsExternalExtensionUninstalled( | 744 bool ExtensionService::IsExternalExtensionUninstalled( |
745 const std::string& extension_id) const { | 745 const std::string& extension_id) const { |
746 return extension_prefs_->IsExternalExtensionUninstalled(extension_id); | 746 return extension_prefs_->IsExternalExtensionUninstalled(extension_id); |
747 } | 747 } |
748 | 748 |
749 void ExtensionService::EnableExtension(const std::string& extension_id) { | 749 void ExtensionService::EnableExtension(const std::string& extension_id) { |
750 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 750 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
751 | 751 |
752 const Extension* extension = | 752 if (IsExtensionEnabled(extension_id)) |
753 GetExtensionByIdInternal(extension_id, false, true, false); | |
754 if (!extension) | |
755 return; | 753 return; |
756 | 754 |
757 extension_prefs_->SetExtensionState(extension_id, Extension::ENABLED); | 755 extension_prefs_->SetExtensionState(extension_id, Extension::ENABLED); |
758 | 756 |
| 757 const Extension* extension = |
| 758 GetExtensionByIdInternal(extension_id, false, true, false); |
| 759 // This can happen if sync enables an extension that is not |
| 760 // installed yet. |
| 761 if (!extension) |
| 762 return; |
| 763 |
759 // Move it over to the enabled list. | 764 // Move it over to the enabled list. |
760 extensions_.push_back(make_scoped_refptr(extension)); | 765 extensions_.push_back(make_scoped_refptr(extension)); |
761 ExtensionList::iterator iter = std::find(disabled_extensions_.begin(), | 766 ExtensionList::iterator iter = std::find(disabled_extensions_.begin(), |
762 disabled_extensions_.end(), | 767 disabled_extensions_.end(), |
763 extension); | 768 extension); |
764 disabled_extensions_.erase(iter); | 769 disabled_extensions_.erase(iter); |
765 | 770 |
766 // Make sure any browser action contained within it is not hidden. | 771 // Make sure any browser action contained within it is not hidden. |
767 extension_prefs_->SetBrowserActionVisibility(extension, true); | 772 extension_prefs_->SetBrowserActionVisibility(extension, true); |
768 | 773 |
769 NotifyExtensionLoaded(extension); | 774 NotifyExtensionLoaded(extension); |
770 } | 775 } |
771 | 776 |
772 void ExtensionService::DisableExtension(const std::string& extension_id) { | 777 void ExtensionService::DisableExtension(const std::string& extension_id) { |
773 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 778 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
774 | 779 |
775 const Extension* extension = | |
776 GetExtensionByIdInternal(extension_id, true, false, false); | |
777 // The extension may have been disabled already. | 780 // The extension may have been disabled already. |
778 if (!extension) | 781 if (!IsExtensionEnabled(extension_id)) |
779 return; | 782 return; |
780 | 783 |
781 if (!Extension::UserMayDisable(extension->location())) | 784 const Extension* extension = GetInstalledExtension(extension_id); |
| 785 // |extension| can be NULL if sync disables an extension that is not |
| 786 // installed yet. |
| 787 if (extension && !Extension::UserMayDisable(extension->location())) |
782 return; | 788 return; |
783 | 789 |
784 extension_prefs_->SetExtensionState(extension_id, Extension::DISABLED); | 790 extension_prefs_->SetExtensionState(extension_id, Extension::DISABLED); |
785 | 791 |
| 792 extension = GetExtensionByIdInternal(extension_id, true, false, true); |
| 793 if (!extension) |
| 794 return; |
| 795 |
786 // Move it over to the disabled list. | 796 // Move it over to the disabled list. |
787 disabled_extensions_.push_back(make_scoped_refptr(extension)); | 797 disabled_extensions_.push_back(make_scoped_refptr(extension)); |
788 ExtensionList::iterator iter = std::find(extensions_.begin(), | 798 ExtensionList::iterator iter = std::find(extensions_.begin(), |
789 extensions_.end(), | 799 extensions_.end(), |
790 extension); | 800 extension); |
791 extensions_.erase(iter); | 801 if (iter != extensions_.end()) { |
| 802 extensions_.erase(iter); |
| 803 } else { |
| 804 iter = std::find(terminated_extensions_.begin(), |
| 805 terminated_extensions_.end(), |
| 806 extension); |
| 807 terminated_extensions_.erase(iter); |
| 808 } |
792 | 809 |
793 NotifyExtensionUnloaded(extension, UnloadedExtensionInfo::DISABLE); | 810 NotifyExtensionUnloaded(extension, UnloadedExtensionInfo::DISABLE); |
794 } | 811 } |
795 | 812 |
796 void ExtensionService::GrantPermissions(const Extension* extension) { | 813 void ExtensionService::GrantPermissions(const Extension* extension) { |
797 CHECK(extension); | 814 CHECK(extension); |
798 | 815 |
799 // We only maintain the granted permissions prefs for INTERNAL extensions. | 816 // We only maintain the granted permissions prefs for INTERNAL extensions. |
800 CHECK_EQ(Extension::INTERNAL, extension->location()); | 817 CHECK_EQ(Extension::INTERNAL, extension->location()); |
801 | 818 |
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1345 // Handle uninstalls first. | 1362 // Handle uninstalls first. |
1346 if (extension_sync_data.uninstalled) { | 1363 if (extension_sync_data.uninstalled) { |
1347 std::string error; | 1364 std::string error; |
1348 if (!UninstallExtensionHelper(this, id)) { | 1365 if (!UninstallExtensionHelper(this, id)) { |
1349 LOG(WARNING) << "Could not uninstall extension " << id | 1366 LOG(WARNING) << "Could not uninstall extension " << id |
1350 << " for sync"; | 1367 << " for sync"; |
1351 } | 1368 } |
1352 return; | 1369 return; |
1353 } | 1370 } |
1354 | 1371 |
| 1372 // Set user settings. |
| 1373 if (extension_sync_data.enabled) { |
| 1374 EnableExtension(id); |
| 1375 } else { |
| 1376 DisableExtension(id); |
| 1377 } |
1355 SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled); | 1378 SetIsIncognitoEnabled(id, extension_sync_data.incognito_enabled); |
1356 | 1379 |
1357 const Extension* extension = | 1380 const Extension* extension = GetInstalledExtension(id); |
1358 GetExtensionByIdInternal(id, true, true, false); | |
1359 // TODO(akalin): Figure out what to do with terminated extensions. | |
1360 | |
1361 // Handle already-installed extensions. | |
1362 if (extension) { | 1381 if (extension) { |
1363 // TODO(akalin): Make it so we can enable/disable an extension | 1382 // If the extension is already installed, check if it's outdated. |
1364 // even if it's not installed yet. | |
1365 if (extension_sync_data.enabled) { | |
1366 EnableExtension(id); | |
1367 } else { | |
1368 DisableExtension(id); | |
1369 } | |
1370 int result = extension->version()->CompareTo(extension_sync_data.version); | 1383 int result = extension->version()->CompareTo(extension_sync_data.version); |
1371 if (result < 0) { | 1384 if (result < 0) { |
1372 // Extension is outdated. | 1385 // Extension is outdated. |
1373 CheckForUpdatesSoon(); | 1386 CheckForUpdatesSoon(); |
1374 } else if (result > 0) { | 1387 } else if (result > 0) { |
1375 // Sync version is outdated. Do nothing for now, as sync code | 1388 // Sync version is outdated. Do nothing for now, as sync code |
1376 // in other places will eventually update the sync data. | 1389 // in other places will eventually update the sync data. |
1377 // | 1390 // |
1378 // TODO(akalin): Move that code here. | 1391 // TODO(akalin): Move that code here. |
1379 } | 1392 } |
1380 return; | 1393 return; |
| 1394 } else { |
| 1395 // TODO(akalin): Remove need to pass the enabled flag. |
| 1396 // |
| 1397 // TODO(akalin): Replace silent update with a list of enabled |
| 1398 // permissions. |
| 1399 if (!pending_extension_manager()->AddFromSync( |
| 1400 id, |
| 1401 extension_sync_data.update_url, |
| 1402 filter, |
| 1403 true, // install_silently |
| 1404 extension_sync_data.enabled)) { |
| 1405 LOG(WARNING) << "Could not add pending extension for " << id; |
| 1406 return; |
| 1407 } |
| 1408 CheckForUpdatesSoon(); |
1381 } | 1409 } |
1382 | |
1383 // Handle not-yet-installed extensions. | |
1384 // | |
1385 // TODO(akalin): Replace silent update with a list of enabled | |
1386 // permissions. | |
1387 if (!pending_extension_manager()->AddFromSync( | |
1388 id, | |
1389 extension_sync_data.update_url, | |
1390 filter, | |
1391 true, // install_silently | |
1392 extension_sync_data.enabled)) { | |
1393 LOG(WARNING) << "Could not add pending extension for " << id; | |
1394 return; | |
1395 } | |
1396 CheckForUpdatesSoon(); | |
1397 } | 1410 } |
1398 | 1411 |
1399 bool ExtensionService::IsIncognitoEnabled( | 1412 bool ExtensionService::IsIncognitoEnabled( |
1400 const std::string& extension_id) const { | 1413 const std::string& extension_id) const { |
1401 // If this is an existing component extension we always allow it to | 1414 // If this is an existing component extension we always allow it to |
1402 // work in incognito mode. | 1415 // work in incognito mode. |
1403 const Extension* extension = GetInstalledExtension(extension_id); | 1416 const Extension* extension = GetInstalledExtension(extension_id); |
1404 if (extension && extension->location() == Extension::COMPONENT) | 1417 if (extension && extension->location() == Extension::COMPONENT) |
1405 return true; | 1418 return true; |
1406 | 1419 |
(...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2191 | 2204 |
2192 ExtensionService::NaClModuleInfoList::iterator | 2205 ExtensionService::NaClModuleInfoList::iterator |
2193 ExtensionService::FindNaClModule(const GURL& url) { | 2206 ExtensionService::FindNaClModule(const GURL& url) { |
2194 for (NaClModuleInfoList::iterator iter = nacl_module_list_.begin(); | 2207 for (NaClModuleInfoList::iterator iter = nacl_module_list_.begin(); |
2195 iter != nacl_module_list_.end(); ++iter) { | 2208 iter != nacl_module_list_.end(); ++iter) { |
2196 if (iter->url == url) | 2209 if (iter->url == url) |
2197 return iter; | 2210 return iter; |
2198 } | 2211 } |
2199 return nacl_module_list_.end(); | 2212 return nacl_module_list_.end(); |
2200 } | 2213 } |
OLD | NEW |