1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "content/renderer/active_notification_tracker.h" 6 7 #include "base/memory/scoped_ptr.h" 8 #include "base/message_loop/message_loop.h" 9 #include "third_party/WebKit/public/web/WebNotification.h" 10 #include "third_party/WebKit/public/web/WebNotificationPermissionCallback.h" 11 12 using blink::WebNotification; 13 using blink::WebNotificationPermissionCallback; 14 15 namespace content { 16 ActiveNotificationTracker()17ActiveNotificationTracker::ActiveNotificationTracker() {} 18 ~ActiveNotificationTracker()19ActiveNotificationTracker::~ActiveNotificationTracker() {} 20 GetId(const WebNotification & notification,int & id)21bool ActiveNotificationTracker::GetId( 22 const WebNotification& notification, int& id) { 23 ReverseTable::iterator iter = reverse_notification_table_.find(notification); 24 if (iter == reverse_notification_table_.end()) 25 return false; 26 id = iter->second; 27 return true; 28 } 29 GetNotification(int id,WebNotification * notification)30bool ActiveNotificationTracker::GetNotification( 31 int id, WebNotification* notification) { 32 WebNotification* lookup = notification_table_.Lookup(id); 33 if (!lookup) 34 return false; 35 36 *notification = *lookup; 37 return true; 38 } 39 RegisterNotification(const blink::WebNotification & proxy)40int ActiveNotificationTracker::RegisterNotification( 41 const blink::WebNotification& proxy) { 42 if (reverse_notification_table_.find(proxy) 43 != reverse_notification_table_.end()) { 44 return reverse_notification_table_[proxy]; 45 } else { 46 WebNotification* notification = new WebNotification(proxy); 47 int id = notification_table_.Add(notification); 48 reverse_notification_table_[proxy] = id; 49 return id; 50 } 51 } 52 UnregisterNotification(int id)53void ActiveNotificationTracker::UnregisterNotification(int id) { 54 // We want to free the notification after removing it from the table. 55 scoped_ptr<WebNotification> notification(notification_table_.Lookup(id)); 56 notification_table_.Remove(id); 57 DCHECK(notification.get()); 58 if (notification) 59 reverse_notification_table_.erase(*notification); 60 } 61 Clear()62void ActiveNotificationTracker::Clear() { 63 while (!reverse_notification_table_.empty()) { 64 ReverseTable::iterator iter = reverse_notification_table_.begin(); 65 UnregisterNotification((*iter).second); 66 } 67 } 68 GetCallback(int id)69WebNotificationPermissionCallback* ActiveNotificationTracker::GetCallback( 70 int id) { 71 return callback_table_.Lookup(id); 72 } 73 RegisterPermissionRequest(WebNotificationPermissionCallback * callback)74int ActiveNotificationTracker::RegisterPermissionRequest( 75 WebNotificationPermissionCallback* callback) { 76 return callback_table_.Add(callback); 77 } 78 OnPermissionRequestComplete(int id)79void ActiveNotificationTracker::OnPermissionRequestComplete(int id) { 80 callback_table_.Remove(id); 81 } 82 83 } // namespace content 84