| Index: content/browser/notifications/notification_event_dispatcher_impl.cc
|
| diff --git a/content/browser/notifications/notification_event_dispatcher_impl.cc b/content/browser/notifications/notification_event_dispatcher_impl.cc
|
| index a9cdd2e383709e14b6ae7ae5cee5e95afc1aa141..9f08158ec1f06564ff66952643a46c96a421792d 100644
|
| --- a/content/browser/notifications/notification_event_dispatcher_impl.cc
|
| +++ b/content/browser/notifications/notification_event_dispatcher_impl.cc
|
| @@ -5,11 +5,14 @@
|
| #include "content/browser/notifications/notification_event_dispatcher_impl.h"
|
|
|
| #include "base/callback.h"
|
| +#include "base/strings/string_number_conversions.h"
|
| +#include "content/browser/notifications/platform_notification_context_impl.h"
|
| #include "content/browser/service_worker/service_worker_context_wrapper.h"
|
| #include "content/browser/service_worker/service_worker_registration.h"
|
| #include "content/browser/service_worker/service_worker_storage.h"
|
| #include "content/public/browser/browser_context.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/notification_database_data.h"
|
| #include "content/public/browser/storage_partition.h"
|
| #include "content/public/common/platform_notification_data.h"
|
|
|
| @@ -61,8 +64,7 @@ void NotificationClickEventFinished(
|
| // Dispatches the notificationclick on |service_worker_registration| if the
|
| // registration was available. Must be called on the IO thread.
|
| void DispatchNotificationClickEventOnRegistration(
|
| - const std::string& notification_id,
|
| - const PlatformNotificationData& notification_data,
|
| + const NotificationDatabaseData& notification_database_data,
|
| const NotificationClickDispatchCompleteCallback& dispatch_complete_callback,
|
| ServiceWorkerStatusCode service_worker_status,
|
| const scoped_refptr<ServiceWorkerRegistration>&
|
| @@ -73,10 +75,17 @@ void DispatchNotificationClickEventOnRegistration(
|
| base::Bind(&NotificationClickEventFinished,
|
| dispatch_complete_callback,
|
| service_worker_registration);
|
| - service_worker_registration->active_version()
|
| - ->DispatchNotificationClickEvent(dispatch_event_callback,
|
| - notification_id,
|
| - notification_data);
|
| +
|
| + // TODO(peter): Pass the persistent notification id as an int64_t rather
|
| + // than as a string. This depends on the Blink API being updated.
|
| + std::string persistent_notification_id_string =
|
| + base::Int64ToString(notification_database_data.notification_id);
|
| +
|
| + service_worker_registration->active_version()->
|
| + DispatchNotificationClickEvent(
|
| + dispatch_event_callback,
|
| + persistent_notification_id_string,
|
| + notification_database_data.notification_data);
|
| return;
|
| }
|
|
|
| @@ -115,21 +124,44 @@ void DispatchNotificationClickEventOnRegistration(
|
| // |service_worker_registration_id|. Must be called on the IO thread.
|
| void FindServiceWorkerRegistration(
|
| const GURL& origin,
|
| - int64 service_worker_registration_id,
|
| - const std::string& notification_id,
|
| - const PlatformNotificationData& notification_data,
|
| const NotificationClickDispatchCompleteCallback& dispatch_complete_callback,
|
| - scoped_refptr<ServiceWorkerContextWrapper> service_worker_context) {
|
| + scoped_refptr<ServiceWorkerContextWrapper> service_worker_context,
|
| + bool success,
|
| + const NotificationDatabaseData& notification_database_data) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + if (!success) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI,
|
| + FROM_HERE,
|
| + base::Bind(dispatch_complete_callback,
|
| + PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR));
|
| + return;
|
| + }
|
| +
|
| service_worker_context->context()->storage()->FindRegistrationForId(
|
| - service_worker_registration_id,
|
| + notification_database_data.service_worker_registration_id,
|
| origin,
|
| base::Bind(&DispatchNotificationClickEventOnRegistration,
|
| - notification_id,
|
| - notification_data,
|
| + notification_database_data,
|
| dispatch_complete_callback));
|
| }
|
|
|
| +// Reads the data associated with the |persistent_notification_id| belonging to
|
| +// |origin| from the notification context.
|
| +void ReadNotificationDatabaseData(
|
| + int64_t persistent_notification_id,
|
| + const GURL& origin,
|
| + const NotificationClickDispatchCompleteCallback& dispatch_complete_callback,
|
| + scoped_refptr<ServiceWorkerContextWrapper> service_worker_context,
|
| + scoped_refptr<PlatformNotificationContextImpl> notification_context) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + notification_context->ReadNotificationData(
|
| + persistent_notification_id,
|
| + origin,
|
| + base::Bind(&FindServiceWorkerRegistration,
|
| + origin, dispatch_complete_callback, service_worker_context));
|
| +}
|
| +
|
| } // namespace
|
|
|
| // static
|
| @@ -149,29 +181,33 @@ NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {}
|
|
|
| void NotificationEventDispatcherImpl::DispatchNotificationClickEvent(
|
| BrowserContext* browser_context,
|
| + int64_t persistent_notification_id,
|
| const GURL& origin,
|
| - int64 service_worker_registration_id,
|
| - const std::string& notification_id,
|
| - const PlatformNotificationData& notification_data,
|
| const NotificationClickDispatchCompleteCallback&
|
| dispatch_complete_callback) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + DCHECK_GT(persistent_notification_id, 0);
|
| + DCHECK(origin.is_valid());
|
|
|
| StoragePartition* partition =
|
| BrowserContext::GetStoragePartitionForSite(browser_context, origin);
|
| +
|
| scoped_refptr<ServiceWorkerContextWrapper> service_worker_context =
|
| static_cast<ServiceWorkerContextWrapper*>(
|
| partition->GetServiceWorkerContext());
|
| + scoped_refptr<PlatformNotificationContextImpl> notification_context =
|
| + static_cast<PlatformNotificationContextImpl*>(
|
| + partition->GetPlatformNotificationContext());
|
| +
|
| BrowserThread::PostTask(
|
| BrowserThread::IO,
|
| FROM_HERE,
|
| - base::Bind(&FindServiceWorkerRegistration,
|
| + base::Bind(&ReadNotificationDatabaseData,
|
| + persistent_notification_id,
|
| origin,
|
| - service_worker_registration_id,
|
| - notification_id,
|
| - notification_data,
|
| dispatch_complete_callback,
|
| - service_worker_context));
|
| + service_worker_context,
|
| + notification_context));
|
| }
|
|
|
| } // namespace content
|
|
|