Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(533)

Unified Diff: chrome/browser/extensions/event_router.cc

Issue 10941003: Reset registered events and dispatch runtime.onInstalled to all extensions when (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ? Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/event_router.cc
diff --git a/chrome/browser/extensions/event_router.cc b/chrome/browser/extensions/event_router.cc
index ad6f70ec3658df27b316286fa794c8eda7820e01..20326b8a7f5d7442182653d5b288b4027cfa4180 100644
--- a/chrome/browser/extensions/event_router.cc
+++ b/chrome/browser/extensions/event_router.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/extensions/api/web_request/web_request_api.h"
#include "chrome/browser/extensions/extension_devtools_manager.h"
#include "chrome/browser/extensions/extension_host.h"
+#include "chrome/browser/extensions/extension_prefs.h"
#include "chrome/browser/extensions/extension_process_manager.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_system.h"
@@ -54,12 +55,13 @@ void NotifyEventListenerRemovedOnIOThread(
void DispatchOnInstalledEvent(
Profile* profile,
const std::string& extension_id,
- const Version& old_version) {
+ const Version& old_version,
+ bool chrome_updated) {
if (!g_browser_process->profile_manager()->IsValidProfile(profile))
return;
RuntimeEventRouter::DispatchOnInstalledEvent(profile, extension_id,
- old_version);
+ old_version, chrome_updated);
}
} // namespace
@@ -115,21 +117,33 @@ void EventRouter::DispatchEvent(IPC::Sender* ipc_sender,
event_args.get(), event_url, user_gesture, info);
}
-EventRouter::EventRouter(Profile* profile)
+EventRouter::EventRouter(Profile* profile, ExtensionPrefs* extension_prefs)
: profile_(profile),
extension_devtools_manager_(
ExtensionSystem::Get(profile)->devtools_manager()),
- listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
+ listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
+ dispatch_chrome_updated_event_(false) {
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
content::NotificationService::AllSources());
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
content::NotificationService::AllSources());
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
+ content::Source<Profile>(profile_));
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
content::Source<Profile>(profile_));
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
content::Source<Profile>(profile_));
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED,
content::Source<Profile>(profile_));
+
+ // NULL in unit_tests.
+ if (extension_prefs) {
+ // Check if registered events are up-to-date. We need to do this before
+ // reading the registered events, because it deletes them if they're out of
+ // date.
+ dispatch_chrome_updated_event_ =
+ !extension_prefs->CheckRegisteredEventsUpToDate();
+ }
}
EventRouter::~EventRouter() {}
@@ -555,6 +569,11 @@ void EventRouter::Observe(int type,
listeners_.RemoveListenersForProcess(renderer);
break;
}
+ case chrome::NOTIFICATION_EXTENSIONS_READY: {
+ // We're done restarting Chrome after an update.
+ dispatch_chrome_updated_event_ = false;
+ break;
+ }
case chrome::NOTIFICATION_EXTENSION_LOADED: {
// Add all registered lazy listeners to our cache.
const Extension* extension =
@@ -569,6 +588,12 @@ void EventRouter::Observe(int type,
prefs->GetFilteredEvents(extension->id());
if (filtered_events)
listeners_.LoadFilteredLazyListeners(extension->id(), *filtered_events);
+
+ if (dispatch_chrome_updated_event_) {
+ MessageLoop::current()->PostTask(FROM_HERE,
+ base::Bind(&DispatchOnInstalledEvent, profile_, extension->id(),
+ Version(), true));
+ }
break;
}
case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
@@ -593,7 +618,7 @@ void EventRouter::Observe(int type,
MessageLoop::current()->PostTask(FROM_HERE,
base::Bind(&DispatchOnInstalledEvent, profile_, extension->id(),
- old_version));
+ old_version, false));
break;
}
default:

Powered by Google App Engine
This is Rietveld 408576698