| Index: content/child/notifications/notification_manager.cc | 
| diff --git a/content/child/notifications/notification_manager.cc b/content/child/notifications/notification_manager.cc | 
| index 6671277f466df42531ce21af44f57d2a635e1628..45af387fac9dfa0482a5c832f965cf96c09e267a 100644 | 
| --- a/content/child/notifications/notification_manager.cc | 
| +++ b/content/child/notifications/notification_manager.cc | 
| @@ -43,6 +43,14 @@ NotificationResources ToNotificationResources( | 
| static base::LazyInstance<base::ThreadLocalPointer<NotificationManager>>::Leaky | 
| g_notification_manager_tls = LAZY_INSTANCE_INITIALIZER; | 
|  | 
| +NotificationManager::ActiveNotificationData::ActiveNotificationData( | 
| +    blink::WebNotificationDelegate* delegate, | 
| +    const GURL& origin, | 
| +    const std::string& tag) | 
| +    : delegate(delegate), origin(origin), tag(tag) {} | 
| + | 
| +NotificationManager::ActiveNotificationData::~ActiveNotificationData() {} | 
| + | 
| NotificationManager::NotificationManager( | 
| ThreadSafeSender* thread_safe_sender, | 
| NotificationDispatcher* notification_dispatcher) | 
| @@ -80,15 +88,20 @@ void NotificationManager::show( | 
| DCHECK_EQ(0u, notification_data.actions.size()); | 
| DCHECK_EQ(0u, notification_resources->actionIcons.size()); | 
|  | 
| +  GURL origin_gurl = blink::WebStringToGURL(origin.toString()); | 
| + | 
| int notification_id = | 
| notification_dispatcher_->GenerateNotificationId(CurrentWorkerId()); | 
|  | 
| -  active_page_notifications_[notification_id] = delegate; | 
| +  active_page_notifications_[notification_id] = ActiveNotificationData( | 
| +      delegate, origin_gurl, | 
| +      base::UTF16ToUTF8(base::StringPiece16(notification_data.tag))); | 
| + | 
| // TODO(mkwst): This is potentially doing the wrong thing with unique | 
| // 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()), | 
| +      notification_id, origin_gurl, | 
| ToPlatformNotificationData(notification_data), | 
| ToNotificationResources(std::move(notification_resources)))); | 
| } | 
| @@ -175,11 +188,11 @@ void NotificationManager::getNotifications( | 
|  | 
| void NotificationManager::close(blink::WebNotificationDelegate* delegate) { | 
| for (auto& iter : active_page_notifications_) { | 
| -    if (iter.second != delegate) | 
| +    if (iter.second.delegate != delegate) | 
| continue; | 
|  | 
| -    thread_safe_sender_->Send( | 
| -        new PlatformNotificationHostMsg_Close(iter.first)); | 
| +    thread_safe_sender_->Send(new PlatformNotificationHostMsg_Close( | 
| +        iter.second.origin, iter.second.tag, iter.first)); | 
| active_page_notifications_.erase(iter.first); | 
| return; | 
| } | 
| @@ -191,18 +204,21 @@ void NotificationManager::close(blink::WebNotificationDelegate* delegate) { | 
|  | 
| void NotificationManager::closePersistent( | 
| const blink::WebSecurityOrigin& origin, | 
| -    int64_t persistent_notification_id) { | 
| +    const blink::WebString& tag, | 
| +    const blink::WebString& notification_id) { | 
| thread_safe_sender_->Send(new PlatformNotificationHostMsg_ClosePersistent( | 
| // TODO(mkwst): This is potentially doing the wrong thing with unique | 
| // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See | 
| // https://crbug.com/490074 for detail. | 
| -      blink::WebStringToGURL(origin.toString()), persistent_notification_id)); | 
| +      blink::WebStringToGURL(origin.toString()), | 
| +      base::UTF16ToUTF8(base::StringPiece16(tag)), | 
| +      base::UTF16ToUTF8(base::StringPiece16(notification_id)))); | 
| } | 
|  | 
| void NotificationManager::notifyDelegateDestroyed( | 
| blink::WebNotificationDelegate* delegate) { | 
| for (auto& iter : active_page_notifications_) { | 
| -    if (iter.second != delegate) | 
| +    if (iter.second.delegate != delegate) | 
| continue; | 
|  | 
| active_page_notifications_.erase(iter.first); | 
| @@ -231,7 +247,7 @@ void NotificationManager::OnDidShow(int notification_id) { | 
| if (iter == active_page_notifications_.end()) | 
| return; | 
|  | 
| -  iter->second->dispatchShowEvent(); | 
| +  iter->second.delegate->dispatchShowEvent(); | 
| } | 
|  | 
| void NotificationManager::OnDidShowPersistent(int request_id, bool success) { | 
| @@ -255,7 +271,8 @@ void NotificationManager::OnDidClose(int notification_id) { | 
| if (iter == active_page_notifications_.end()) | 
| return; | 
|  | 
| -  iter->second->dispatchCloseEvent(); | 
| +  iter->second.delegate->dispatchCloseEvent(); | 
| + | 
| active_page_notifications_.erase(iter); | 
| } | 
|  | 
| @@ -264,7 +281,7 @@ void NotificationManager::OnDidClick(int notification_id) { | 
| if (iter == active_page_notifications_.end()) | 
| return; | 
|  | 
| -  iter->second->dispatchClickEvent(); | 
| +  iter->second.delegate->dispatchClickEvent(); | 
| } | 
|  | 
| void NotificationManager::OnDidGetNotifications( | 
| @@ -281,7 +298,8 @@ void NotificationManager::OnDidGetNotifications( | 
|  | 
| for (size_t i = 0; i < notification_infos.size(); ++i) { | 
| blink::WebPersistentNotificationInfo web_notification_info; | 
| -    web_notification_info.persistentId = notification_infos[i].first; | 
| +    web_notification_info.notificationId = | 
| +        blink::WebString::fromUTF8(notification_infos[i].first); | 
| web_notification_info.data = | 
| ToWebNotificationData(notification_infos[i].second); | 
|  | 
|  |