Index: chrome/common/desktop_notifications/active_notification_tracker.cc |
diff --git a/chrome/common/desktop_notifications/active_notification_tracker.cc b/chrome/common/desktop_notifications/active_notification_tracker.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..230d76a257f84edcd5c60d50130b546863b7c0b2 |
--- /dev/null |
+++ b/chrome/common/desktop_notifications/active_notification_tracker.cc |
@@ -0,0 +1,69 @@ |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/common/desktop_notifications/active_notification_tracker.h" |
+ |
+#include "base/message_loop.h" |
+#include "webkit/api/public/WebNotification.h" |
+#include "webkit/api/public/WebNotificationPermissionCallback.h" |
+ |
+using WebKit::WebNotification; |
+using WebKit::WebNotificationPermissionCallback; |
+ |
+bool ActiveNotificationTracker::GetId( |
+ const WebNotification& notification, int& id) { |
+ DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI); |
+ ReverseTable::iterator iter = reverse_notification_table_.find(notification); |
+ if (iter == reverse_notification_table_.end()) |
+ return false; |
+ id = iter->second; |
+ return true; |
+} |
+ |
+bool ActiveNotificationTracker::GetNotification( |
+ int id, WebNotification* notification) { |
+ DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI); |
+ WebNotification* lookup = notification_table_.Lookup(id); |
+ if (!lookup) |
+ return false; |
+ |
+ *notification = *lookup; |
+ return true; |
+} |
+ |
+int ActiveNotificationTracker::RegisterNotification( |
+ const WebKit::WebNotification& proxy) { |
+ DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI); |
+ WebNotification* notification = new WebNotification(proxy); |
+ int id = notification_table_.Add(notification); |
+ reverse_notification_table_[proxy] = id; |
+ return id; |
+} |
+ |
+void ActiveNotificationTracker::UnregisterNotification(int id) { |
+ DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI); |
+ // We want to free the notification after removing it from the table. |
+ scoped_ptr<WebNotification> notification(notification_table_.Lookup(id)); |
+ notification_table_.Remove(id); |
+ DCHECK(notification.get()); |
+ if (notification.get()) |
+ reverse_notification_table_.erase(*notification); |
+} |
+ |
+WebNotificationPermissionCallback* ActiveNotificationTracker::GetCallback( |
+ int id) { |
+ DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI); |
+ return callback_table_.Lookup(id); |
+} |
+ |
+int ActiveNotificationTracker::RegisterPermissionRequest( |
+ WebNotificationPermissionCallback* callback) { |
+ DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI); |
+ return callback_table_.Add(callback); |
+} |
+ |
+void ActiveNotificationTracker::OnPermissionRequestComplete(int id) { |
+ DCHECK(MessageLoop::current()->type() == MessageLoop::TYPE_UI); |
+ callback_table_.Remove(id); |
+} |