Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / content / renderer / active_notification_tracker.cc
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
11 using blink::WebNotification;
12
13 namespace content {
14
15 ActiveNotificationTracker::ActiveNotificationTracker() {}
16
17 ActiveNotificationTracker::~ActiveNotificationTracker() {}
18
19 bool ActiveNotificationTracker::GetId(
20     const WebNotification& notification, int& id) {
21   ReverseTable::iterator iter = reverse_notification_table_.find(notification);
22   if (iter == reverse_notification_table_.end())
23     return false;
24   id = iter->second;
25   return true;
26 }
27
28 bool ActiveNotificationTracker::GetNotification(
29     int id, WebNotification* notification) {
30   WebNotification* lookup = notification_table_.Lookup(id);
31   if (!lookup)
32     return false;
33
34   *notification = *lookup;
35   return true;
36 }
37
38 int ActiveNotificationTracker::RegisterNotification(
39     const blink::WebNotification& proxy) {
40   if (reverse_notification_table_.find(proxy)
41       != reverse_notification_table_.end()) {
42     return reverse_notification_table_[proxy];
43   } else {
44     WebNotification* notification = new WebNotification(proxy);
45     int id = notification_table_.Add(notification);
46     reverse_notification_table_[proxy] = id;
47     return id;
48   }
49 }
50
51 void ActiveNotificationTracker::UnregisterNotification(int id) {
52   // We want to free the notification after removing it from the table.
53   scoped_ptr<WebNotification> notification(notification_table_.Lookup(id));
54   notification_table_.Remove(id);
55   DCHECK(notification.get());
56   if (notification)
57     reverse_notification_table_.erase(*notification);
58 }
59
60 void ActiveNotificationTracker::Clear() {
61   while (!reverse_notification_table_.empty()) {
62     ReverseTable::iterator iter = reverse_notification_table_.begin();
63     UnregisterNotification((*iter).second);
64   }
65 }
66
67 }  // namespace content