| 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 #include "chrome/browser/extensions/extension_managed_mode_api.h" | 50 #include "chrome/browser/extensions/extension_managed_mode_api.h" |
| 51 #include "chrome/browser/extensions/extension_management_api.h" | 51 #include "chrome/browser/extensions/extension_management_api.h" |
| 52 #include "chrome/browser/extensions/extension_preference_api.h" | 52 #include "chrome/browser/extensions/extension_preference_api.h" |
| 53 #include "chrome/browser/extensions/extension_process_manager.h" | 53 #include "chrome/browser/extensions/extension_process_manager.h" |
| 54 #include "chrome/browser/extensions/extension_processes_api.h" | 54 #include "chrome/browser/extensions/extension_processes_api.h" |
| 55 #include "chrome/browser/extensions/extension_sorting.h" | 55 #include "chrome/browser/extensions/extension_sorting.h" |
| 56 #include "chrome/browser/extensions/extension_special_storage_policy.h" | 56 #include "chrome/browser/extensions/extension_special_storage_policy.h" |
| 57 #include "chrome/browser/extensions/extension_sync_data.h" | 57 #include "chrome/browser/extensions/extension_sync_data.h" |
| 58 #include "chrome/browser/extensions/extension_system.h" | 58 #include "chrome/browser/extensions/extension_system.h" |
| 59 #include "chrome/browser/extensions/extension_web_ui.h" | 59 #include "chrome/browser/extensions/extension_web_ui.h" |
| 60 #include "chrome/browser/extensions/external_extension_provider_impl.h" | 60 #include "chrome/browser/extensions/external_provider_impl.h" |
| 61 #include "chrome/browser/extensions/external_extension_provider_interface.h" | 61 #include "chrome/browser/extensions/external_provider_interface.h" |
| 62 #include "chrome/browser/extensions/installed_loader.h" | 62 #include "chrome/browser/extensions/installed_loader.h" |
| 63 #include "chrome/browser/extensions/pending_extension_manager.h" | 63 #include "chrome/browser/extensions/pending_extension_manager.h" |
| 64 #include "chrome/browser/extensions/permissions_updater.h" | 64 #include "chrome/browser/extensions/permissions_updater.h" |
| 65 #include "chrome/browser/extensions/settings/settings_frontend.h" | 65 #include "chrome/browser/extensions/settings/settings_frontend.h" |
| 66 #include "chrome/browser/extensions/unpacked_installer.h" | 66 #include "chrome/browser/extensions/unpacked_installer.h" |
| 67 #include "chrome/browser/extensions/updater/extension_updater.h" | 67 #include "chrome/browser/extensions/updater/extension_updater.h" |
| 68 #include "chrome/browser/history/history_extension_api.h" | 68 #include "chrome/browser/history/history_extension_api.h" |
| 69 #include "chrome/browser/net/chrome_url_request_context.h" | 69 #include "chrome/browser/net/chrome_url_request_context.h" |
| 70 #include "chrome/browser/prefs/pref_service.h" | 70 #include "chrome/browser/prefs/pref_service.h" |
| 71 #include "chrome/browser/profiles/profile.h" | 71 #include "chrome/browser/profiles/profile.h" |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 const char* ExtensionService::kSyncAppSettingsDirectoryName = | 191 const char* ExtensionService::kSyncAppSettingsDirectoryName = |
| 192 "Sync App Settings"; | 192 "Sync App Settings"; |
| 193 const char* ExtensionService::kSyncExtensionSettingsDirectoryName = | 193 const char* ExtensionService::kSyncExtensionSettingsDirectoryName = |
| 194 "Sync Extension Settings"; | 194 "Sync Extension Settings"; |
| 195 const char* ExtensionService::kStateStoreName = "Extension State"; | 195 const char* ExtensionService::kStateStoreName = "Extension State"; |
| 196 | 196 |
| 197 void ExtensionService::CheckExternalUninstall(const std::string& id) { | 197 void ExtensionService::CheckExternalUninstall(const std::string& id) { |
| 198 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 198 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 199 | 199 |
| 200 // Check if the providers know about this extension. | 200 // Check if the providers know about this extension. |
| 201 ProviderCollection::const_iterator i; | 201 extensions::ProviderCollection::const_iterator i; |
| 202 for (i = external_extension_providers_.begin(); | 202 for (i = external_extension_providers_.begin(); |
| 203 i != external_extension_providers_.end(); ++i) { | 203 i != external_extension_providers_.end(); ++i) { |
| 204 DCHECK(i->get()->IsReady()); | 204 DCHECK(i->get()->IsReady()); |
| 205 if (i->get()->HasExtension(id)) | 205 if (i->get()->HasExtension(id)) |
| 206 return; // Yup, known extension, don't uninstall. | 206 return; // Yup, known extension, don't uninstall. |
| 207 } | 207 } |
| 208 | 208 |
| 209 // We get the list of external extensions to check from preferences. | 209 // We get the list of external extensions to check from preferences. |
| 210 // It is possible that an extension has preferences but is not loaded. | 210 // It is possible that an extension has preferences but is not loaded. |
| 211 // For example, an extension that requires experimental permissions | 211 // For example, an extension that requires experimental permissions |
| 212 // will not be loaded if the experimental command line flag is not used. | 212 // will not be loaded if the experimental command line flag is not used. |
| 213 // In this case, do not uninstall. | 213 // In this case, do not uninstall. |
| 214 const Extension* extension = GetInstalledExtension(id); | 214 const Extension* extension = GetInstalledExtension(id); |
| 215 if (!extension) { | 215 if (!extension) { |
| 216 // We can't call UninstallExtension with an unloaded/invalid | 216 // We can't call UninstallExtension with an unloaded/invalid |
| 217 // extension ID. | 217 // extension ID. |
| 218 LOG(WARNING) << "Attempted uninstallation of unloaded/invalid extension " | 218 LOG(WARNING) << "Attempted uninstallation of unloaded/invalid extension " |
| 219 << "with id: " << id; | 219 << "with id: " << id; |
| 220 return; | 220 return; |
| 221 } | 221 } |
| 222 UninstallExtension(id, true, NULL); | 222 UninstallExtension(id, true, NULL); |
| 223 } | 223 } |
| 224 | 224 |
| 225 void ExtensionService::ClearProvidersForTesting() { | 225 void ExtensionService::ClearProvidersForTesting() { |
| 226 external_extension_providers_.clear(); | 226 external_extension_providers_.clear(); |
| 227 } | 227 } |
| 228 | 228 |
| 229 void ExtensionService::AddProviderForTesting( | 229 void ExtensionService::AddProviderForTesting( |
| 230 ExternalExtensionProviderInterface* test_provider) { | 230 extensions::ExternalProviderInterface* test_provider) { |
| 231 CHECK(test_provider); | 231 CHECK(test_provider); |
| 232 external_extension_providers_.push_back( | 232 external_extension_providers_.push_back( |
| 233 linked_ptr<ExternalExtensionProviderInterface>(test_provider)); | 233 linked_ptr<extensions::ExternalProviderInterface>(test_provider)); |
| 234 } | 234 } |
| 235 | 235 |
| 236 bool ExtensionService::OnExternalExtensionUpdateUrlFound( | 236 bool ExtensionService::OnExternalExtensionUpdateUrlFound( |
| 237 const std::string& id, | 237 const std::string& id, |
| 238 const GURL& update_url, | 238 const GURL& update_url, |
| 239 Extension::Location location) { | 239 Extension::Location location) { |
| 240 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 240 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 241 CHECK(Extension::IdIsValid(id)); | 241 CHECK(Extension::IdIsValid(id)); |
| 242 | 242 |
| 243 const Extension* extension = GetExtensionById(id, true); | 243 const Extension* extension = GetExtensionById(id, true); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 component_loader_.reset( | 382 component_loader_.reset( |
| 383 new extensions::ComponentLoader(this, | 383 new extensions::ComponentLoader(this, |
| 384 profile->GetPrefs(), | 384 profile->GetPrefs(), |
| 385 g_browser_process->local_state())); | 385 g_browser_process->local_state())); |
| 386 | 386 |
| 387 app_notification_manager_->Init(); | 387 app_notification_manager_->Init(); |
| 388 | 388 |
| 389 if (extensions_enabled_) { | 389 if (extensions_enabled_) { |
| 390 if (!command_line->HasSwitch(switches::kImport) && | 390 if (!command_line->HasSwitch(switches::kImport) && |
| 391 !command_line->HasSwitch(switches::kImportFromFile)) { | 391 !command_line->HasSwitch(switches::kImportFromFile)) { |
| 392 ExternalExtensionProviderImpl::CreateExternalProviders( | 392 extensions::ExternalProviderImpl::CreateExternalProviders( |
| 393 this, profile_, &external_extension_providers_); | 393 this, profile_, &external_extension_providers_); |
| 394 } | 394 } |
| 395 } | 395 } |
| 396 | 396 |
| 397 // Use monochrome icons for Omnibox icons. | 397 // Use monochrome icons for Omnibox icons. |
| 398 omnibox_popup_icon_manager_.set_monochrome(true); | 398 omnibox_popup_icon_manager_.set_monochrome(true); |
| 399 omnibox_icon_manager_.set_monochrome(true); | 399 omnibox_icon_manager_.set_monochrome(true); |
| 400 omnibox_icon_manager_.set_padding(gfx::Insets(0, kOmniboxIconPaddingLeft, | 400 omnibox_icon_manager_.set_padding(gfx::Insets(0, kOmniboxIconPaddingLeft, |
| 401 0, kOmniboxIconPaddingRight)); | 401 0, kOmniboxIconPaddingRight)); |
| 402 | 402 |
| (...skipping 27 matching lines...) Expand all Loading... |
| 430 } | 430 } |
| 431 | 431 |
| 432 PendingExtensionManager* ExtensionService::pending_extension_manager() { | 432 PendingExtensionManager* ExtensionService::pending_extension_manager() { |
| 433 return &pending_extension_manager_; | 433 return &pending_extension_manager_; |
| 434 } | 434 } |
| 435 | 435 |
| 436 ExtensionService::~ExtensionService() { | 436 ExtensionService::~ExtensionService() { |
| 437 // No need to unload extensions here because they are profile-scoped, and the | 437 // No need to unload extensions here because they are profile-scoped, and the |
| 438 // profile is in the process of being deleted. | 438 // profile is in the process of being deleted. |
| 439 | 439 |
| 440 ProviderCollection::const_iterator i; | 440 extensions::ProviderCollection::const_iterator i; |
| 441 for (i = external_extension_providers_.begin(); | 441 for (i = external_extension_providers_.begin(); |
| 442 i != external_extension_providers_.end(); ++i) { | 442 i != external_extension_providers_.end(); ++i) { |
| 443 ExternalExtensionProviderInterface* provider = i->get(); | 443 extensions::ExternalProviderInterface* provider = i->get(); |
| 444 provider->ServiceShutdown(); | 444 provider->ServiceShutdown(); |
| 445 } | 445 } |
| 446 } | 446 } |
| 447 | 447 |
| 448 void ExtensionService::InitEventRoutersAfterImport() { | 448 void ExtensionService::InitEventRoutersAfterImport() { |
| 449 RegisterForImportFinished(); | 449 RegisterForImportFinished(); |
| 450 } | 450 } |
| 451 | 451 |
| 452 void ExtensionService::RegisterForImportFinished() { | 452 void ExtensionService::RegisterForImportFinished() { |
| 453 if (!registrar_.IsRegistered(this, chrome::NOTIFICATION_IMPORT_FINISHED, | 453 if (!registrar_.IsRegistered(this, chrome::NOTIFICATION_IMPORT_FINISHED, |
| (...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1632 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1632 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1633 | 1633 |
| 1634 // Note that this installation is intentionally silent (since it didn't | 1634 // Note that this installation is intentionally silent (since it didn't |
| 1635 // go through the front-end). Extensions that are registered in this | 1635 // go through the front-end). Extensions that are registered in this |
| 1636 // way are effectively considered 'pre-bundled', and so implicitly | 1636 // way are effectively considered 'pre-bundled', and so implicitly |
| 1637 // trusted. In general, if something has HKLM or filesystem access, | 1637 // trusted. In general, if something has HKLM or filesystem access, |
| 1638 // they could install an extension manually themselves anyway. | 1638 // they could install an extension manually themselves anyway. |
| 1639 | 1639 |
| 1640 // Ask each external extension provider to give us a call back for each | 1640 // Ask each external extension provider to give us a call back for each |
| 1641 // extension they know about. See OnExternalExtension(File|UpdateUrl)Found. | 1641 // extension they know about. See OnExternalExtension(File|UpdateUrl)Found. |
| 1642 ProviderCollection::const_iterator i; | 1642 extensions::ProviderCollection::const_iterator i; |
| 1643 for (i = external_extension_providers_.begin(); | 1643 for (i = external_extension_providers_.begin(); |
| 1644 i != external_extension_providers_.end(); ++i) { | 1644 i != external_extension_providers_.end(); ++i) { |
| 1645 ExternalExtensionProviderInterface* provider = i->get(); | 1645 extensions::ExternalProviderInterface* provider = i->get(); |
| 1646 provider->VisitRegisteredExtension(); | 1646 provider->VisitRegisteredExtension(); |
| 1647 } | 1647 } |
| 1648 | 1648 |
| 1649 // Do any required work that we would have done after completion of all | 1649 // Do any required work that we would have done after completion of all |
| 1650 // providers. | 1650 // providers. |
| 1651 if (external_extension_providers_.empty()) { | 1651 if (external_extension_providers_.empty()) { |
| 1652 OnAllExternalProvidersReady(); | 1652 OnAllExternalProvidersReady(); |
| 1653 } | 1653 } |
| 1654 } | 1654 } |
| 1655 | 1655 |
| 1656 void ExtensionService::OnExternalProviderReady( | 1656 void ExtensionService::OnExternalProviderReady( |
| 1657 const ExternalExtensionProviderInterface* provider) { | 1657 const extensions::ExternalProviderInterface* provider) { |
| 1658 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1658 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 1659 CHECK(provider->IsReady()); | 1659 CHECK(provider->IsReady()); |
| 1660 | 1660 |
| 1661 // An external provider has finished loading. We only take action | 1661 // An external provider has finished loading. We only take action |
| 1662 // if all of them are finished. So we check them first. | 1662 // if all of them are finished. So we check them first. |
| 1663 if (AreAllExternalProvidersReady()) | 1663 if (AreAllExternalProvidersReady()) |
| 1664 OnAllExternalProvidersReady(); | 1664 OnAllExternalProvidersReady(); |
| 1665 } | 1665 } |
| 1666 | 1666 |
| 1667 bool ExtensionService::AreAllExternalProvidersReady() const { | 1667 bool ExtensionService::AreAllExternalProvidersReady() const { |
| 1668 ProviderCollection::const_iterator i; | 1668 extensions::ProviderCollection::const_iterator i; |
| 1669 for (i = external_extension_providers_.begin(); | 1669 for (i = external_extension_providers_.begin(); |
| 1670 i != external_extension_providers_.end(); ++i) { | 1670 i != external_extension_providers_.end(); ++i) { |
| 1671 if (!i->get()->IsReady()) | 1671 if (!i->get()->IsReady()) |
| 1672 return false; | 1672 return false; |
| 1673 } | 1673 } |
| 1674 return true; | 1674 return true; |
| 1675 } | 1675 } |
| 1676 | 1676 |
| 1677 void ExtensionService::OnAllExternalProvidersReady() { | 1677 void ExtensionService::OnAllExternalProvidersReady() { |
| 1678 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 1678 CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| (...skipping 883 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2562 | 2562 |
| 2563 // To coexist with certain unit tests that don't have a work-thread message | 2563 // To coexist with certain unit tests that don't have a work-thread message |
| 2564 // loop available at ExtensionService shutdown, we lazy-initialize this | 2564 // loop available at ExtensionService shutdown, we lazy-initialize this |
| 2565 // object so that those cases neither create nor destroy an | 2565 // object so that those cases neither create nor destroy an |
| 2566 // APIResourceController. | 2566 // APIResourceController. |
| 2567 if (!api_resource_controller_.get()) { | 2567 if (!api_resource_controller_.get()) { |
| 2568 api_resource_controller_.reset(new extensions::APIResourceController()); | 2568 api_resource_controller_.reset(new extensions::APIResourceController()); |
| 2569 } | 2569 } |
| 2570 return api_resource_controller_.get(); | 2570 return api_resource_controller_.get(); |
| 2571 } | 2571 } |
| OLD | NEW |