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