diff options
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r-- | chrome/browser/extensions/extension_toolstrip_apitest.cc | 3 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_service.cc | 67 | ||||
-rw-r--r-- | chrome/browser/extensions/extensions_service.h | 6 |
3 files changed, 56 insertions, 20 deletions
diff --git a/chrome/browser/extensions/extension_toolstrip_apitest.cc b/chrome/browser/extensions/extension_toolstrip_apitest.cc index b4d4c4b..5e302db 100644 --- a/chrome/browser/extensions/extension_toolstrip_apitest.cc +++ b/chrome/browser/extensions/extension_toolstrip_apitest.cc @@ -4,9 +4,6 @@ #include "chrome/browser/extensions/extension_apitest.h" -// TEMPORARILY ENABLED TO GET DEBUG OUTPUT: -// TODO(rafaelw,erikkay) disabled due to flakiness -// BUG=22668 (probably the same bug) IN_PROC_BROWSER_TEST_F(ExtensionApiTest, Toolstrip) { ASSERT_TRUE(RunExtensionTest("toolstrip")) << message_; } diff --git a/chrome/browser/extensions/extensions_service.cc b/chrome/browser/extensions/extensions_service.cc index 1258e849..4f61ac4 100644 --- a/chrome/browser/extensions/extensions_service.cc +++ b/chrome/browser/extensions/extensions_service.cc @@ -18,6 +18,7 @@ #include "chrome/browser/extensions/external_extension_provider.h" #include "chrome/browser/extensions/external_pref_extension_provider.h" #include "chrome/browser/profile.h" +#include "chrome/browser/net/chrome_url_request_context.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_error_reporter.h" @@ -242,10 +243,7 @@ void ExtensionsService::EnableExtension(const std::string& extension_id) { ExtensionDOMUI::RegisterChromeURLOverrides(profile_, extension->GetChromeURLOverrides()); - NotificationService::current()->Notify( - NotificationType::EXTENSION_LOADED, - Source<ExtensionsService>(this), - Details<Extension>(extension)); + NotifyExtensionLoaded(extension); } void ExtensionsService::DisableExtension(const std::string& extension_id) { @@ -269,10 +267,7 @@ void ExtensionsService::DisableExtension(const std::string& extension_id) { ExtensionDOMUI::UnregisterChromeURLOverrides(profile_, extension->GetChromeURLOverrides()); - NotificationService::current()->Notify( - NotificationType::EXTENSION_UNLOADED, - Source<ExtensionsService>(this), - Details<Extension>(extension)); + NotifyExtensionUnloaded(extension); } void ExtensionsService::LoadExtension(const FilePath& extension_path) { @@ -324,6 +319,51 @@ void ExtensionsService::LoadInstalledExtension( } } +void ExtensionsService::NotifyExtensionLoaded(Extension* extension) { + LOG(INFO) << "Sending EXTENSION_LOADED"; + + // The ChromeURLRequestContext needs to be first to know that the extension + // was loaded, otherwise a race can arise where a renderer that is created + // for the extension may try to load an extension URL with an extension id + // that the request context doesn't yet know about. + if (profile_ && !profile_->IsOffTheRecord()) { + ChromeURLRequestContext* context = static_cast<ChromeURLRequestContext*>( + profile_->GetRequestContext()); + if (context) { + g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(context, + &ChromeURLRequestContext::OnNewExtensions, + extension->id(), + extension->path())); + } + } + + NotificationService::current()->Notify( + NotificationType::EXTENSION_LOADED, + Source<ExtensionsService>(this), + Details<Extension>(extension)); +} + +void ExtensionsService::NotifyExtensionUnloaded(Extension* extension) { + LOG(INFO) << "Sending EXTENSION_UNLOADED"; + + NotificationService::current()->Notify( + NotificationType::EXTENSION_UNLOADED, + Source<ExtensionsService>(this), + Details<Extension>(extension)); + + if (profile_ && !profile_->IsOffTheRecord()) { + ChromeURLRequestContext* context = static_cast<ChromeURLRequestContext*>( + profile_->GetRequestContext()); + if (context) { + g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, + NewRunnableMethod(context, + &ChromeURLRequestContext::OnUnloadedExtension, + extension->id())); + } + } +} + std::vector<ExtensionAction*> ExtensionsService::GetExtensionActions( ExtensionAction::ExtensionActionType action_type) const { std::vector<ExtensionAction*> result; @@ -413,10 +453,7 @@ void ExtensionsService::UnloadExtension(const std::string& extension_id) { // Remove the extension from our list. extensions_.erase(iter); - // Tell other services the extension is gone. - NotificationService::current()->Notify(NotificationType::EXTENSION_UNLOADED, - Source<ExtensionsService>(this), - Details<Extension>(extension.get())); + NotifyExtensionUnloaded(extension.get()); } void ExtensionsService::UnloadAllExtensions() { @@ -498,11 +535,7 @@ void ExtensionsService::OnExtensionLoaded(Extension* extension, if (extension->location() != Extension::LOAD) extension_prefs_->MigrateToPrefs(extension); - LOG(INFO) << "Sending EXTENSION_LOADED"; - NotificationService::current()->Notify( - NotificationType::EXTENSION_LOADED, - Source<ExtensionsService>(this), - Details<Extension>(extension)); + NotifyExtensionLoaded(extension); if (extension->IsTheme() && extension->location() == Extension::LOAD) { NotificationService::current()->Notify( diff --git a/chrome/browser/extensions/extensions_service.h b/chrome/browser/extensions/extensions_service.h index d683585..d4a6805 100644 --- a/chrome/browser/extensions/extensions_service.h +++ b/chrome/browser/extensions/extensions_service.h @@ -236,6 +236,12 @@ class ExtensionsService DictionaryValue* manifest, const std::string& id, const FilePath& path, Extension::Location location); + // Handles sending notification that |extension| was loaded. + void NotifyExtensionLoaded(Extension* extension); + + // Handles sending notification that |extension| was unloaded. + void NotifyExtensionUnloaded(Extension* extension); + // Retrieves a vector of all page actions or browser actions, irrespective of // which extension they belong to. std::vector<ExtensionAction*> GetExtensionActions( |