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 622fd1e66a22f0950957732a95542ddbc02aa0a3..20c0955e7d6e13534a6c0f8fdfadb2cee5fe10ab 100644 |
--- a/content/browser/notifications/notification_message_filter.cc |
+++ b/content/browser/notifications/notification_message_filter.cc |
@@ -5,7 +5,11 @@ |
#include "content/browser/notifications/notification_message_filter.h" |
#include "base/callback.h" |
+#include "base/guid.h" |
+#include "base/hash.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "content/browser/notifications/page_notification_delegate.h" |
+#include "content/browser/notifications/persistent_notification_delegate.h" |
#include "content/browser/notifications/platform_notification_context_impl.h" |
#include "content/common/platform_notification_messages.h" |
#include "content/public/browser/browser_context.h" |
@@ -16,19 +20,24 @@ |
#include "content/public/browser/platform_notification_service.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/common/content_client.h" |
+#include "ui/message_center/notification.h" |
+ |
+using message_center::Notification; |
+using message_center::NotificationDelegate; |
namespace content { |
NotificationMessageFilter::NotificationMessageFilter( |
- int process_id, |
+ int render_process_id, |
PlatformNotificationContextImpl* notification_context, |
ResourceContext* resource_context, |
BrowserContext* browser_context) |
: BrowserMessageFilter(PlatformNotificationMsgStart), |
- process_id_(process_id), |
+ render_process_id_(render_process_id), |
notification_context_(notification_context), |
resource_context_(resource_context), |
browser_context_(browser_context), |
+ notification_id_generator_(browser_context, render_process_id), |
weak_factory_io_(this) {} |
NotificationMessageFilter::~NotificationMessageFilter() {} |
@@ -79,34 +88,41 @@ void NotificationMessageFilter::OnCheckNotificationPermission( |
} |
void NotificationMessageFilter::OnShowPlatformNotification( |
- int notification_id, |
+ int non_persistent_notification_id, |
const GURL& origin, |
const SkBitmap& icon, |
const PlatformNotificationData& notification_data) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
- if (!RenderProcessHost::FromID(process_id_)) |
+ if (!RenderProcessHost::FromID(render_process_id_)) |
return; |
- scoped_ptr<DesktopNotificationDelegate> delegate( |
- new PageNotificationDelegate(process_id_, notification_id)); |
+ scoped_refptr<NotificationDelegate> delegate = |
+ new PageNotificationDelegate(render_process_id_, |
+ non_persistent_notification_id); |
+ |
+ std::string notification_id = |
+ notification_id_generator_.GenerateForNonPersistentNotification( |
+ origin, |
+ notification_data.tag, |
+ non_persistent_notification_id); |
+ |
+ message_center::Notification notification( |
+ message_center::NOTIFICATION_TYPE_SIMPLE, |
+ notification_id, |
+ notification_data.title, |
+ notification_data.body, |
+ gfx::Image::CreateFrom1xBitmap(icon), |
+ base::UTF8ToUTF16(origin.GetOrigin().spec()), |
+ message_center::NotifierId(origin), |
+ message_center::RichNotificationData(), |
+ delegate.get()); |
PlatformNotificationService* service = |
GetContentClient()->browser()->GetPlatformNotificationService(); |
DCHECK(service); |
- if (!VerifyNotificationPermissionGranted(service, origin)) |
- return; |
- |
- base::Closure close_closure; |
- service->DisplayNotification(browser_context_, |
- origin, |
- icon, |
- notification_data, |
- delegate.Pass(), |
- &close_closure); |
- |
- if (!close_closure.is_null()) |
- close_closures_[notification_id] = close_closure; |
+ if (VerifyNotificationPermissionGranted(service, origin)) |
+ service->DisplayNotification(browser_context_, notification); |
} |
void NotificationMessageFilter::OnShowPersistentNotification( |
@@ -127,8 +143,6 @@ void NotificationMessageFilter::OnShowPersistentNotification( |
database_data.service_worker_registration_id = service_worker_registration_id; |
database_data.notification_data = 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, |
@@ -150,20 +164,40 @@ void NotificationMessageFilter::DidWritePersistentNotificationData( |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
if (success) { |
+ scoped_refptr<NotificationDelegate> delegate = |
+ new PersistentNotificationDelegate(browser_context_, origin, |
+ persistent_notification_id); |
+ |
+ std::string notification_id = |
+ notification_id_generator_.GenerateForPersistentNotification( |
+ origin, |
+ notification_data.tag, |
+ persistent_notification_id); |
+ |
+ message_center::Notification notification( |
+ message_center::NOTIFICATION_TYPE_SIMPLE, |
+ notification_id, |
+ notification_data.title, |
+ notification_data.body, |
+ gfx::Image::CreateFrom1xBitmap(icon), |
+ base::UTF8ToUTF16(origin.GetOrigin().spec()), |
+ message_center::NotifierId(origin), |
+ message_center::RichNotificationData(), |
+ delegate.get()); |
+ |
PlatformNotificationService* service = |
GetContentClient()->browser()->GetPlatformNotificationService(); |
DCHECK(service); |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(&PlatformNotificationService::DisplayPersistentNotification, |
- base::Unretained(service), // The service is a singleton. |
- browser_context_, |
- persistent_notification_id, |
- origin, |
- icon, |
- notification_data)); |
+ //if (VerifyNotificationPermissionGranted(service, origin)) { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&PlatformNotificationService::DisplayNotification, |
+ base::Unretained(service), // The service is a singleton. |
+ browser_context_, |
+ notification)); |
+ //} |
} |
Send(new PlatformNotificationMsg_DidShowPersistent(request_id, success)); |
@@ -216,20 +250,34 @@ 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_)) |
+ if (!RenderProcessHost::FromID(render_process_id_)) |
return; |
- if (!close_closures_.count(notification_id)) |
- return; |
+ // TODO(peter): Have the renderer inform us of those. |
+ GURL origin("http://127.0.0.1:8000"); |
+ std::string tag = ""; |
- close_closures_[notification_id].Run(); |
- close_closures_.erase(notification_id); |
+ std::string notification_id = |
+ notification_id_generator_.GenerateForNonPersistentNotification( |
+ origin, |
+ tag, |
+ non_persistent_notification_id); |
+ |
+ PlatformNotificationService* service = |
+ GetContentClient()->browser()->GetPlatformNotificationService(); |
+ DCHECK(service); |
+ |
+ if (VerifyNotificationPermissionGranted(service, origin)) |
+ service->CloseNotification(browser_context_, notification_id); |
} |
void NotificationMessageFilter::OnClosePersistentNotification( |
const GURL& origin, |
+ /* const std::string& tag, */ |
int64_t persistent_notification_id) { |
DCHECK_CURRENTLY_ON(BrowserThread::IO); |
if (GetPermissionForOriginOnIO(origin) != |
@@ -238,19 +286,28 @@ void NotificationMessageFilter::OnClosePersistentNotification( |
return; |
} |
+ // TODO(peter): Have the renderer inform us of this. |
+ std::string tag = ""; |
+ |
PlatformNotificationService* service = |
GetContentClient()->browser()->GetPlatformNotificationService(); |
DCHECK(service); |
+ std::string notification_id = |
+ notification_id_generator_.GenerateForPersistentNotification( |
+ origin, |
+ tag, |
+ persistent_notification_id); |
+ |
// There's no point in waiting until the database data has been removed before |
// closing the notification presented to the user. Post that task immediately. |
BrowserThread::PostTask( |
BrowserThread::UI, |
FROM_HERE, |
- base::Bind(&PlatformNotificationService::ClosePersistentNotification, |
+ base::Bind(&PlatformNotificationService::CloseNotification, |
base::Unretained(service), // The service is a singleton. |
browser_context_, |
- persistent_notification_id)); |
+ notification_id)); |
notification_context_->DeleteNotificationData( |
persistent_notification_id, |
@@ -279,7 +336,7 @@ NotificationMessageFilter::GetPermissionForOriginOnIO( |
return service->CheckPermissionOnIOThread(resource_context_, |
origin, |
- process_id_); |
+ render_process_id_); |
} |
bool NotificationMessageFilter::VerifyNotificationPermissionGranted( |
@@ -290,7 +347,7 @@ bool NotificationMessageFilter::VerifyNotificationPermissionGranted( |
blink::WebNotificationPermission permission = |
service->CheckPermissionOnUIThread(browser_context_, |
origin, |
- process_id_); |
+ render_process_id_); |
if (permission == blink::WebNotificationPermissionAllowed) |
return true; |