summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r--chrome/browser/extensions/extension_toolstrip_apitest.cc3
-rw-r--r--chrome/browser/extensions/extensions_service.cc67
-rw-r--r--chrome/browser/extensions/extensions_service.h6
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(