| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/child/notifications/notification_manager.h" | 5 #include "content/child/notifications/notification_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
| 10 #include "base/metrics/histogram_macros.h" | 10 #include "base/metrics/histogram_macros.h" |
| (...skipping 25 matching lines...) Expand all Loading... |
| 36 for (const auto& action_icon : web_resources->actionIcons) | 36 for (const auto& action_icon : web_resources->actionIcons) |
| 37 resources.action_icons.push_back(action_icon); | 37 resources.action_icons.push_back(action_icon); |
| 38 return resources; | 38 return resources; |
| 39 } | 39 } |
| 40 | 40 |
| 41 } // namespace | 41 } // namespace |
| 42 | 42 |
| 43 static base::LazyInstance<base::ThreadLocalPointer<NotificationManager>>::Leaky | 43 static base::LazyInstance<base::ThreadLocalPointer<NotificationManager>>::Leaky |
| 44 g_notification_manager_tls = LAZY_INSTANCE_INITIALIZER; | 44 g_notification_manager_tls = LAZY_INSTANCE_INITIALIZER; |
| 45 | 45 |
| 46 NotificationManager::ActiveNotificationData::ActiveNotificationData( |
| 47 blink::WebNotificationDelegate* delegate, |
| 48 const GURL& origin, |
| 49 const std::string& tag) |
| 50 : delegate(delegate), origin(origin), tag(tag) {} |
| 51 |
| 52 NotificationManager::ActiveNotificationData::~ActiveNotificationData() {} |
| 53 |
| 46 NotificationManager::NotificationManager( | 54 NotificationManager::NotificationManager( |
| 47 ThreadSafeSender* thread_safe_sender, | 55 ThreadSafeSender* thread_safe_sender, |
| 48 NotificationDispatcher* notification_dispatcher) | 56 NotificationDispatcher* notification_dispatcher) |
| 49 : thread_safe_sender_(thread_safe_sender), | 57 : thread_safe_sender_(thread_safe_sender), |
| 50 notification_dispatcher_(notification_dispatcher) { | 58 notification_dispatcher_(notification_dispatcher) { |
| 51 g_notification_manager_tls.Pointer()->Set(this); | 59 g_notification_manager_tls.Pointer()->Set(this); |
| 52 } | 60 } |
| 53 | 61 |
| 54 NotificationManager::~NotificationManager() { | 62 NotificationManager::~NotificationManager() { |
| 55 g_notification_manager_tls.Pointer()->Set(nullptr); | 63 g_notification_manager_tls.Pointer()->Set(nullptr); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 73 } | 81 } |
| 74 | 82 |
| 75 void NotificationManager::show( | 83 void NotificationManager::show( |
| 76 const blink::WebSecurityOrigin& origin, | 84 const blink::WebSecurityOrigin& origin, |
| 77 const blink::WebNotificationData& notification_data, | 85 const blink::WebNotificationData& notification_data, |
| 78 std::unique_ptr<blink::WebNotificationResources> notification_resources, | 86 std::unique_ptr<blink::WebNotificationResources> notification_resources, |
| 79 blink::WebNotificationDelegate* delegate) { | 87 blink::WebNotificationDelegate* delegate) { |
| 80 DCHECK_EQ(0u, notification_data.actions.size()); | 88 DCHECK_EQ(0u, notification_data.actions.size()); |
| 81 DCHECK_EQ(0u, notification_resources->actionIcons.size()); | 89 DCHECK_EQ(0u, notification_resources->actionIcons.size()); |
| 82 | 90 |
| 91 GURL origin_gurl = blink::WebStringToGURL(origin.toString()); |
| 92 |
| 83 int notification_id = | 93 int notification_id = |
| 84 notification_dispatcher_->GenerateNotificationId(CurrentWorkerId()); | 94 notification_dispatcher_->GenerateNotificationId(CurrentWorkerId()); |
| 85 | 95 |
| 86 active_page_notifications_[notification_id] = delegate; | 96 active_page_notifications_[notification_id] = ActiveNotificationData( |
| 97 delegate, origin_gurl, |
| 98 base::UTF16ToUTF8(base::StringPiece16(notification_data.tag))); |
| 99 |
| 87 // TODO(mkwst): This is potentially doing the wrong thing with unique | 100 // TODO(mkwst): This is potentially doing the wrong thing with unique |
| 88 // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See | 101 // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See |
| 89 // https://crbug.com/490074 for detail. | 102 // https://crbug.com/490074 for detail. |
| 90 thread_safe_sender_->Send(new PlatformNotificationHostMsg_Show( | 103 thread_safe_sender_->Send(new PlatformNotificationHostMsg_Show( |
| 91 notification_id, blink::WebStringToGURL(origin.toString()), | 104 notification_id, origin_gurl, |
| 92 ToPlatformNotificationData(notification_data), | 105 ToPlatformNotificationData(notification_data), |
| 93 ToNotificationResources(std::move(notification_resources)))); | 106 ToNotificationResources(std::move(notification_resources)))); |
| 94 } | 107 } |
| 95 | 108 |
| 96 void NotificationManager::showPersistent( | 109 void NotificationManager::showPersistent( |
| 97 const blink::WebSecurityOrigin& origin, | 110 const blink::WebSecurityOrigin& origin, |
| 98 const blink::WebNotificationData& notification_data, | 111 const blink::WebNotificationData& notification_data, |
| 99 std::unique_ptr<blink::WebNotificationResources> notification_resources, | 112 std::unique_ptr<blink::WebNotificationResources> notification_resources, |
| 100 blink::WebServiceWorkerRegistration* service_worker_registration, | 113 blink::WebServiceWorkerRegistration* service_worker_registration, |
| 101 blink::WebNotificationShowCallbacks* callbacks) { | 114 blink::WebNotificationShowCallbacks* callbacks) { |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 | 181 |
| 169 pending_get_notification_requests_.AddWithID(callbacks, request_id); | 182 pending_get_notification_requests_.AddWithID(callbacks, request_id); |
| 170 | 183 |
| 171 thread_safe_sender_->Send(new PlatformNotificationHostMsg_GetNotifications( | 184 thread_safe_sender_->Send(new PlatformNotificationHostMsg_GetNotifications( |
| 172 request_id, service_worker_registration_id, origin, | 185 request_id, service_worker_registration_id, origin, |
| 173 base::UTF16ToUTF8(base::StringPiece16(filter_tag)))); | 186 base::UTF16ToUTF8(base::StringPiece16(filter_tag)))); |
| 174 } | 187 } |
| 175 | 188 |
| 176 void NotificationManager::close(blink::WebNotificationDelegate* delegate) { | 189 void NotificationManager::close(blink::WebNotificationDelegate* delegate) { |
| 177 for (auto& iter : active_page_notifications_) { | 190 for (auto& iter : active_page_notifications_) { |
| 178 if (iter.second != delegate) | 191 if (iter.second.delegate != delegate) |
| 179 continue; | 192 continue; |
| 180 | 193 |
| 181 thread_safe_sender_->Send( | 194 thread_safe_sender_->Send(new PlatformNotificationHostMsg_Close( |
| 182 new PlatformNotificationHostMsg_Close(iter.first)); | 195 iter.second.origin, iter.second.tag, iter.first)); |
| 183 active_page_notifications_.erase(iter.first); | 196 active_page_notifications_.erase(iter.first); |
| 184 return; | 197 return; |
| 185 } | 198 } |
| 186 | 199 |
| 187 // It should not be possible for Blink to call close() on a Notification which | 200 // It should not be possible for Blink to call close() on a Notification which |
| 188 // does not exist in either the pending or active notification lists. | 201 // does not exist in either the pending or active notification lists. |
| 189 NOTREACHED(); | 202 NOTREACHED(); |
| 190 } | 203 } |
| 191 | 204 |
| 192 void NotificationManager::closePersistent( | 205 void NotificationManager::closePersistent( |
| 193 const blink::WebSecurityOrigin& origin, | 206 const blink::WebSecurityOrigin& origin, |
| 194 int64_t persistent_notification_id) { | 207 const blink::WebString& tag, |
| 208 const blink::WebString& notification_id) { |
| 195 thread_safe_sender_->Send(new PlatformNotificationHostMsg_ClosePersistent( | 209 thread_safe_sender_->Send(new PlatformNotificationHostMsg_ClosePersistent( |
| 196 // TODO(mkwst): This is potentially doing the wrong thing with unique | 210 // TODO(mkwst): This is potentially doing the wrong thing with unique |
| 197 // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See | 211 // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See |
| 198 // https://crbug.com/490074 for detail. | 212 // https://crbug.com/490074 for detail. |
| 199 blink::WebStringToGURL(origin.toString()), persistent_notification_id)); | 213 blink::WebStringToGURL(origin.toString()), |
| 214 base::UTF16ToUTF8(base::StringPiece16(tag)), |
| 215 base::UTF16ToUTF8(base::StringPiece16(notification_id)))); |
| 200 } | 216 } |
| 201 | 217 |
| 202 void NotificationManager::notifyDelegateDestroyed( | 218 void NotificationManager::notifyDelegateDestroyed( |
| 203 blink::WebNotificationDelegate* delegate) { | 219 blink::WebNotificationDelegate* delegate) { |
| 204 for (auto& iter : active_page_notifications_) { | 220 for (auto& iter : active_page_notifications_) { |
| 205 if (iter.second != delegate) | 221 if (iter.second.delegate != delegate) |
| 206 continue; | 222 continue; |
| 207 | 223 |
| 208 active_page_notifications_.erase(iter.first); | 224 active_page_notifications_.erase(iter.first); |
| 209 return; | 225 return; |
| 210 } | 226 } |
| 211 } | 227 } |
| 212 | 228 |
| 213 bool NotificationManager::OnMessageReceived(const IPC::Message& message) { | 229 bool NotificationManager::OnMessageReceived(const IPC::Message& message) { |
| 214 bool handled = true; | 230 bool handled = true; |
| 215 IPC_BEGIN_MESSAGE_MAP(NotificationManager, message) | 231 IPC_BEGIN_MESSAGE_MAP(NotificationManager, message) |
| 216 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidShow, OnDidShow); | 232 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidShow, OnDidShow); |
| 217 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidShowPersistent, | 233 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidShowPersistent, |
| 218 OnDidShowPersistent) | 234 OnDidShowPersistent) |
| 219 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClose, OnDidClose); | 235 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClose, OnDidClose); |
| 220 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClick, OnDidClick); | 236 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidClick, OnDidClick); |
| 221 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidGetNotifications, | 237 IPC_MESSAGE_HANDLER(PlatformNotificationMsg_DidGetNotifications, |
| 222 OnDidGetNotifications) | 238 OnDidGetNotifications) |
| 223 IPC_MESSAGE_UNHANDLED(handled = false) | 239 IPC_MESSAGE_UNHANDLED(handled = false) |
| 224 IPC_END_MESSAGE_MAP() | 240 IPC_END_MESSAGE_MAP() |
| 225 | 241 |
| 226 return handled; | 242 return handled; |
| 227 } | 243 } |
| 228 | 244 |
| 229 void NotificationManager::OnDidShow(int notification_id) { | 245 void NotificationManager::OnDidShow(int notification_id) { |
| 230 const auto& iter = active_page_notifications_.find(notification_id); | 246 const auto& iter = active_page_notifications_.find(notification_id); |
| 231 if (iter == active_page_notifications_.end()) | 247 if (iter == active_page_notifications_.end()) |
| 232 return; | 248 return; |
| 233 | 249 |
| 234 iter->second->dispatchShowEvent(); | 250 iter->second.delegate->dispatchShowEvent(); |
| 235 } | 251 } |
| 236 | 252 |
| 237 void NotificationManager::OnDidShowPersistent(int request_id, bool success) { | 253 void NotificationManager::OnDidShowPersistent(int request_id, bool success) { |
| 238 blink::WebNotificationShowCallbacks* callbacks = | 254 blink::WebNotificationShowCallbacks* callbacks = |
| 239 pending_show_notification_requests_.Lookup(request_id); | 255 pending_show_notification_requests_.Lookup(request_id); |
| 240 DCHECK(callbacks); | 256 DCHECK(callbacks); |
| 241 | 257 |
| 242 if (!callbacks) | 258 if (!callbacks) |
| 243 return; | 259 return; |
| 244 | 260 |
| 245 if (success) | 261 if (success) |
| 246 callbacks->onSuccess(); | 262 callbacks->onSuccess(); |
| 247 else | 263 else |
| 248 callbacks->onError(); | 264 callbacks->onError(); |
| 249 | 265 |
| 250 pending_show_notification_requests_.Remove(request_id); | 266 pending_show_notification_requests_.Remove(request_id); |
| 251 } | 267 } |
| 252 | 268 |
| 253 void NotificationManager::OnDidClose(int notification_id) { | 269 void NotificationManager::OnDidClose(int notification_id) { |
| 254 const auto& iter = active_page_notifications_.find(notification_id); | 270 const auto& iter = active_page_notifications_.find(notification_id); |
| 255 if (iter == active_page_notifications_.end()) | 271 if (iter == active_page_notifications_.end()) |
| 256 return; | 272 return; |
| 257 | 273 |
| 258 iter->second->dispatchCloseEvent(); | 274 iter->second.delegate->dispatchCloseEvent(); |
| 275 |
| 259 active_page_notifications_.erase(iter); | 276 active_page_notifications_.erase(iter); |
| 260 } | 277 } |
| 261 | 278 |
| 262 void NotificationManager::OnDidClick(int notification_id) { | 279 void NotificationManager::OnDidClick(int notification_id) { |
| 263 const auto& iter = active_page_notifications_.find(notification_id); | 280 const auto& iter = active_page_notifications_.find(notification_id); |
| 264 if (iter == active_page_notifications_.end()) | 281 if (iter == active_page_notifications_.end()) |
| 265 return; | 282 return; |
| 266 | 283 |
| 267 iter->second->dispatchClickEvent(); | 284 iter->second.delegate->dispatchClickEvent(); |
| 268 } | 285 } |
| 269 | 286 |
| 270 void NotificationManager::OnDidGetNotifications( | 287 void NotificationManager::OnDidGetNotifications( |
| 271 int request_id, | 288 int request_id, |
| 272 const std::vector<PersistentNotificationInfo>& notification_infos) { | 289 const std::vector<PersistentNotificationInfo>& notification_infos) { |
| 273 blink::WebNotificationGetCallbacks* callbacks = | 290 blink::WebNotificationGetCallbacks* callbacks = |
| 274 pending_get_notification_requests_.Lookup(request_id); | 291 pending_get_notification_requests_.Lookup(request_id); |
| 275 DCHECK(callbacks); | 292 DCHECK(callbacks); |
| 276 if (!callbacks) | 293 if (!callbacks) |
| 277 return; | 294 return; |
| 278 | 295 |
| 279 blink::WebVector<blink::WebPersistentNotificationInfo> notifications( | 296 blink::WebVector<blink::WebPersistentNotificationInfo> notifications( |
| 280 notification_infos.size()); | 297 notification_infos.size()); |
| 281 | 298 |
| 282 for (size_t i = 0; i < notification_infos.size(); ++i) { | 299 for (size_t i = 0; i < notification_infos.size(); ++i) { |
| 283 blink::WebPersistentNotificationInfo web_notification_info; | 300 blink::WebPersistentNotificationInfo web_notification_info; |
| 284 web_notification_info.persistentId = notification_infos[i].first; | 301 web_notification_info.notificationId = |
| 302 blink::WebString::fromUTF8(notification_infos[i].first); |
| 285 web_notification_info.data = | 303 web_notification_info.data = |
| 286 ToWebNotificationData(notification_infos[i].second); | 304 ToWebNotificationData(notification_infos[i].second); |
| 287 | 305 |
| 288 notifications[i] = web_notification_info; | 306 notifications[i] = web_notification_info; |
| 289 } | 307 } |
| 290 | 308 |
| 291 callbacks->onSuccess(notifications); | 309 callbacks->onSuccess(notifications); |
| 292 | 310 |
| 293 pending_get_notification_requests_.Remove(request_id); | 311 pending_get_notification_requests_.Remove(request_id); |
| 294 } | 312 } |
| 295 | 313 |
| 296 } // namespace content | 314 } // namespace content |
| OLD | NEW |