summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/push_messaging/push_messaging_service_impl.cc10
-rw-r--r--chrome/browser/push_messaging/push_messaging_service_impl.h3
-rw-r--r--chrome/browser/push_messaging/push_messaging_service_unittest.cc20
-rw-r--r--content/browser/browser_context.cc7
-rw-r--r--content/browser/devtools/protocol/service_worker_handler.cc6
-rw-r--r--content/browser/push_messaging/push_messaging_router.cc21
-rw-r--r--content/browser/push_messaging/push_messaging_router.h9
-rw-r--r--content/browser/service_worker/embedded_worker_test_helper.cc10
-rw-r--r--content/browser/service_worker/embedded_worker_test_helper.h5
-rw-r--r--content/common/service_worker/service_worker_messages.h8
-rw-r--r--content/public/browser/browser_context.h3
-rw-r--r--content/public/common/push_event_payload.h37
-rw-r--r--content/renderer/service_worker/service_worker_context_client.cc9
-rw-r--r--content/renderer/service_worker/service_worker_context_client.h3
-rw-r--r--third_party/WebKit/Source/modules/modules.gypi1
-rw-r--r--third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp5
-rw-r--r--third_party/WebKit/Source/modules/push_messaging/PushMessageDataTest.cpp47
17 files changed, 161 insertions, 43 deletions
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc
index b490beb..7d5f26f 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.cc
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc
@@ -217,14 +217,16 @@ void PushMessagingServiceImpl::OnMessage(const std::string& app_id,
g_browser_process->rappor_service(),
"PushMessaging.MessageReceived.Origin", app_identifier.origin());
- std::string data;
+ // The payload of a push message can be valid with content, valid with empty
+ // content, or null. Only set the payload data if it is non-null.
+ content::PushEventPayload payload;
if (AreMessagePayloadsEnabled() && message.decrypted)
- data = message.raw_data;
+ payload.setData(message.raw_data);
// Dispatch the message to the appropriate Service Worker.
content::BrowserContext::DeliverPushMessage(
profile_, app_identifier.origin(),
- app_identifier.service_worker_registration_id(), data,
+ app_identifier.service_worker_registration_id(), payload,
base::Bind(&PushMessagingServiceImpl::DeliverMessageCallback,
weak_factory_.GetWeakPtr(), app_identifier.app_id(),
app_identifier.origin(),
@@ -235,7 +237,7 @@ void PushMessagingServiceImpl::OnMessage(const std::string& app_id,
if (!message_dispatched_callback_for_testing_.is_null()) {
message_dispatched_callback_for_testing_.Run(
app_id, app_identifier.origin(),
- app_identifier.service_worker_registration_id(), data);
+ app_identifier.service_worker_registration_id(), payload);
}
}
diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.h b/chrome/browser/push_messaging/push_messaging_service_impl.h
index e215ea4..449154b9 100644
--- a/chrome/browser/push_messaging/push_messaging_service_impl.h
+++ b/chrome/browser/push_messaging/push_messaging_service_impl.h
@@ -24,6 +24,7 @@
#include "components/keyed_service/core/keyed_service.h"
#include "content/public/browser/push_messaging_service.h"
#include "content/public/common/permission_status.mojom.h"
+#include "content/public/common/push_event_payload.h"
#include "content/public/common/push_messaging_status.h"
#include "third_party/WebKit/public/platform/modules/push_messaging/WebPushPermissionStatus.h"
@@ -213,7 +214,7 @@ class PushMessagingServiceImpl : public content::PushMessagingService,
base::Callback<void(const std::string& app_id,
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& message_data)>;
+ const content::PushEventPayload& payload)>;
void SetMessageDispatchedCallbackForTesting(
const MessageDispatchedCallback& callback) {
diff --git a/chrome/browser/push_messaging/push_messaging_service_unittest.cc b/chrome/browser/push_messaging/push_messaging_service_unittest.cc
index 31446b9..31a6d9e 100644
--- a/chrome/browser/push_messaging/push_messaging_service_unittest.cc
+++ b/chrome/browser/push_messaging/push_messaging_service_unittest.cc
@@ -27,6 +27,7 @@
#include "components/gcm_driver/fake_gcm_client_factory.h"
#include "components/gcm_driver/gcm_profile_service.h"
#include "content/public/common/content_switches.h"
+#include "content/public/common/push_event_payload.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -123,15 +124,15 @@ class PushMessagingServiceTest : public ::testing::Test {
void DidDispatchMessage(std::string* app_id_out,
GURL* origin_out,
int64_t* service_worker_registration_id_out,
- std::string* message_data_out,
+ content::PushEventPayload* payload_out,
const std::string& app_id,
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& message_data) {
+ const content::PushEventPayload& payload) {
*app_id_out = app_id;
*origin_out = origin;
*service_worker_registration_id_out = service_worker_registration_id;
- *message_data_out = message_data;
+ *payload_out = payload;
}
protected:
@@ -193,17 +194,17 @@ TEST_F(PushMessagingServiceTest, PayloadEncryptionTest) {
ASSERT_FALSE(app_identifier.is_null());
- std::string app_id, message_data;
+ std::string app_id;
GURL dispatched_origin;
int64_t service_worker_registration_id;
+ content::PushEventPayload payload;
// (5) Observe message dispatchings from the Push Messaging service, and then
// dispatch the |message| on the GCM driver as if it had actually been
// received by Google Cloud Messaging.
- push_service->SetMessageDispatchedCallbackForTesting(
- base::Bind(&PushMessagingServiceTest::DidDispatchMessage,
- base::Unretained(this), &app_id, &dispatched_origin,
- &service_worker_registration_id, &message_data));
+ push_service->SetMessageDispatchedCallbackForTesting(base::Bind(
+ &PushMessagingServiceTest::DidDispatchMessage, base::Unretained(this),
+ &app_id, &dispatched_origin, &service_worker_registration_id, &payload));
gcm::FakeGCMProfileService* fake_profile_service =
static_cast<gcm::FakeGCMProfileService*>(
@@ -220,5 +221,6 @@ TEST_F(PushMessagingServiceTest, PayloadEncryptionTest) {
EXPECT_EQ(origin, dispatched_origin);
EXPECT_EQ(service_worker_registration_id, kTestServiceWorkerId);
- EXPECT_EQ(kTestPayload, message_data);
+ EXPECT_FALSE(payload.is_null);
+ EXPECT_EQ(kTestPayload, payload.data);
}
diff --git a/content/browser/browser_context.cc b/content/browser/browser_context.cc
index fc3f644..32681ae 100644
--- a/content/browser/browser_context.cc
+++ b/content/browser/browser_context.cc
@@ -255,11 +255,12 @@ void BrowserContext::DeliverPushMessage(
BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& data,
+ const PushEventPayload& payload,
const base::Callback<void(PushDeliveryStatus)>& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
- PushMessagingRouter::DeliverMessage(
- browser_context, origin, service_worker_registration_id, data, callback);
+ PushMessagingRouter::DeliverMessage(browser_context, origin,
+ service_worker_registration_id, payload,
+ callback);
}
// static
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
index 5571421..d4842fa 100644
--- a/content/browser/devtools/protocol/service_worker_handler.cc
+++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -23,6 +23,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/web_contents.h"
+#include "content/public/common/push_event_payload.h"
#include "content/public/common/push_messaging_status.h"
#include "url/gurl.h"
@@ -437,9 +438,12 @@ Response ServiceWorkerHandler::DeliverPushMessage(
int64_t id = 0;
if (!base::StringToInt64(registration_id, &id))
return CreateInvalidVersionIdErrorResponse();
+ PushEventPayload payload;
+ if (data.size() > 0)
+ payload.setData(data);
BrowserContext::DeliverPushMessage(
render_frame_host_->GetProcess()->GetBrowserContext(), GURL(origin), id,
- data, base::Bind(&PushDeliveryNoOp));
+ payload, base::Bind(&PushDeliveryNoOp));
return Response::OK();
}
diff --git a/content/browser/push_messaging/push_messaging_router.cc b/content/browser/push_messaging/push_messaging_router.cc
index 7b8deab..7bc469b 100644
--- a/content/browser/push_messaging/push_messaging_router.cc
+++ b/content/browser/push_messaging/push_messaging_router.cc
@@ -15,6 +15,7 @@
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/storage_partition.h"
+#include "content/public/common/push_event_payload.h"
namespace content {
@@ -36,7 +37,7 @@ void PushMessagingRouter::DeliverMessage(
BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
StoragePartition* partition =
@@ -47,15 +48,15 @@ void PushMessagingRouter::DeliverMessage(
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&PushMessagingRouter::FindServiceWorkerRegistration, origin,
- service_worker_registration_id, data, deliver_message_callback,
- service_worker_context));
+ service_worker_registration_id, payload,
+ deliver_message_callback, service_worker_context));
}
// static
void PushMessagingRouter::FindServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback,
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
@@ -64,12 +65,12 @@ void PushMessagingRouter::FindServiceWorkerRegistration(
service_worker_context->FindReadyRegistrationForId(
service_worker_registration_id, origin,
base::Bind(&PushMessagingRouter::FindServiceWorkerRegistrationCallback,
- data, deliver_message_callback));
+ payload, deliver_message_callback));
}
// static
void PushMessagingRouter::FindServiceWorkerRegistrationCallback(
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback,
ServiceWorkerStatusCode service_worker_status,
const scoped_refptr<ServiceWorkerRegistration>&
@@ -91,8 +92,8 @@ void PushMessagingRouter::FindServiceWorkerRegistrationCallback(
// service worker.
version->RunAfterStartWorker(
base::Bind(&PushMessagingRouter::DeliverMessageToWorker,
- make_scoped_refptr(version), service_worker_registration, data,
- deliver_message_callback),
+ make_scoped_refptr(version), service_worker_registration,
+ payload, deliver_message_callback),
base::Bind(&PushMessagingRouter::DeliverMessageEnd,
deliver_message_callback, service_worker_registration));
}
@@ -101,7 +102,7 @@ void PushMessagingRouter::FindServiceWorkerRegistrationCallback(
void PushMessagingRouter::DeliverMessageToWorker(
const scoped_refptr<ServiceWorkerVersion>& service_worker,
const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration,
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
int request_id = service_worker->StartRequest(
@@ -109,7 +110,7 @@ void PushMessagingRouter::DeliverMessageToWorker(
base::Bind(&PushMessagingRouter::DeliverMessageEnd,
deliver_message_callback, service_worker_registration));
service_worker->DispatchSimpleEvent<ServiceWorkerHostMsg_PushEventFinished>(
- request_id, ServiceWorkerMsg_PushEvent(request_id, data));
+ request_id, ServiceWorkerMsg_PushEvent(request_id, payload));
}
// static
diff --git a/content/browser/push_messaging/push_messaging_router.h b/content/browser/push_messaging/push_messaging_router.h
index 8cfa82c..64adb8a 100644
--- a/content/browser/push_messaging/push_messaging_router.h
+++ b/content/browser/push_messaging/push_messaging_router.h
@@ -18,6 +18,7 @@
namespace content {
class BrowserContext;
+struct PushEventPayload;
class ServiceWorkerContextWrapper;
class ServiceWorkerRegistration;
class ServiceWorkerVersion;
@@ -33,7 +34,7 @@ class PushMessagingRouter {
BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback);
private:
@@ -42,7 +43,7 @@ class PushMessagingRouter {
static void FindServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback,
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context);
@@ -50,7 +51,7 @@ class PushMessagingRouter {
// |data| on the Service Worker identified by |service_worker_registration|.
// Must be called on the IO thread.
static void FindServiceWorkerRegistrationCallback(
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback,
ServiceWorkerStatusCode service_worker_status,
const scoped_refptr<ServiceWorkerRegistration>&
@@ -62,7 +63,7 @@ class PushMessagingRouter {
const scoped_refptr<ServiceWorkerVersion>& service_worker,
const scoped_refptr<ServiceWorkerRegistration>&
service_worker_registration,
- const std::string& data,
+ const PushEventPayload& payload,
const DeliverMessageCallback& deliver_message_callback);
// Gets called asynchronously after the Service Worker has dispatched the push
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index bfd13f3..f408ddf 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -20,6 +20,7 @@
#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/embedded_worker_setup.mojom.h"
#include "content/common/service_worker/service_worker_messages.h"
+#include "content/public/common/push_event_payload.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_browser_context.h"
#include "mojo/public/cpp/bindings/strong_binding.h"
@@ -224,7 +225,7 @@ void EmbeddedWorkerTestHelper::OnFetchEvent(
void EmbeddedWorkerTestHelper::OnPushEvent(int embedded_worker_id,
int request_id,
- const std::string& data) {
+ const PushEventPayload& payload) {
SimulateSend(new ServiceWorkerHostMsg_PushEventFinished(
embedded_worker_id, request_id,
blink::WebServiceWorkerEventResultCompleted));
@@ -372,12 +373,13 @@ void EmbeddedWorkerTestHelper::OnFetchEventStub(
request));
}
-void EmbeddedWorkerTestHelper::OnPushEventStub(int request_id,
- const std::string& data) {
+void EmbeddedWorkerTestHelper::OnPushEventStub(
+ int request_id,
+ const PushEventPayload& payload) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&EmbeddedWorkerTestHelper::OnPushEvent,
weak_factory_.GetWeakPtr(),
- current_embedded_worker_id_, request_id, data));
+ current_embedded_worker_id_, request_id, payload));
}
void EmbeddedWorkerTestHelper::OnSetupMojoStub(
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h
index 10c7169..3de05bd 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.h
+++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -30,6 +30,7 @@ class EmbeddedWorkerRegistry;
class EmbeddedWorkerTestHelper;
class MessagePortMessageFilter;
class MockRenderProcessHost;
+struct PushEventPayload;
class ServiceWorkerContextCore;
class ServiceWorkerContextWrapper;
struct ServiceWorkerFetchRequest;
@@ -125,7 +126,7 @@ class EmbeddedWorkerTestHelper : public IPC::Sender,
const ServiceWorkerFetchRequest& request);
virtual void OnPushEvent(int embedded_worker_id,
int request_id,
- const std::string& data);
+ const PushEventPayload& payload);
// These functions simulate sending an EmbeddedHostMsg message to the
// browser.
@@ -152,7 +153,7 @@ class EmbeddedWorkerTestHelper : public IPC::Sender,
void OnInstallEventStub(int request_id);
void OnFetchEventStub(int request_id,
const ServiceWorkerFetchRequest& request);
- void OnPushEventStub(int request_id, const std::string& data);
+ void OnPushEventStub(int request_id, const PushEventPayload& payload);
void OnSetupMojoStub(int thread_id,
mojo::InterfaceRequest<mojo::ServiceProvider> services,
mojo::ServiceProviderPtr exposed_services);
diff --git a/content/common/service_worker/service_worker_messages.h b/content/common/service_worker/service_worker_messages.h
index 382a48a..959b3f1 100644
--- a/content/common/service_worker/service_worker_messages.h
+++ b/content/common/service_worker/service_worker_messages.h
@@ -16,6 +16,7 @@
#include "content/public/common/message_port_types.h"
#include "content/public/common/navigator_connect_client.h"
#include "content/public/common/platform_notification_data.h"
+#include "content/public/common/push_event_payload.h"
#include "ipc/ipc_message_macros.h"
#include "ipc/ipc_param_traits.h"
#include "third_party/WebKit/public/platform/WebCircularGeofencingRegion.h"
@@ -133,6 +134,11 @@ IPC_STRUCT_TRAITS_BEGIN(content::NavigatorConnectClient)
IPC_STRUCT_TRAITS_MEMBER(message_port_id)
IPC_STRUCT_TRAITS_END()
+IPC_STRUCT_TRAITS_BEGIN(content::PushEventPayload)
+ IPC_STRUCT_TRAITS_MEMBER(data)
+ IPC_STRUCT_TRAITS_MEMBER(is_null)
+IPC_STRUCT_TRAITS_END()
+
//---------------------------------------------------------------------------
// Messages sent from the child process to the browser.
@@ -445,7 +451,7 @@ IPC_MESSAGE_CONTROL4(ServiceWorkerMsg_NotificationClickEvent,
int /* action_index */)
IPC_MESSAGE_CONTROL2(ServiceWorkerMsg_PushEvent,
int /* request_id */,
- std::string /* data */)
+ content::PushEventPayload /* data */)
IPC_MESSAGE_CONTROL4(ServiceWorkerMsg_GeofencingEvent,
int /* request_id */,
blink::WebGeofencingEventType /* event_type */,
diff --git a/content/public/browser/browser_context.h b/content/public/browser/browser_context.h
index 9897d4d..b524b17 100644
--- a/content/public/browser/browser_context.h
+++ b/content/public/browser/browser_context.h
@@ -14,6 +14,7 @@
#include "base/supports_user_data.h"
#include "content/common/content_export.h"
#include "content/public/browser/zoom_level_delegate.h"
+#include "content/public/common/push_event_payload.h"
#include "content/public/common/push_messaging_status.h"
class GURL;
@@ -108,7 +109,7 @@ class CONTENT_EXPORT BrowserContext : public base::SupportsUserData {
BrowserContext* browser_context,
const GURL& origin,
int64_t service_worker_registration_id,
- const std::string& data,
+ const PushEventPayload& payload,
const base::Callback<void(PushDeliveryStatus)>& callback);
static void NotifyWillBeDestroyed(BrowserContext* browser_context);
diff --git a/content/public/common/push_event_payload.h b/content/public/common/push_event_payload.h
new file mode 100644
index 0000000..a560cda
--- /dev/null
+++ b/content/public/common/push_event_payload.h
@@ -0,0 +1,37 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_COMMON_PUSH_EVENT_PAYLOAD_H_
+#define CONTENT_PUBLIC_COMMON_PUSH_EVENT_PAYLOAD_H_
+
+#include <string>
+
+#include "content/common/content_export.h"
+
+namespace content {
+
+// Structure representing the payload delivered as part of a push message.
+// This struct contains the decrypted information sent from the push
+// service as part of a PushEvent as well as metadata about the information.
+struct CONTENT_EXPORT PushEventPayload {
+ PushEventPayload() : is_null(true) {}
+ ~PushEventPayload() {}
+
+ // Method to both set the data string and update the null status.
+ void setData(const std::string& data_in) {
+ data = data_in;
+ is_null = false;
+ }
+
+ // Data contained in the payload.
+ std::string data;
+
+ // Whether the payload is null or not. Payloads can be valid with non-empty
+ // content, valid with empty content, or null.
+ bool is_null;
+};
+
+} // namespace content
+
+#endif // CONTENT_PUBLIC_COMMON_PUSH_EVENT_PAYLOAD_H_
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 8b55a3c..dc8f4d2 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -32,6 +32,7 @@
#include "content/common/mojo/service_registry_impl.h"
#include "content/common/service_worker/embedded_worker_messages.h"
#include "content/common/service_worker/service_worker_messages.h"
+#include "content/public/common/push_event_payload.h"
#include "content/public/common/referrer.h"
#include "content/public/renderer/content_renderer_client.h"
#include "content/public/renderer/document_state.h"
@@ -760,10 +761,14 @@ void ServiceWorkerContextClient::OnNotificationClickEvent(
}
void ServiceWorkerContextClient::OnPushEvent(int request_id,
- const std::string& data) {
+ const PushEventPayload& payload) {
TRACE_EVENT0("ServiceWorker",
"ServiceWorkerContextClient::OnPushEvent");
- proxy_->dispatchPushEvent(request_id, blink::WebString::fromUTF8(data));
+ // Only set data to be a valid string if the payload had decrypted data.
+ blink::WebString data;
+ if (!payload.is_null)
+ data.assign(blink::WebString::fromUTF8(payload.data));
+ proxy_->dispatchPushEvent(request_id, data);
}
void ServiceWorkerContextClient::OnGeofencingEvent(
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 6356e37..48a0f37 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -53,6 +53,7 @@ namespace content {
struct NavigatorConnectClient;
struct PlatformNotificationData;
+struct PushEventPayload;
struct ServiceWorkerClientInfo;
class ServiceWorkerProviderContext;
class ServiceWorkerContextClient;
@@ -192,7 +193,7 @@ class ServiceWorkerContextClient
int64_t persistent_notification_id,
const PlatformNotificationData& notification_data,
int action_index);
- void OnPushEvent(int request_id, const std::string& data);
+ void OnPushEvent(int request_id, const PushEventPayload& payload);
void OnGeofencingEvent(int request_id,
blink::WebGeofencingEventType event_type,
const std::string& region_id,
diff --git a/third_party/WebKit/Source/modules/modules.gypi b/third_party/WebKit/Source/modules/modules.gypi
index 47a7a4d..856e6e7 100644
--- a/third_party/WebKit/Source/modules/modules.gypi
+++ b/third_party/WebKit/Source/modules/modules.gypi
@@ -1906,6 +1906,7 @@
'mediastream/RTCDataChannelTest.cpp',
'notifications/NotificationDataTest.cpp',
'presentation/PresentationAvailabilityTest.cpp',
+ 'push_messaging/PushMessageDataTest.cpp',
'serviceworkers/ServiceWorkerContainerTest.cpp',
'webaudio/AudioBasicProcessorHandlerTest.cpp',
'webaudio/ConvolverNodeTest.cpp',
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp
index f084217..ea26174 100644
--- a/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp
+++ b/third_party/WebKit/Source/modules/push_messaging/PushMessageData.cpp
@@ -18,6 +18,11 @@ namespace blink {
PushMessageData* PushMessageData::create(const String& messageString)
{
+ // The standard supports both an empty but valid message and a null message.
+ // In case the message is explicitly null, return a null pointer which will
+ // be set in the PushEvent.
+ if (messageString.isNull())
+ return nullptr;
return PushMessageData::create(ArrayBufferOrArrayBufferViewOrUSVString::fromUSVString(messageString));
}
diff --git a/third_party/WebKit/Source/modules/push_messaging/PushMessageDataTest.cpp b/third_party/WebKit/Source/modules/push_messaging/PushMessageDataTest.cpp
new file mode 100644
index 0000000..de6cb7a
--- /dev/null
+++ b/third_party/WebKit/Source/modules/push_messaging/PushMessageDataTest.cpp
@@ -0,0 +1,47 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/push_messaging/PushMessageData.h"
+
+#include "public/platform/WebString.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+namespace {
+
+const char kPushMessageData[] = "Push Message valid data string.";
+
+TEST(PushMessageDataTest, ValidPayload)
+{
+ // Create a WebString with the test message, then create a
+ // PushMessageData from that.
+ WebString s(blink::WebString::fromUTF8(kPushMessageData));
+ PushMessageData* data = PushMessageData::create(s);
+
+ ASSERT_NE(data, nullptr);
+ EXPECT_STREQ(kPushMessageData, data->text().utf8().data());
+}
+
+TEST(PushMessageDataTest, ValidEmptyPayload)
+{
+ // Create a WebString with a valid but empty test message, then create
+ // a PushMessageData from that.
+ WebString s("");
+ PushMessageData* data = PushMessageData::create(s);
+
+ ASSERT_NE(data, nullptr);
+ EXPECT_STREQ("", data->text().utf8().data());
+}
+
+TEST(PushMessageDataTest, NullPayload)
+{
+ // Create a PushMessageData with a null payload.
+ WebString s;
+ PushMessageData* data = PushMessageData::create(s);
+
+ EXPECT_EQ(data, nullptr);
+}
+
+} // anonymous namespace
+} // namespace blink