diff options
author | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-01 22:36:06 +0000 |
---|---|---|
committer | rafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-01 22:36:06 +0000 |
commit | 62d30f47055262ff3793ef0404e3de051680e8c9 (patch) | |
tree | 6d4e544462ea3c67f99035a04094eb6f3020103f /chrome/browser/extensions | |
parent | b4bb25099b2bc9b1bc1df1b231c859ef82110e7d (diff) | |
download | chromium_src-62d30f47055262ff3793ef0404e3de051680e8c9.zip chromium_src-62d30f47055262ff3793ef0404e3de051680e8c9.tar.gz chromium_src-62d30f47055262ff3793ef0404e3de051680e8c9.tar.bz2 |
Ensure ChromeURLRequestContext finds out first about extension loading.
This prevents races from arising where extension renderers may try to navigate to extension urls before the request context knows how to map the urls to extension resources.
BUG=22668
Review URL: http://codereview.chromium.org/255047
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27781 0039d316-1c4b-4281-b951-d872f2087c98
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( |