| Index: chrome/browser/push_messaging/push_messaging_service_impl.cc
|
| diff --git a/chrome/browser/push_messaging/push_messaging_service_impl.cc b/chrome/browser/push_messaging/push_messaging_service_impl.cc
|
| index ea47be0113b8326dd4468f3b2eff1fa0b0109647..68ec65ffc1da48aeb021bf638d95db58c548c8a8 100644
|
| --- a/chrome/browser/push_messaging/push_messaging_service_impl.cc
|
| +++ b/chrome/browser/push_messaging/push_messaging_service_impl.cc
|
| @@ -37,6 +37,8 @@
|
| #include "components/rappor/rappor_utils.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/platform_notification_context.h"
|
| #include "content/public/browser/render_frame_host.h"
|
| #include "content/public/browser/service_worker_context.h"
|
| #include "content/public/browser/storage_partition.h"
|
| @@ -57,6 +59,8 @@
|
| #include "chrome/browser/ui/tabs/tab_strip_model.h"
|
| #endif
|
|
|
| +using content::BrowserThread;
|
| +
|
| namespace {
|
| const int kMaxRegistrations = 1000000;
|
|
|
| @@ -278,22 +282,59 @@ void PushMessagingServiceImpl::DeliverMessageCallback(
|
| }
|
|
|
| void PushMessagingServiceImpl::RequireUserVisibleUX(
|
| - const GURL& requesting_origin, int64 service_worker_registration_id,
|
| + const GURL& requesting_origin, int64_t service_worker_registration_id,
|
| const base::Closure& message_handled_closure) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| #if defined(ENABLE_NOTIFICATIONS)
|
| // TODO(johnme): Relax this heuristic slightly.
|
| - PlatformNotificationServiceImpl* notification_service =
|
| - PlatformNotificationServiceImpl::GetInstance();
|
| - // Can't use g_browser_process->notification_ui_manager(), since the test uses
|
| - // PlatformNotificationServiceImpl::SetNotificationUIManagerForTesting.
|
| - // TODO(peter): Remove the need to use both APIs here once Notification.get()
|
| - // is supported.
|
| - int notification_count = notification_service->GetNotificationUIManager()->
|
| - GetAllIdsByProfileAndSourceOrigin(profile_, requesting_origin).size();
|
| + scoped_refptr<content::PlatformNotificationContext> notification_context =
|
| + content::BrowserContext::GetStoragePartitionForSite(
|
| + profile_, requesting_origin)->GetPlatformNotificationContext();
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(
|
| + &content::PlatformNotificationContext
|
| + ::ReadAllNotificationDataForServiceWorkerRegistration,
|
| + notification_context,
|
| + requesting_origin, service_worker_registration_id,
|
| + base::Bind(
|
| + &PushMessagingServiceImpl::DidGetNotificationsFromDatabaseIOProxy,
|
| + weak_factory_.GetWeakPtr(),
|
| + requesting_origin, service_worker_registration_id,
|
| + message_handled_closure)));
|
| +#else
|
| + message_handled_closure.Run();
|
| +#endif // defined(ENABLE_NOTIFICATIONS)
|
| +}
|
| +
|
| +// static
|
| +void PushMessagingServiceImpl::DidGetNotificationsFromDatabaseIOProxy(
|
| + const base::WeakPtr<PushMessagingServiceImpl>& ui_weak_ptr,
|
| + const GURL& requesting_origin,
|
| + int64_t service_worker_registration_id,
|
| + const base::Closure& message_handled_closure,
|
| + bool success,
|
| + const std::vector<content::NotificationDatabaseData>& data) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&PushMessagingServiceImpl::DidGetNotificationsFromDatabase,
|
| + ui_weak_ptr,
|
| + requesting_origin, service_worker_registration_id,
|
| + message_handled_closure,
|
| + success, data));
|
| +}
|
| +
|
| +void PushMessagingServiceImpl::DidGetNotificationsFromDatabase(
|
| + const GURL& requesting_origin, int64_t service_worker_registration_id,
|
| + const base::Closure& message_handled_closure,
|
| + bool success, const std::vector<content::NotificationDatabaseData>& data) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| // TODO(johnme): Hiding an existing notification should also count as a useful
|
| // user-visible action done in response to a push message - but make sure that
|
| // sending two messages in rapid succession which show then hide a
|
| // notification doesn't count.
|
| + int notification_count = success ? data.size() : 0;
|
| bool notification_shown = notification_count > 0;
|
|
|
| bool notification_needed = true;
|
| @@ -347,7 +388,7 @@ void PushMessagingServiceImpl::RequireUserVisibleUX(
|
|
|
| GetNotificationsShownByLastFewPushes(
|
| service_worker_context, service_worker_registration_id,
|
| - base::Bind(&PushMessagingServiceImpl::DidGetNotificationsShown,
|
| + base::Bind(&PushMessagingServiceImpl::DidGetNotificationsShownAndNeeded,
|
| weak_factory_.GetWeakPtr(),
|
| requesting_origin, service_worker_registration_id,
|
| notification_shown, notification_needed,
|
| @@ -357,19 +398,17 @@ void PushMessagingServiceImpl::RequireUserVisibleUX(
|
| content::PUSH_USER_VISIBLE_STATUS_NOT_REQUIRED_AND_NOT_SHOWN);
|
| message_handled_closure.Run();
|
| }
|
| -#else
|
| - message_handled_closure.Run();
|
| -#endif // defined(ENABLE_NOTIFICATIONS)
|
| }
|
|
|
| static void IgnoreResult(bool unused) {
|
| }
|
|
|
| -void PushMessagingServiceImpl::DidGetNotificationsShown(
|
| - const GURL& requesting_origin, int64 service_worker_registration_id,
|
| +void PushMessagingServiceImpl::DidGetNotificationsShownAndNeeded(
|
| + const GURL& requesting_origin, int64_t service_worker_registration_id,
|
| bool notification_shown, bool notification_needed,
|
| const base::Closure& message_handled_closure,
|
| const std::string& data, bool success, bool not_found) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| content::ServiceWorkerContext* service_worker_context =
|
| content::BrowserContext::GetStoragePartitionForSite(
|
| profile_, requesting_origin)->GetServiceWorkerContext();
|
| @@ -429,13 +468,62 @@ void PushMessagingServiceImpl::DidGetNotificationsShown(
|
| notification_data.body =
|
| l10n_util::GetStringUTF16(IDS_PUSH_MESSAGING_GENERIC_NOTIFICATION_BODY);
|
| notification_data.tag = kPushMessagingForcedNotificationTag;
|
| - notification_data.icon = GURL(); // TODO(johnme): Better icon?
|
| + notification_data.icon = GURL();
|
| notification_data.silent = true;
|
| - PlatformNotificationServiceImpl* notification_service =
|
| - PlatformNotificationServiceImpl::GetInstance();
|
| - notification_service->DisplayPersistentNotification(
|
| +
|
| + content::NotificationDatabaseData database_data;
|
| + database_data.origin = requesting_origin;
|
| + database_data.service_worker_registration_id =
|
| + service_worker_registration_id;
|
| + database_data.notification_data = notification_data;
|
| +
|
| + scoped_refptr<content::PlatformNotificationContext> notification_context =
|
| + content::BrowserContext::GetStoragePartitionForSite(
|
| + profile_, requesting_origin)->GetPlatformNotificationContext();
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(
|
| + &content::PlatformNotificationContext::WriteNotificationData,
|
| + notification_context,
|
| + requesting_origin, database_data,
|
| + base::Bind(&PushMessagingServiceImpl::DidWriteNotificationDataIOProxy,
|
| + weak_factory_.GetWeakPtr(),
|
| + requesting_origin, notification_data,
|
| + message_handled_closure)));
|
| +}
|
| +
|
| +// static
|
| +void PushMessagingServiceImpl::DidWriteNotificationDataIOProxy(
|
| + const base::WeakPtr<PushMessagingServiceImpl>& ui_weak_ptr,
|
| + const GURL& requesting_origin,
|
| + const content::PlatformNotificationData& notification_data,
|
| + const base::Closure& message_handled_closure,
|
| + bool success,
|
| + int64_t persistent_notification_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(&PushMessagingServiceImpl::DidWriteNotificationData,
|
| + ui_weak_ptr,
|
| + requesting_origin, notification_data, message_handled_closure,
|
| + success, persistent_notification_id));
|
| +}
|
| +
|
| +void PushMessagingServiceImpl::DidWriteNotificationData(
|
| + const GURL& requesting_origin,
|
| + const content::PlatformNotificationData& notification_data,
|
| + const base::Closure& message_handled_closure,
|
| + bool success,
|
| + int64_t persistent_notification_id) {
|
| + DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + if (!success) {
|
| + DLOG(ERROR) << "Writing forced notification to database should not fail";
|
| + message_handled_closure.Run();
|
| + return;
|
| + }
|
| + PlatformNotificationServiceImpl::GetInstance()->DisplayPersistentNotification(
|
| profile_,
|
| - service_worker_registration_id,
|
| + persistent_notification_id,
|
| requesting_origin,
|
| SkBitmap() /* icon */,
|
| notification_data);
|
|
|