Chromium Code Reviews| 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..de1d34ba3a787934c7579e66b0eb670e9d3e684e 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); |
| } |
| @@ -136,11 +140,20 @@ void PlatformNotificationContextImpl::RemoveService( |
| services_.erase(services_to_remove, services_.end()); |
| } |
| +std::string PlatformNotificationContextImpl::GenerateNotificationId( |
| + const GURL& origin, |
| + const std::string& tag, |
| + int64_t persistent_notification_id) { |
| + return notification_id_generator_.GenerateForPersistentNotification( |
| + origin, tag, persistent_notification_id); |
| +} |
| + |
| 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,14 +161,21 @@ 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()); |
| NotificationDatabaseData database_data; |
| - NotificationDatabase::Status status = |
| - database_->ReadNotificationData(notification_id, origin, &database_data); |
| + int64_t persistent_notification_id; |
| + |
| + NotificationDatabase::Status status = database_->ReadIdAssociation( |
|
johnme
2016/09/02 15:07:44
I guess this is the hacked in part you were talkin
Peter Beverloo
2016/09/05 15:11:01
No? This is kinda fine...
|
| + notification_id, &persistent_notification_id); |
| + |
| + if (status == NotificationDatabase::STATUS_OK) { |
| + status = database_->ReadNotificationData(persistent_notification_id, origin, |
| + &database_data); |
| + } |
| UMA_HISTOGRAM_ENUMERATION("Notifications.Database.ReadResult", status, |
| NotificationDatabase::STATUS_COUNT); |
| @@ -230,7 +250,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( |
| @@ -259,23 +279,35 @@ 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; |
| - NotificationDatabase::Status status = |
| - database_->WriteNotificationData(origin, database_data, ¬ification_id); |
| + int64_t persistent_notification_id = 0; |
| + std::string notification_id; |
| + |
| + NotificationDatabase::Status status = database_->WriteNotificationData( |
| + origin, database_data, &persistent_notification_id); |
| + if (status == NotificationDatabase::STATUS_OK) { |
| + DCHECK_GT(persistent_notification_id, 0); |
| + notification_id = |
| + notification_id_generator_.GenerateForPersistentNotification( |
| + origin, database_data.notification_data.tag, |
| + persistent_notification_id); |
| + |
| + status = database_->StoreIdAssociation(notification_id, |
| + persistent_notification_id); |
| + } |
| 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)); |
| + |
| return; |
| } |
| @@ -285,14 +317,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,18 +333,26 @@ 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()); |
| - NotificationDatabase::Status status = |
| - database_->DeleteNotificationData(notification_id, origin); |
| + int64_t persistent_notification_id; |
| + |
| + NotificationDatabase::Status status = database_->ReadIdAssociation( |
| + notification_id, &persistent_notification_id); |
| + |
| + if (status == NotificationDatabase::STATUS_OK) { |
| + status = |
| + database_->DeleteNotificationData(persistent_notification_id, origin); |
| + } |
| UMA_HISTOGRAM_ENUMERATION("Notifications.Database.DeleteResult", status, |
| NotificationDatabase::STATUS_COUNT); |
| - bool success = status == NotificationDatabase::STATUS_OK; |
| + bool success = status == NotificationDatabase::STATUS_OK || |
| + status == NotificationDatabase::STATUS_ERROR_NOT_FOUND; |
|
johnme
2016/09/02 15:07:44
Seems reasonable. Does changing this have any side
Peter Beverloo
2016/09/05 15:11:01
No. LevelDB already returns STATUS_OK instead of E
|
| // Blow away the database if deleting data failed due to corruption. Following |
| // the contract of the delete methods, consider this to be a success as the |