Index: content/child/notifications/notification_manager.cc |
diff --git a/content/child/notifications/notification_manager.cc b/content/child/notifications/notification_manager.cc |
index 4cc51d7db4f6cf60d8d93831c82dde7d623241a8..bd948d3c0517687a80264c28b646aa6c3a685624 100644 |
--- a/content/child/notifications/notification_manager.cc |
+++ b/content/child/notifications/notification_manager.cc |
@@ -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 |
@@ -73,13 +85,15 @@ void NotificationManager::show( |
const blink::WebSecurityOrigin& origin, |
const blink::WebNotificationData& notification_data, |
blink::WebNotificationDelegate* delegate) { |
- if (notification_data.icon.isEmpty()) { |
+ DCHECK_EQ(0u, notification_data.actions.size()); |
+ |
+ if (!HasResourcesToFetch(notification_data)) { |
DisplayPageNotification(origin, notification_data, delegate, |
NotificationResources()); |
return; |
} |
- notifications_tracker_.FetchPageNotificationResources( |
+ notifications_tracker_.FetchResources( |
notification_data, delegate, |
base::Bind(&NotificationManager::DisplayPageNotification, |
base::Unretained(this), // this owns |notifications_tracker_| |
@@ -92,6 +106,7 @@ void NotificationManager::showPersistent( |
blink::WebServiceWorkerRegistration* service_worker_registration, |
blink::WebNotificationShowCallbacks* callbacks) { |
DCHECK(service_worker_registration); |
+ |
int64_t service_worker_registration_id = |
static_cast<WebServiceWorkerRegistrationImpl*>( |
service_worker_registration) |
@@ -116,15 +131,24 @@ void NotificationManager::showPersistent( |
return; |
} |
- if (notification_data.icon.isEmpty()) { |
+ if (!HasResourcesToFetch(notification_data)) { |
+ NotificationResources notification_resources; |
+ |
+ // Action indices are expected to have a corresponding icon bitmap, which |
+ // may be empty when the developer provided no (or an invalid) icon. |
+ 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), NotificationResources()); |
+ std::move(owned_callbacks), notification_resources); |
return; |
} |
- notifications_tracker_.FetchPersistentNotificationResources( |
- notification_data, |
+ notifications_tracker_.FetchResources( |
+ notification_data, nullptr /* delegate */, |
base::Bind(&NotificationManager::DisplayPersistentNotification, |
base::Unretained(this), // this owns |notifications_tracker_| |
origin, notification_data, service_worker_registration_id, |
@@ -159,7 +183,7 @@ void NotificationManager::getNotifications( |
} |
void NotificationManager::close(blink::WebNotificationDelegate* delegate) { |
- if (notifications_tracker_.CancelPageNotificationFetches(delegate)) |
+ if (notifications_tracker_.CancelResourceFetches(delegate)) |
return; |
for (auto& iter : active_page_notifications_) { |
@@ -189,7 +213,7 @@ void NotificationManager::closePersistent( |
void NotificationManager::notifyDelegateDestroyed( |
blink::WebNotificationDelegate* delegate) { |
- if (notifications_tracker_.CancelPageNotificationFetches(delegate)) |
+ if (notifications_tracker_.CancelResourceFetches(delegate)) |
return; |
for (auto& iter : active_page_notifications_) { |
@@ -306,6 +330,9 @@ void NotificationManager::DisplayPageNotification( |
const blink::WebNotificationData& notification_data, |
blink::WebNotificationDelegate* delegate, |
const NotificationResources& notification_resources) { |
+ DCHECK_EQ(0u, notification_data.actions.size()); |
+ DCHECK_EQ(0u, notification_resources.action_icons.size()); |
+ |
int notification_id = |
notification_dispatcher_->GenerateNotificationId(CurrentWorkerId()); |
@@ -324,6 +351,9 @@ void NotificationManager::DisplayPersistentNotification( |
int64_t service_worker_registration_id, |
scoped_ptr<blink::WebNotificationShowCallbacks> callbacks, |
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 = |