| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/extensions_service.h" | 5 #include "chrome/browser/extensions/extensions_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 // Errors are reported through ExtensionErrorReporter. On success, | 201 // Errors are reported through ExtensionErrorReporter. On success, |
| 202 // OnExtensionLoaded() is called. | 202 // OnExtensionLoaded() is called. |
| 203 // TODO(erikkay): It might be useful to be able to load a packed extension | 203 // TODO(erikkay): It might be useful to be able to load a packed extension |
| 204 // (presumably into memory) without installing it. | 204 // (presumably into memory) without installing it. |
| 205 void LoadSingleExtension(const FilePath &path, | 205 void LoadSingleExtension(const FilePath &path, |
| 206 scoped_refptr<ExtensionsService> frontend); | 206 scoped_refptr<ExtensionsService> frontend); |
| 207 | 207 |
| 208 // Check externally updated extensions for updates and install if necessary. | 208 // Check externally updated extensions for updates and install if necessary. |
| 209 // Errors are reported through ExtensionErrorReporter. Succcess is not | 209 // Errors are reported through ExtensionErrorReporter. Succcess is not |
| 210 // reported. | 210 // reported. |
| 211 void CheckForExternalUpdates(const std::set<std::string>& ids_to_ignore, | 211 void CheckForExternalUpdates(scoped_refptr<ExtensionsService> frontend); |
| 212 scoped_refptr<ExtensionsService> frontend); | |
| 213 | 212 |
| 214 // For the extension in |version_path| with |id|, check to see if it's an | 213 // For the extension in |version_path| with |id|, check to see if it's an |
| 215 // externally managed extension. If so, tell the frontend to uninstall it. | 214 // externally managed extension. If so, tell the frontend to uninstall it. |
| 216 void CheckExternalUninstall(scoped_refptr<ExtensionsService> frontend, | 215 void CheckExternalUninstall(scoped_refptr<ExtensionsService> frontend, |
| 217 const std::string& id); | 216 const std::string& id); |
| 218 | 217 |
| 219 // Clear all ExternalExtensionProviders. | 218 // Clear all ExternalExtensionProviders. |
| 220 void ClearProvidersForTesting(); | 219 void ClearProvidersForTesting(); |
| 221 | 220 |
| 222 // Adds an ExternalExtensionProvider for the service to use during testing. | 221 // Adds an ExternalExtensionProvider for the service to use during testing. |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 error, NotificationType::EXTENSION_INSTALL_ERROR, alert_on_error_)); | 362 error, NotificationType::EXTENSION_INSTALL_ERROR, alert_on_error_)); |
| 364 } | 363 } |
| 365 | 364 |
| 366 // Some extensions will autoupdate themselves externally from Chrome. These | 365 // Some extensions will autoupdate themselves externally from Chrome. These |
| 367 // are typically part of some larger client application package. To support | 366 // are typically part of some larger client application package. To support |
| 368 // these, the extension will register its location in the the preferences file | 367 // these, the extension will register its location in the the preferences file |
| 369 // (and also, on Windows, in the registry) and this code will periodically | 368 // (and also, on Windows, in the registry) and this code will periodically |
| 370 // check that location for a .crx file, which it will then install locally if | 369 // check that location for a .crx file, which it will then install locally if |
| 371 // a new version is available. | 370 // a new version is available. |
| 372 void ExtensionsServiceBackend::CheckForExternalUpdates( | 371 void ExtensionsServiceBackend::CheckForExternalUpdates( |
| 373 const std::set<std::string>& ids_to_ignore, | |
| 374 scoped_refptr<ExtensionsService> frontend) { | 372 scoped_refptr<ExtensionsService> frontend) { |
| 375 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 373 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
| 376 | 374 |
| 377 // Note that this installation is intentionally silent (since it didn't | 375 // Note that this installation is intentionally silent (since it didn't |
| 378 // go through the front-end). Extensions that are registered in this | 376 // go through the front-end). Extensions that are registered in this |
| 379 // way are effectively considered 'pre-bundled', and so implicitly | 377 // way are effectively considered 'pre-bundled', and so implicitly |
| 380 // trusted. In general, if something has HKLM or filesystem access, | 378 // trusted. In general, if something has HKLM or filesystem access, |
| 381 // they could install an extension manually themselves anyway. | 379 // they could install an extension manually themselves anyway. |
| 382 alert_on_error_ = false; | 380 alert_on_error_ = false; |
| 383 frontend_ = frontend; | 381 frontend_ = frontend; |
| 384 external_extension_added_ = false; | 382 external_extension_added_ = false; |
| 385 | 383 |
| 386 // Ask each external extension provider to give us a call back for each | 384 // Ask each external extension provider to give us a call back for each |
| 387 // extension they know about. See OnExternalExtension(File|UpdateUrl)Found. | 385 // extension they know about. See OnExternalExtension(File|UpdateUrl)Found. |
| 388 ProviderCollection::const_iterator i; | 386 ProviderCollection::const_iterator i; |
| 389 for (i = external_extension_providers_.begin(); | 387 for (i = external_extension_providers_.begin(); |
| 390 i != external_extension_providers_.end(); ++i) { | 388 i != external_extension_providers_.end(); ++i) { |
| 391 ExternalExtensionProvider* provider = i->get(); | 389 ExternalExtensionProvider* provider = i->get(); |
| 392 provider->VisitRegisteredExtension(this, ids_to_ignore); | 390 provider->VisitRegisteredExtension(this); |
| 393 } | 391 } |
| 394 | 392 |
| 395 if (external_extension_added_ && frontend->updater()) { | 393 if (external_extension_added_ && frontend->updater()) { |
| 396 BrowserThread::PostTask( | 394 BrowserThread::PostTask( |
| 397 BrowserThread::UI, FROM_HERE, | 395 BrowserThread::UI, FROM_HERE, |
| 398 NewRunnableMethod( | 396 NewRunnableMethod( |
| 399 frontend->updater(), &ExtensionUpdater::CheckNow)); | 397 frontend->updater(), &ExtensionUpdater::CheckNow)); |
| 400 } | 398 } |
| 401 } | 399 } |
| 402 | 400 |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 726 void ExtensionsService::AddPendingExtensionFromExternalUpdateUrl( | 724 void ExtensionsService::AddPendingExtensionFromExternalUpdateUrl( |
| 727 const std::string& id, const GURL& update_url, | 725 const std::string& id, const GURL& update_url, |
| 728 Extension::Location location) { | 726 Extension::Location location) { |
| 729 // Add the extension to this list of extensions to update. | 727 // Add the extension to this list of extensions to update. |
| 730 const PendingExtensionInfo::ExpectedCrxType kExpectedCrxType = | 728 const PendingExtensionInfo::ExpectedCrxType kExpectedCrxType = |
| 731 PendingExtensionInfo::UNKNOWN; | 729 PendingExtensionInfo::UNKNOWN; |
| 732 const bool kIsFromSync = false; | 730 const bool kIsFromSync = false; |
| 733 const bool kInstallSilently = true; | 731 const bool kInstallSilently = true; |
| 734 const bool kEnableOnInstall = true; | 732 const bool kEnableOnInstall = true; |
| 735 const bool kEnableIncognitoOnInstall = false; | 733 const bool kEnableIncognitoOnInstall = false; |
| 734 if (extension_prefs_->IsExtensionKilled(id)) |
| 735 return; |
| 736 | 736 |
| 737 if (GetExtensionByIdInternal(id, true, true)) { | 737 if (GetExtensionByIdInternal(id, true, true)) { |
| 738 LOG(DFATAL) << "Trying to add extension " << id | 738 LOG(DFATAL) << "Trying to add extension " << id |
| 739 << " by external update, but it is already installed."; | 739 << " by external update, but it is already installed."; |
| 740 return; | 740 return; |
| 741 } | 741 } |
| 742 | 742 |
| 743 AddPendingExtensionInternal(id, update_url, kExpectedCrxType, kIsFromSync, | 743 AddPendingExtensionInternal(id, update_url, kExpectedCrxType, kIsFromSync, |
| 744 kInstallSilently, kEnableOnInstall, | 744 kInstallSilently, kEnableOnInstall, |
| 745 kEnableIncognitoOnInstall, | 745 kEnableIncognitoOnInstall, |
| (...skipping 678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1424 bool ExtensionsService::GetBrowserActionVisibility(const Extension* extension) { | 1424 bool ExtensionsService::GetBrowserActionVisibility(const Extension* extension) { |
| 1425 return extension_prefs_->GetBrowserActionVisibility(extension); | 1425 return extension_prefs_->GetBrowserActionVisibility(extension); |
| 1426 } | 1426 } |
| 1427 | 1427 |
| 1428 void ExtensionsService::SetBrowserActionVisibility(const Extension* extension, | 1428 void ExtensionsService::SetBrowserActionVisibility(const Extension* extension, |
| 1429 bool visible) { | 1429 bool visible) { |
| 1430 extension_prefs_->SetBrowserActionVisibility(extension, visible); | 1430 extension_prefs_->SetBrowserActionVisibility(extension, visible); |
| 1431 } | 1431 } |
| 1432 | 1432 |
| 1433 void ExtensionsService::CheckForExternalUpdates() { | 1433 void ExtensionsService::CheckForExternalUpdates() { |
| 1434 // This installs or updates externally provided extensions. | |
| 1435 // TODO(aa): Why pass this list into the provider, why not just filter it | |
| 1436 // later? | |
| 1437 std::set<std::string> killed_extensions; | |
| 1438 extension_prefs_->GetKilledExtensionIds(&killed_extensions); | |
| 1439 BrowserThread::PostTask( | 1434 BrowserThread::PostTask( |
| 1440 BrowserThread::FILE, FROM_HERE, | 1435 BrowserThread::FILE, FROM_HERE, |
| 1441 NewRunnableMethod( | 1436 NewRunnableMethod( |
| 1442 backend_.get(), &ExtensionsServiceBackend::CheckForExternalUpdates, | 1437 backend_.get(), &ExtensionsServiceBackend::CheckForExternalUpdates, |
| 1443 killed_extensions, scoped_refptr<ExtensionsService>(this))); | 1438 scoped_refptr<ExtensionsService>(this))); |
| 1444 } | 1439 } |
| 1445 | 1440 |
| 1446 void ExtensionsService::UpdateExternalPolicyExtensionProvider() { | 1441 void ExtensionsService::UpdateExternalPolicyExtensionProvider() { |
| 1447 const ListValue* list_pref = | 1442 const ListValue* list_pref = |
| 1448 profile_->GetPrefs()->GetList(prefs::kExtensionInstallForceList); | 1443 profile_->GetPrefs()->GetList(prefs::kExtensionInstallForceList); |
| 1449 ListValue* list_copy = NULL; | 1444 ListValue* list_copy = NULL; |
| 1450 if (list_pref) | 1445 if (list_pref) |
| 1451 list_copy = static_cast<ListValue*>(list_pref->DeepCopy()); | 1446 list_copy = static_cast<ListValue*>(list_pref->DeepCopy()); |
| 1452 BrowserThread::PostTask( | 1447 BrowserThread::PostTask( |
| 1453 BrowserThread::FILE, FROM_HERE, | 1448 BrowserThread::FILE, FROM_HERE, |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1925 backend_.get(), &ExtensionsServiceBackend::AddProviderForTesting, | 1920 backend_.get(), &ExtensionsServiceBackend::AddProviderForTesting, |
| 1926 test_provider)); | 1921 test_provider)); |
| 1927 } | 1922 } |
| 1928 | 1923 |
| 1929 void ExtensionsService::OnExternalExtensionFileFound( | 1924 void ExtensionsService::OnExternalExtensionFileFound( |
| 1930 const std::string& id, | 1925 const std::string& id, |
| 1931 const std::string& version, | 1926 const std::string& version, |
| 1932 const FilePath& path, | 1927 const FilePath& path, |
| 1933 Extension::Location location) { | 1928 Extension::Location location) { |
| 1934 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1929 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1930 if (extension_prefs_->IsExtensionKilled(id)) |
| 1931 return; |
| 1935 | 1932 |
| 1936 // Before even bothering to unpack, check and see if we already have this | 1933 // Before even bothering to unpack, check and see if we already have this |
| 1937 // version. This is important because these extensions are going to get | 1934 // version. This is important because these extensions are going to get |
| 1938 // installed on every startup. | 1935 // installed on every startup. |
| 1939 const Extension* existing = GetExtensionById(id, true); | 1936 const Extension* existing = GetExtensionById(id, true); |
| 1940 scoped_ptr<Version> other(Version::GetVersionFromString(version)); | 1937 scoped_ptr<Version> other(Version::GetVersionFromString(version)); |
| 1941 if (existing) { | 1938 if (existing) { |
| 1942 switch (existing->version()->CompareTo(*other)) { | 1939 switch (existing->version()->CompareTo(*other)) { |
| 1943 case -1: // existing version is older, we should upgrade | 1940 case -1: // existing version is older, we should upgrade |
| 1944 break; | 1941 break; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2083 } | 2080 } |
| 2084 | 2081 |
| 2085 void ExtensionsService::SetBeingUpgraded(const Extension* extension, | 2082 void ExtensionsService::SetBeingUpgraded(const Extension* extension, |
| 2086 bool value) { | 2083 bool value) { |
| 2087 extension_runtime_data_[extension->id()].being_upgraded = value; | 2084 extension_runtime_data_[extension->id()].being_upgraded = value; |
| 2088 } | 2085 } |
| 2089 | 2086 |
| 2090 PropertyBag* ExtensionsService::GetPropertyBag(const Extension* extension) { | 2087 PropertyBag* ExtensionsService::GetPropertyBag(const Extension* extension) { |
| 2091 return &extension_runtime_data_[extension->id()].property_bag; | 2088 return &extension_runtime_data_[extension->id()].property_bag; |
| 2092 } | 2089 } |
| OLD | NEW |