Index: content/child/notifications/notification_manager.cc |
diff --git a/content/child/notifications/notification_manager.cc b/content/child/notifications/notification_manager.cc |
index f7b839c18b1939036235bef14612270e1c006014..436c92e2fa1d0a878d55ccbf61e3d0cff8112429 100644 |
--- a/content/child/notifications/notification_manager.cc |
+++ b/content/child/notifications/notification_manager.cc |
@@ -17,11 +17,11 @@ |
#include "content/child/service_worker/web_service_worker_registration_impl.h" |
#include "content/child/thread_safe_sender.h" |
#include "content/common/notification_constants.h" |
+#include "content/public/common/notification_resources.h" |
#include "content/public/common/platform_notification_data.h" |
#include "third_party/WebKit/public/platform/URLConversion.h" |
#include "third_party/WebKit/public/platform/WebSecurityOrigin.h" |
#include "third_party/WebKit/public/platform/modules/notifications/WebNotificationDelegate.h" |
-#include "third_party/skia/include/core/SkBitmap.h" |
using blink::WebNotificationPermission; |
@@ -32,6 +32,18 @@ int CurrentWorkerId() { |
return WorkerThread::GetCurrentId(); |
} |
+// Checks whether |notification_data| specifies any non-empty resources that |
+// need to be fetched. |
+bool hasResourcesToFetch(const blink::WebNotificationData& notification_data) { |
+ if (!notification_data.icon.isEmpty()) |
+ return true; |
+ for (const auto& action : notification_data.actions) { |
+ if (!action.icon.isEmpty()) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
} // namespace |
static base::LazyInstance<base::ThreadLocalPointer<NotificationManager>>::Leaky |
@@ -43,7 +55,7 @@ NotificationManager::NotificationManager( |
NotificationDispatcher* notification_dispatcher) |
: thread_safe_sender_(thread_safe_sender), |
notification_dispatcher_(notification_dispatcher), |
- pending_notifications_(main_thread_task_runner) { |
+ notifications_tracker_(main_thread_task_runner) { |
g_notification_manager_tls.Pointer()->Set(this); |
} |
@@ -73,15 +85,16 @@ void NotificationManager::show( |
const blink::WebSecurityOrigin& origin, |
const blink::WebNotificationData& notification_data, |
blink::WebNotificationDelegate* delegate) { |
- if (notification_data.icon.isEmpty()) { |
- DisplayPageNotification(origin, notification_data, delegate, SkBitmap()); |
+ if (!hasResourcesToFetch(notification_data)) { |
+ DisplayPageNotification(origin, notification_data, delegate, |
+ NotificationResources()); |
return; |
} |
- pending_notifications_.FetchPageNotificationResources( |
+ notifications_tracker_.FetchNotificationResources( |
notification_data, delegate, |
base::Bind(&NotificationManager::DisplayPageNotification, |
- base::Unretained(this), // this owns |pending_notifications_| |
+ base::Unretained(this), // this owns |notifications_tracker_| |
origin, notification_data, delegate)); |
} |
@@ -115,17 +128,22 @@ void NotificationManager::showPersistent( |
return; |
} |
- if (notification_data.icon.isEmpty()) { |
- DisplayPersistentNotification(origin, notification_data, |
- service_worker_registration_id, |
- std::move(owned_callbacks), SkBitmap()); |
+ if (!hasResourcesToFetch(notification_data)) { |
+ NotificationResources notification_resources; |
+ if (!notification_data.actions.isEmpty()) { |
+ notification_resources.action_icons.resize( |
+ notification_data.actions.size()); |
+ } |
+ DisplayPersistentNotification( |
+ origin, notification_data, service_worker_registration_id, |
+ std::move(owned_callbacks), notification_resources); |
return; |
} |
- pending_notifications_.FetchPersistentNotificationResources( |
- notification_data, |
+ notifications_tracker_.FetchNotificationResources( |
+ notification_data, nullptr /* delegate */, |
base::Bind(&NotificationManager::DisplayPersistentNotification, |
- base::Unretained(this), // this owns |pending_notifications_| |
+ base::Unretained(this), // this owns |notifications_tracker_| |
origin, notification_data, service_worker_registration_id, |
base::Passed(&owned_callbacks))); |
} |
@@ -158,7 +176,7 @@ void NotificationManager::getNotifications( |
} |
void NotificationManager::close(blink::WebNotificationDelegate* delegate) { |
- if (pending_notifications_.CancelPageNotificationFetches(delegate)) |
+ if (notifications_tracker_.CancelResourceFetches(delegate)) |
return; |
for (auto& iter : active_page_notifications_) { |
@@ -188,7 +206,7 @@ void NotificationManager::closePersistent( |
void NotificationManager::notifyDelegateDestroyed( |
blink::WebNotificationDelegate* delegate) { |
- if (pending_notifications_.CancelPageNotificationFetches(delegate)) |
+ if (notifications_tracker_.CancelResourceFetches(delegate)) |
return; |
for (auto& iter : active_page_notifications_) { |
@@ -304,7 +322,10 @@ void NotificationManager::DisplayPageNotification( |
const blink::WebSecurityOrigin& origin, |
const blink::WebNotificationData& notification_data, |
blink::WebNotificationDelegate* delegate, |
- const SkBitmap& icon) { |
+ const NotificationResources& notification_resources) { |
+ DCHECK_EQ(notification_data.actions.size(), 0u); |
+ DCHECK_EQ(notification_resources.action_icons.size(), 0u); |
+ |
int notification_id = |
notification_dispatcher_->GenerateNotificationId(CurrentWorkerId()); |
@@ -313,8 +334,8 @@ void NotificationManager::DisplayPageNotification( |
// origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See |
// https://crbug.com/490074 for detail. |
thread_safe_sender_->Send(new PlatformNotificationHostMsg_Show( |
- notification_id, blink::WebStringToGURL(origin.toString()), icon, |
- ToPlatformNotificationData(notification_data))); |
+ notification_id, blink::WebStringToGURL(origin.toString()), |
+ ToPlatformNotificationData(notification_data), notification_resources)); |
} |
void NotificationManager::DisplayPersistentNotification( |
@@ -322,7 +343,10 @@ void NotificationManager::DisplayPersistentNotification( |
const blink::WebNotificationData& notification_data, |
int64_t service_worker_registration_id, |
scoped_ptr<blink::WebNotificationShowCallbacks> callbacks, |
- const SkBitmap& icon) { |
+ const NotificationResources& notification_resources) { |
+ DCHECK_EQ(notification_data.actions.size(), |
+ notification_resources.action_icons.size()); |
+ |
// TODO(peter): GenerateNotificationId is more of a request id. Consider |
// renaming the method in the NotificationDispatcher if this makes sense. |
int request_id = |
@@ -336,8 +360,8 @@ void NotificationManager::DisplayPersistentNotification( |
// https://crbug.com/490074 for detail. |
thread_safe_sender_->Send(new PlatformNotificationHostMsg_ShowPersistent( |
request_id, service_worker_registration_id, |
- blink::WebStringToGURL(origin.toString()), icon, |
- ToPlatformNotificationData(notification_data))); |
+ blink::WebStringToGURL(origin.toString()), |
+ ToPlatformNotificationData(notification_data), notification_resources)); |
} |
} // namespace content |