Index: content/browser/notifications/notification_message_filter.cc |
diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc |
index c2a9e2b26bb2d142cc28f1dd73cfca4f8645d385..6efe1d2e65e86fe8f5f080df53b1919b3b58b630 100644 |
--- a/content/browser/notifications/notification_message_filter.cc |
+++ b/content/browser/notifications/notification_message_filter.cc |
@@ -9,6 +9,7 @@ |
#include "base/callback.h" |
#include "base/command_line.h" |
#include "content/browser/bad_message.h" |
+#include "content/browser/notifications/notification_id_generator.h" |
#include "content/browser/notifications/page_notification_delegate.h" |
#include "content/browser/notifications/platform_notification_context_impl.h" |
#include "content/browser/service_worker/service_worker_context_wrapper.h" |
@@ -97,9 +98,9 @@ NotificationMessageFilter::NotificationMessageFilter( |
NotificationMessageFilter::~NotificationMessageFilter() {} |
-void NotificationMessageFilter::DidCloseNotification(int notification_id) { |
+void NotificationMessageFilter::DidCloseNotification( |
+ const std::string& notification_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- |
close_closures_.erase(notification_id); |
} |
@@ -135,7 +136,7 @@ void NotificationMessageFilter::OverrideThreadForMessage( |
} |
void NotificationMessageFilter::OnShowPlatformNotification( |
- int notification_id, |
+ int non_persistent_notification_id, |
const GURL& origin, |
const PlatformNotificationData& notification_data, |
const NotificationResources& notification_resources) { |
@@ -148,9 +149,6 @@ void NotificationMessageFilter::OnShowPlatformNotification( |
return; |
} |
- std::unique_ptr<DesktopNotificationDelegate> delegate( |
- new PageNotificationDelegate(process_id_, notification_id)); |
- |
PlatformNotificationService* service = |
GetContentClient()->browser()->GetPlatformNotificationService(); |
DCHECK(service); |
@@ -158,10 +156,20 @@ void NotificationMessageFilter::OnShowPlatformNotification( |
if (!VerifyNotificationPermissionGranted(service, origin)) |
return; |
+ std::string notification_id = |
+ GetNotificationIdGenerator()->GenerateForNonPersistentNotification( |
+ origin, notification_data.tag, non_persistent_notification_id, |
+ process_id_); |
+ |
+ std::unique_ptr<DesktopNotificationDelegate> delegate( |
+ new PageNotificationDelegate(process_id_, non_persistent_notification_id, |
+ notification_id)); |
+ |
base::Closure close_closure; |
- service->DisplayNotification( |
- browser_context_, origin, SanitizeNotificationData(notification_data), |
- notification_resources, std::move(delegate), &close_closure); |
+ service->DisplayNotification(browser_context_, notification_id, origin, |
+ SanitizeNotificationData(notification_data), |
+ notification_resources, std::move(delegate), |
+ &close_closure); |
if (!close_closure.is_null()) |
close_closures_[notification_id] = close_closure; |
@@ -193,8 +201,6 @@ void NotificationMessageFilter::OnShowPersistentNotification( |
SanitizeNotificationData(notification_data); |
database_data.notification_data = sanitized_notification_data; |
- // TODO(peter): Significantly reduce the amount of information we need to |
- // retain outside of the database for displaying notifications. |
notification_context_->WriteNotificationData( |
origin, database_data, |
base::Bind(&NotificationMessageFilter::DidWritePersistentNotificationData, |
@@ -210,7 +216,7 @@ void NotificationMessageFilter::DidWritePersistentNotificationData( |
const PlatformNotificationData& notification_data, |
const NotificationResources& notification_resources, |
bool success, |
- int64_t persistent_notification_id) { |
+ const std::string& notification_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
if (!success) { |
@@ -223,8 +229,7 @@ void NotificationMessageFilter::DidWritePersistentNotificationData( |
service_worker_registration_id, origin, |
base::Bind(&NotificationMessageFilter::DidFindServiceWorkerRegistration, |
weak_factory_io_.GetWeakPtr(), request_id, origin, |
- notification_data, notification_resources, |
- persistent_notification_id)); |
+ notification_data, notification_resources, notification_id)); |
} |
void NotificationMessageFilter::DidFindServiceWorkerRegistration( |
@@ -232,7 +237,7 @@ void NotificationMessageFilter::DidFindServiceWorkerRegistration( |
const GURL& origin, |
const PlatformNotificationData& notification_data, |
const NotificationResources& notification_resources, |
- int64_t persistent_notification_id, |
+ const std::string& notification_id, |
content::ServiceWorkerStatusCode service_worker_status, |
scoped_refptr<content::ServiceWorkerRegistration> registration) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
@@ -252,9 +257,8 @@ void NotificationMessageFilter::DidFindServiceWorkerRegistration( |
BrowserThread::UI, FROM_HERE, |
base::Bind(&PlatformNotificationService::DisplayPersistentNotification, |
base::Unretained(service), // The service is a singleton. |
- browser_context_, persistent_notification_id, |
- registration->pattern(), origin, notification_data, |
- notification_resources)); |
+ browser_context_, notification_id, registration->pattern(), |
+ origin, notification_data, notification_resources)); |
Send(new PlatformNotificationMsg_DidShowPersistent(request_id, true)); |
} |
@@ -303,11 +307,17 @@ void NotificationMessageFilter::DidGetNotifications( |
} |
void NotificationMessageFilter::OnClosePlatformNotification( |
- int notification_id) { |
+ const GURL& origin, |
+ const std::string& tag, |
+ int non_persistent_notification_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
if (!RenderProcessHost::FromID(process_id_)) |
return; |
+ std::string notification_id = |
+ GetNotificationIdGenerator()->GenerateForNonPersistentNotification( |
+ origin, tag, non_persistent_notification_id, process_id_); |
+ |
if (!close_closures_.count(notification_id)) |
return; |
@@ -317,7 +327,8 @@ void NotificationMessageFilter::OnClosePlatformNotification( |
void NotificationMessageFilter::OnClosePersistentNotification( |
const GURL& origin, |
- int64_t persistent_notification_id) { |
+ const std::string& tag, |
+ const std::string& notification_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
if (GetPermissionForOriginOnIO(origin) != |
blink::mojom::PermissionStatus::GRANTED) { |
@@ -335,10 +346,10 @@ void NotificationMessageFilter::OnClosePersistentNotification( |
BrowserThread::UI, FROM_HERE, |
base::Bind(&PlatformNotificationService::ClosePersistentNotification, |
base::Unretained(service), // The service is a singleton. |
- browser_context_, persistent_notification_id)); |
+ browser_context_, notification_id)); |
notification_context_->DeleteNotificationData( |
- persistent_notification_id, origin, |
+ notification_id, origin, |
base::Bind( |
&NotificationMessageFilter::DidDeletePersistentNotificationData, |
weak_factory_io_.GetWeakPtr())); |
@@ -380,4 +391,9 @@ bool NotificationMessageFilter::VerifyNotificationPermissionGranted( |
return false; |
} |
+NotificationIdGenerator* NotificationMessageFilter::GetNotificationIdGenerator() |
+ const { |
+ return notification_context_->notification_id_generator(); |
+} |
+ |
} // namespace content |