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

Unified Diff: chrome/browser/extensions/api/push_messaging/push_messaging_api.cc

Issue 10826156: Plumb invalidations from Tango to the extensions code for the Push Messaging API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix Android build Created 8 years, 4 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/api/push_messaging/push_messaging_api.cc
diff --git a/chrome/browser/extensions/api/push_messaging/push_messaging_api.cc b/chrome/browser/extensions/api/push_messaging/push_messaging_api.cc
index cc92f87bf20c337da9829d319bb89c3c14820560..fffd6a9ec34979312218310e95db1fa827d8247e 100644
--- a/chrome/browser/extensions/api/push_messaging/push_messaging_api.cc
+++ b/chrome/browser/extensions/api/push_messaging/push_messaging_api.cc
@@ -4,18 +4,31 @@
#include "chrome/browser/extensions/api/push_messaging/push_messaging_api.h"
+#include <set>
+
#include "base/bind.h"
+#include "base/logging.h"
#include "base/values.h"
+#include "chrome/browser/extensions/api/push_messaging/push_messaging_invalidation_handler.h"
#include "chrome/browser/extensions/event_names.h"
#include "chrome/browser/extensions/event_router.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_system.h"
#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/sync/profile_sync_service.h"
+#include "chrome/browser/sync/profile_sync_service_factory.h"
+#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/api/experimental_push_messaging.h"
-#include "content/public/browser/browser_thread.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_set.h"
+#include "chrome/common/extensions/permissions/api_permission.h"
+#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_source.h"
#include "googleurl/src/gurl.h"
namespace extensions {
-namespace glue = extensions::api::experimental_push_messaging;
+namespace glue = api::experimental_push_messaging;
PushMessagingEventRouter::PushMessagingEventRouter(Profile* profile)
: profile_(profile) {
@@ -24,7 +37,52 @@ PushMessagingEventRouter::PushMessagingEventRouter(Profile* profile)
PushMessagingEventRouter::~PushMessagingEventRouter() {}
void PushMessagingEventRouter::Init() {
- // TODO(dcheng): Add hooks into InvalidationHandler when landed.
+ ProfileSyncService* pss = ProfileSyncServiceFactory::GetForProfile(profile_);
+ // This may be NULL; for example, for the ChromeOS guest user. In these cases,
+ // just return without setting up anything, since it won't work anyway.
+ if (!pss)
+ return;
+
+ const ExtensionSet* extensions =
+ ExtensionSystem::Get(profile_)->extension_service()->extensions();
+ std::set<std::string> push_messaging_extensions;
+ for (ExtensionSet::const_iterator it = extensions->begin();
+ it != extensions->end(); ++it) {
+ const Extension* extension = *it;
+ if (extension->HasAPIPermission(APIPermission::kPushMessaging)) {
+ push_messaging_extensions.insert(extension->id());
+ }
+ }
+ handler_.reset(new PushMessagingInvalidationHandler(
+ pss, this, push_messaging_extensions));
+
+ // Register for extension load/unload as well, so we can update any
+ // registrations as appropriate.
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
+ content::Source<Profile>(profile_->GetOriginalProfile()));
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
+ content::Source<Profile>(profile_->GetOriginalProfile()));
+}
+
+void PushMessagingEventRouter::Shutdown() {
+ // We need an explicit Shutdown() due to the dependencies among the various
+ // ProfileKeyedServices. ProfileSyncService depends on ExtensionSystem, so
+ // it is destroyed before us in the destruction phase of Profile shutdown.
+ // As a result, we need to drop any references to it in the Shutdown() phase
+ // instead.
+ handler_.reset();
+}
+
+void PushMessagingEventRouter::SetMapperForTest(
+ scoped_ptr<PushMessagingInvalidationMapper> mapper) {
+ handler_ = mapper.Pass();
+}
+
+void PushMessagingEventRouter::TriggerMessageForTest(
+ const std::string& extension_id,
+ int subchannel,
+ const std::string& payload) {
+ OnMessage(extension_id, subchannel, payload);
}
void PushMessagingEventRouter::OnMessage(const std::string& extension_id,
@@ -35,7 +93,7 @@ void PushMessagingEventRouter::OnMessage(const std::string& extension_id,
message.payload = payload;
scoped_ptr<base::ListValue> args(glue::OnMessage::Create(message));
- profile_->GetExtensionEventRouter()->DispatchEventToExtension(
+ ExtensionSystem::Get(profile_)->event_router()->DispatchEventToExtension(
extension_id,
event_names::kOnPushMessage,
args.Pass(),
@@ -43,4 +101,29 @@ void PushMessagingEventRouter::OnMessage(const std::string& extension_id,
GURL());
}
+void PushMessagingEventRouter::Observe(
+ int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) {
+ switch (type) {
+ case chrome::NOTIFICATION_EXTENSION_LOADED: {
+ const Extension* extension = content::Details<Extension>(details).ptr();
+ if (extension->HasAPIPermission(APIPermission::kPushMessaging)) {
+ handler_->RegisterExtension(extension->id());
+ }
+ break;
+ }
+ case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
+ const Extension* extension =
+ content::Details<UnloadedExtensionInfo>(details)->extension;
+ if (extension->HasAPIPermission(APIPermission::kPushMessaging)) {
+ handler_->UnregisterExtension(extension->id());
+ }
+ break;
+ }
+ default:
+ NOTREACHED();
+ }
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698