| 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 401bddea9a9c905027c7ec1a75049c9825e5a3a0..6a59cbe68209fa39f21ee10ad0f35eb8636bcfbd 100644
|
| --- a/chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| +++ b/chrome/browser/services/gcm/push_messaging_service_impl.cc
|
| @@ -31,6 +31,7 @@
|
| #include "content/public/browser/render_frame_host.h"
|
| #include "content/public/browser/web_contents.h"
|
| #include "content/public/common/child_process_host.h"
|
| +#include "content/public/common/content_switches.h"
|
| #include "content/public/common/platform_notification_data.h"
|
| #include "third_party/skia/include/core/SkBitmap.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
| @@ -148,9 +149,10 @@ void PushMessagingServiceImpl::OnMessage(
|
| 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:
|
| + // API and want to include a message payload, 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": {
|
| @@ -161,30 +163,40 @@ void PushMessagingServiceImpl::OnMessage(
|
| // TODO(johnme): Make sure this is clearly documented for developers.
|
| PushMessagingApplicationId application_id =
|
| PushMessagingApplicationId::Parse(app_id);
|
| - GCMClient::MessageData::const_iterator it = message.data.find("data");
|
| - if (application_id.IsValid() && it != message.data.end()) {
|
| - if (!HasPermission(application_id.origin)) {
|
| - // The |origin| lost push permission. We need to unregister and drop this
|
| - // message.
|
| - Unregister(application_id, UnregisterCallback());
|
| - return;
|
| - }
|
|
|
| - const std::string& data = it->second;
|
| - content::BrowserContext::DeliverPushMessage(
|
| - profile_,
|
| - application_id.origin,
|
| - application_id.service_worker_registration_id,
|
| - data,
|
| - base::Bind(&PushMessagingServiceImpl::DeliverMessageCallback,
|
| - weak_factory_.GetWeakPtr(),
|
| - application_id,
|
| - message));
|
| - } else {
|
| - // Drop the message, as it is invalid.
|
| + // Drop messages whose application is is invalid.
|
| + if (!application_id.IsValid()) {
|
| DeliverMessageCallback(application_id, message,
|
| content::PUSH_DELIVERY_STATUS_INVALID_MESSAGE);
|
| + return;
|
| + }
|
| +
|
| + // |origin| may have lost push permission. Unregister and drop this message.
|
| + if (!HasPermission(application_id.origin)) {
|
| + Unregister(application_id, UnregisterCallback());
|
| + return;
|
| + }
|
| +
|
| + std::string data;
|
| +
|
| + // TODO(peter): Message payloads are disabled pending mandatory encryption.
|
| + // https://crbug.com/449184
|
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnablePushMessagePayload)) {
|
| + GCMClient::MessageData::const_iterator it = message.data.find("data");
|
| + if (it != message.data.end())
|
| + data = it->second;
|
| }
|
| +
|
| + content::BrowserContext::DeliverPushMessage(
|
| + profile_,
|
| + application_id.origin,
|
| + application_id.service_worker_registration_id,
|
| + data,
|
| + base::Bind(&PushMessagingServiceImpl::DeliverMessageCallback,
|
| + weak_factory_.GetWeakPtr(),
|
| + application_id,
|
| + message));
|
| }
|
|
|
| void PushMessagingServiceImpl::SetProfileForTesting(Profile* profile) {
|
|
|