Index: content/browser/notifications/platform_notification_context_impl.cc |
diff --git a/content/browser/notifications/platform_notification_context_impl.cc b/content/browser/notifications/platform_notification_context_impl.cc |
index 6a777cc7949e9b693f55d1ca9dea9babf8332a27..9516dae3605325712956d0ebfb4887d588d87f10 100644 |
--- a/content/browser/notifications/platform_notification_context_impl.cc |
+++ b/content/browser/notifications/platform_notification_context_impl.cc |
@@ -21,19 +21,23 @@ |
using base::DoNothing; |
namespace content { |
+namespace { |
// Name of the directory in the user's profile directory where the notification |
// database files should be stored. |
const base::FilePath::CharType kPlatformNotificationsDirectory[] = |
FILE_PATH_LITERAL("Platform Notifications"); |
+} // namespace |
+ |
PlatformNotificationContextImpl::PlatformNotificationContextImpl( |
const base::FilePath& path, |
BrowserContext* browser_context, |
const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context) |
: path_(path), |
browser_context_(browser_context), |
- service_worker_context_(service_worker_context) { |
+ service_worker_context_(service_worker_context), |
+ notification_id_generator_(browser_context) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
} |
@@ -137,10 +141,11 @@ void PlatformNotificationContextImpl::RemoveService( |
} |
void PlatformNotificationContextImpl::ReadNotificationData( |
- int64_t notification_id, |
+ const std::string& notification_id, |
const GURL& origin, |
const ReadResultCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
LazyInitialize( |
base::Bind(&PlatformNotificationContextImpl::DoReadNotificationData, this, |
notification_id, origin, callback), |
@@ -148,7 +153,7 @@ void PlatformNotificationContextImpl::ReadNotificationData( |
} |
void PlatformNotificationContextImpl::DoReadNotificationData( |
- int64_t notification_id, |
+ const std::string& notification_id, |
const GURL& origin, |
const ReadResultCallback& callback) { |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
@@ -230,7 +235,7 @@ void PlatformNotificationContextImpl::WriteNotificationData( |
LazyInitialize( |
base::Bind(&PlatformNotificationContextImpl::DoWriteNotificationData, |
this, origin, database_data, callback), |
- base::Bind(callback, false /* success */, 0 /* notification_id */)); |
+ base::Bind(callback, false /* success */, "" /* notification_id */)); |
} |
void PlatformNotificationContextImpl::DoWriteNotificationData( |
@@ -241,11 +246,11 @@ void PlatformNotificationContextImpl::DoWriteNotificationData( |
// Eagerly delete data for replaced notifications from the database. |
if (!database_data.notification_data.tag.empty()) { |
- std::set<int64_t> deleted_notification_set; |
+ std::set<std::string> deleted_notification_ids; |
NotificationDatabase::Status delete_status = |
database_->DeleteAllNotificationDataForOrigin( |
origin, database_data.notification_data.tag, |
- &deleted_notification_set); |
+ &deleted_notification_ids); |
UMA_HISTOGRAM_ENUMERATION("Notifications.Database.DeleteBeforeWriteResult", |
delete_status, |
@@ -259,23 +264,29 @@ void PlatformNotificationContextImpl::DoWriteNotificationData( |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
- base::Bind(callback, false /* success */, 0 /* notification_id */)); |
+ base::Bind(callback, false /* success */, "" /* notification_id */)); |
return; |
} |
} |
- int64_t notification_id = 0; |
+ // Create a copy of the |database_data| to store a generated notification ID. |
+ NotificationDatabaseData write_database_data = database_data; |
+ write_database_data.notification_id = |
+ notification_id_generator_.GenerateForPersistentNotification( |
+ origin, database_data.notification_data.tag, |
+ database_->GetNextPersistentNotificationId()); |
+ |
NotificationDatabase::Status status = |
- database_->WriteNotificationData(origin, database_data, ¬ification_id); |
+ database_->WriteNotificationData(origin, write_database_data); |
UMA_HISTOGRAM_ENUMERATION("Notifications.Database.WriteResult", status, |
NotificationDatabase::STATUS_COUNT); |
if (status == NotificationDatabase::STATUS_OK) { |
- DCHECK_GT(notification_id, 0); |
- BrowserThread::PostTask( |
- BrowserThread::IO, FROM_HERE, |
- base::Bind(callback, true /* success */, notification_id)); |
+ BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
+ base::Bind(callback, true /* success */, |
+ write_database_data.notification_id)); |
+ |
return; |
} |
@@ -285,14 +296,15 @@ void PlatformNotificationContextImpl::DoWriteNotificationData( |
BrowserThread::PostTask( |
BrowserThread::IO, FROM_HERE, |
- base::Bind(callback, false /* success */, 0 /* notification_id */)); |
+ base::Bind(callback, false /* success */, "" /* notification_id */)); |
} |
void PlatformNotificationContextImpl::DeleteNotificationData( |
- int64_t notification_id, |
+ const std::string& notification_id, |
const GURL& origin, |
const DeleteResultCallback& callback) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ |
LazyInitialize( |
base::Bind(&PlatformNotificationContextImpl::DoDeleteNotificationData, |
this, notification_id, origin, callback), |
@@ -300,7 +312,7 @@ void PlatformNotificationContextImpl::DeleteNotificationData( |
} |
void PlatformNotificationContextImpl::DoDeleteNotificationData( |
- int64_t notification_id, |
+ const std::string& notification_id, |
const GURL& origin, |
const DeleteResultCallback& callback) { |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
@@ -342,10 +354,10 @@ void PlatformNotificationContextImpl:: |
int64_t service_worker_registration_id) { |
DCHECK(task_runner_->RunsTasksOnCurrentThread()); |
- std::set<int64_t> deleted_notifications_set; |
+ std::set<std::string> deleted_notification_ids; |
NotificationDatabase::Status status = |
database_->DeleteAllNotificationDataForServiceWorkerRegistration( |
- origin, service_worker_registration_id, &deleted_notifications_set); |
+ origin, service_worker_registration_id, &deleted_notification_ids); |
UMA_HISTOGRAM_ENUMERATION( |
"Notifications.Database.DeleteServiceWorkerRegistrationResult", status, |
@@ -355,7 +367,7 @@ void PlatformNotificationContextImpl:: |
if (status == NotificationDatabase::STATUS_ERROR_CORRUPTED) |
DestroyDatabase(); |
- // TODO(peter): Close the notifications in |deleted_notifications_set|. See |
+ // TODO(peter): Close the notifications in |deleted_notification_ids|. See |
// https://crbug.com/532436. |
} |