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

Unified Diff: chrome/browser/services/gcm/push_messaging_service_impl.cc

Issue 324913004: Skeleton GCMAppHandler for Push API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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/services/gcm/push_messaging_service_impl.cc
diff --git a/chrome/browser/services/gcm/push_messaging_service_impl.cc b/chrome/browser/services/gcm/push_messaging_service_impl.cc
index ad78da137fbd693567b627578c2c1193b74af284..8a07e128a6289d2de4aa246db333dcd14cc063eb 100644
--- a/chrome/browser/services/gcm/push_messaging_service_impl.cc
+++ b/chrome/browser/services/gcm/push_messaging_service_impl.cc
@@ -15,9 +15,67 @@ namespace gcm {
PushMessagingServiceImpl::PushMessagingServiceImpl(
GCMProfileService* gcm_profile_service)
: gcm_profile_service_(gcm_profile_service),
- weak_factory_(this) {}
+ weak_factory_(this) {
+ // TODO(mvanouwerkerk): Automatically unregister Service Workers from GCM when
+ // they are uninstalled.
+}
+
+PushMessagingServiceImpl::~PushMessagingServiceImpl() {
+ // TODO(johnme): If it's possible for this to be destroyed before GCMDriver,
+ // then we should RemoveAppHandler all our app handlers.
fgorski 2014/06/10 17:09:27 Perhaps you can do that in Shutdown app handler. U
johnme 2014/06/10 20:33:48 Not sure, I based this on ExtensionGCMAppHandler.
+}
+
+base::WeakPtr<PushMessagingServiceImpl> PushMessagingServiceImpl::GetWeakPtr() {
+ return weak_factory_.GetWeakPtr();
+}
+
+void PushMessagingServiceImpl::LazyLoadAppHandlers() {
+ // TODO(mvanouwerkerk): For each Service Worker that is able to receive push
+ // events, run gcm_profile_service_->driver()->AddAppHandler(sw_id, this)
+}
+
+void PushMessagingGCMAppHandler::ShutdownHandler() {
+ // TODO(mvanouwerkerk): Do any necessary cleanup.
+}
-PushMessagingServiceImpl::~PushMessagingServiceImpl() {}
+void PushMessagingGCMAppHandler::OnMessage(
+ const std::string& app_id,
+ const GCMClient::IncomingMessage& message) {
+ // The Push API only exposes a single string of data in the push event fired
+ // on the Service Worker. When developers send messages using GCM to the Push
+ // API, they must pass a single key-value pair, where the key is "data" and
+ // the value is the string they want to be passed to their Service Worker.
+ // For example, they could send the following JSON using the HTTPS GCM API:
+ // {
+ // "registration_ids": ["FOO", "BAR"],
+ // "data": {
+ // "data": "BAZ",
fgorski 2014/06/10 17:09:27 this looks redundant... is that a work in progress
johnme 2014/06/10 20:33:48 There are no standards around the GCM part. The Pu
+ // },
+ // "delay_while_idle": true,
+ // }
+ // TODO(johnme): Make sure this is clearly documented for developers.
+ const GCMClient::MessageData::iterator it = message.data.find("data");
+ if (it != message.data.end()) {
+ const std::string& data = it->second;
+ // TODO(mvanouwerkerk): Fire push event with data on the Service Worker
+ // corresponding to app_id.
+ } else {
+ // Drop the message, as it is invalid.
+ // TODO(mvanouwerkerk): Show a warning in the developer console of the
+ // Service Worker corresponding to app_id.
fgorski 2014/06/10 17:09:27 Add a TODO for diagnostic observers (you likely wa
johnme 2014/06/10 20:33:48 Done.
+ }
+}
+
+void PushMessagingGCMAppHandler::OnMessagesDeleted(const std::string& app_id) {
+ // TODO(mvanouwerkerk): Fire push error event on the Service Worker
fgorski 2014/06/10 17:09:27 Are you sure this deserves a semantic of an error?
johnme 2014/06/10 20:33:48 Last time we discussed the spec, there seemed to b
+ // corresponding to app_id.
+}
+
+void PushMessagingGCMAppHandler::OnSendError(
+ const std::string& app_id,
+ const GCMClient::SendErrorDetails& send_error_details) {
+ NOTREACHED() << "The Push API shouldn't have sent messages upstream";
+}
void PushMessagingServiceImpl::Register(
const std::string& app_id,
@@ -31,17 +89,23 @@ void PushMessagingServiceImpl::Register(
app_id,
sender_ids,
base::Bind(&PushMessagingServiceImpl::DidRegister,
- weak_factory_.GetWeakPtr(),
+ GetWeakPtr(),
+ app_id,
callback));
}
void PushMessagingServiceImpl::DidRegister(
+ const std::string& app_id,
const content::PushMessagingService::RegisterCallback& callback,
const std::string& registration_id,
GCMClient::Result result) {
GURL endpoint = GURL("https://android.googleapis.com/gcm/send");
bool error = (result != GCMClient::SUCCESS);
callback.Run(endpoint, registration_id, error);
+ if (!error)
+ gcm_profile_service_->driver()->AddAppHandler(app_id, this);
}
+// TODO(johnme): Unregister should call RemoveAppHandler before unregistering.
+
} // namespace gcm

Powered by Google App Engine
This is Rietveld 408576698