Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(175)

Side by Side Diff: content/shell/browser/layout_test/layout_test_notification_manager.cc

Issue 1116693002: [NOT FOR REVIEW] Significantly simplify the PlatformNotificationService //content API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/shell/browser/layout_test/layout_test_notification_manager.h" 5 #include "content/shell/browser/layout_test/layout_test_notification_manager.h"
6 6
7 #include "base/guid.h" 7 #include "base/guid.h"
8 #include "base/strings/utf_string_conversions.h" 8 #include "base/strings/utf_string_conversions.h"
9 #include "content/public/browser/browser_thread.h" 9 #include "content/public/browser/browser_thread.h"
10 #include "content/public/browser/desktop_notification_delegate.h" 10 #include "content/public/browser/desktop_notification_delegate.h"
11 #include "content/public/browser/notification_event_dispatcher.h" 11 #include "content/public/browser/notification_event_dispatcher.h"
12 #include "content/public/browser/permission_type.h" 12 #include "content/public/browser/permission_type.h"
13 #include "content/public/common/persistent_notification_status.h" 13 #include "content/public/common/persistent_notification_status.h"
14 #include "content/public/common/platform_notification_data.h" 14 #include "content/public/common/platform_notification_data.h"
15 #include "content/shell/browser/layout_test/layout_test_browser_context.h" 15 #include "content/shell/browser/layout_test/layout_test_browser_context.h"
16 #include "content/shell/browser/layout_test/layout_test_content_browser_client.h " 16 #include "content/shell/browser/layout_test/layout_test_content_browser_client.h "
17 #include "content/shell/browser/layout_test/layout_test_permission_manager.h" 17 #include "content/shell/browser/layout_test/layout_test_permission_manager.h"
18 18
19 using message_center::Notification;
20
19 namespace content { 21 namespace content {
20 namespace { 22 namespace {
21 23
22 // The Web Notification layout tests don't care about the lifetime of the
23 // Service Worker when a notificationclick event has been dispatched.
24 void OnEventDispatchComplete(PersistentNotificationStatus status) {}
25
26 blink::WebNotificationPermission ToWebNotificationPermission( 24 blink::WebNotificationPermission ToWebNotificationPermission(
27 PermissionStatus status) { 25 PermissionStatus status) {
28 switch (status) { 26 switch (status) {
29 case PERMISSION_STATUS_GRANTED: 27 case PERMISSION_STATUS_GRANTED:
30 return blink::WebNotificationPermissionAllowed; 28 return blink::WebNotificationPermissionAllowed;
31 case PERMISSION_STATUS_DENIED: 29 case PERMISSION_STATUS_DENIED:
32 return blink::WebNotificationPermissionDenied; 30 return blink::WebNotificationPermissionDenied;
33 case PERMISSION_STATUS_ASK: 31 case PERMISSION_STATUS_ASK:
34 return blink::WebNotificationPermissionDefault; 32 return blink::WebNotificationPermissionDefault;
35 } 33 }
36 34
37 NOTREACHED(); 35 NOTREACHED();
38 return blink::WebNotificationPermissionLast; 36 return blink::WebNotificationPermissionLast;
39 } 37 }
40 38
41 } // namespace 39 } // namespace
42 40
43 LayoutTestNotificationManager::LayoutTestNotificationManager() 41 LayoutTestNotificationManager::LayoutTestNotificationManager() {}
44 : weak_factory_(this) {}
45 42
46 LayoutTestNotificationManager::~LayoutTestNotificationManager() {} 43 LayoutTestNotificationManager::~LayoutTestNotificationManager() {}
47 44
48 void LayoutTestNotificationManager::DisplayNotification( 45 void LayoutTestNotificationManager::DisplayNotification(
49 BrowserContext* browser_context, 46 BrowserContext* browser_context,
50 const GURL& origin, 47 const Notification& notification) {
51 const SkBitmap& icon,
52 const PlatformNotificationData& notification_data,
53 scoped_ptr<DesktopNotificationDelegate> delegate,
54 base::Closure* cancel_callback) {
55 DCHECK_CURRENTLY_ON(BrowserThread::UI); 48 DCHECK_CURRENTLY_ON(BrowserThread::UI);
56 std::string title = base::UTF16ToUTF8(notification_data.title);
57 49
58 DCHECK(cancel_callback); 50 const std::string& notification_id = notification.id();
59 *cancel_callback = base::Bind(&LayoutTestNotificationManager::Close,
60 weak_factory_.GetWeakPtr(),
61 title);
62 51
63 ReplaceNotificationIfNeeded(notification_data); 52 // Deterministic notification id generation allows us to simply check for
53 // notifications sharing an id with |notification| rather than having to
54 // consider the tag when closing to-be-replaced notifications.
55 if (notifications_.contains(notification_id))
56 CloseNotification(browser_context, notification_id);
64 57
65 page_notifications_[title] = delegate.release(); 58 // Makes sure that the |onshow| event fires for non-persistent notifications.
66 page_notifications_[title]->NotificationDisplayed(); 59 notification.delegate()->Display();
60
61 notifications_.add(notification_id,
62 make_scoped_ptr(new Notification(notification)));
67 } 63 }
68 64
69 void LayoutTestNotificationManager::DisplayPersistentNotification( 65 void LayoutTestNotificationManager::CloseNotification(
70 BrowserContext* browser_context, 66 BrowserContext* browser_context,
71 int64_t persistent_notification_id, 67 const std::string& notification_id) {
72 const GURL& origin, 68 Notification* notification = notifications_.get(notification_id);
73 const SkBitmap& icon, 69 if (!notification)
74 const PlatformNotificationData& notification_data) { 70 return;
75 DCHECK_CURRENTLY_ON(BrowserThread::UI);
76 std::string title = base::UTF16ToUTF8(notification_data.title);
77 71
78 ReplaceNotificationIfNeeded(notification_data); 72 // Makes sure that the |onclose| event fires for non-persistent notifications.
73 notification->delegate()->Close(false /* by_user */);
79 74
80 PersistentNotification notification; 75 notifications_.erase(notification_id);
81 notification.browser_context = browser_context;
82 notification.origin = origin;
83 notification.persistent_id = persistent_notification_id;
84
85 persistent_notifications_[title] = notification;
86 }
87
88 void LayoutTestNotificationManager::ClosePersistentNotification(
89 BrowserContext* browser_context,
90 int64_t persistent_notification_id) {
91 for (const auto& iter : persistent_notifications_) {
92 if (iter.second.persistent_id != persistent_notification_id)
93 continue;
94
95 persistent_notifications_.erase(iter.first);
96 return;
97 }
98 } 76 }
99 77
100 void LayoutTestNotificationManager::SimulateClick(const std::string& title) { 78 void LayoutTestNotificationManager::SimulateClick(const std::string& title) {
101 DCHECK_CURRENTLY_ON(BrowserThread::UI); 79 DCHECK_CURRENTLY_ON(BrowserThread::UI);
102 80
103 // First check for page-notifications with the given title. 81 base::string16 title16 = base::UTF8ToUTF16(title);
104 const auto& page_iterator = page_notifications_.find(title); 82 for (const auto& iter : notifications_) {
105 if (page_iterator != page_notifications_.end()) { 83 if (iter.second->title() != title16)
106 page_iterator->second->NotificationClick(); 84 continue;
107 return; 85
86 // Makes sure that the |onclick| event fires for non-persistent
87 // notifications, or the |onnotificationclick| event for persistent ones.
88 iter.second->delegate()->Click();
108 } 89 }
109
110 // Then check for persistent notifications with the given title.
111 const auto& persistent_iterator = persistent_notifications_.find(title);
112 if (persistent_iterator == persistent_notifications_.end())
113 return;
114
115 const PersistentNotification& notification = persistent_iterator->second;
116 content::NotificationEventDispatcher::GetInstance()
117 ->DispatchNotificationClickEvent(
118 notification.browser_context,
119 notification.persistent_id,
120 notification.origin,
121 base::Bind(&OnEventDispatchComplete));
122 } 90 }
123 91
124 blink::WebNotificationPermission 92 blink::WebNotificationPermission
125 LayoutTestNotificationManager::CheckPermissionOnUIThread( 93 LayoutTestNotificationManager::CheckPermissionOnUIThread(
126 BrowserContext* browser_context, 94 BrowserContext* browser_context,
127 const GURL& origin, 95 const GURL& origin,
128 int render_process_id) { 96 int render_process_id) {
129 DCHECK_CURRENTLY_ON(BrowserThread::UI); 97 DCHECK_CURRENTLY_ON(BrowserThread::UI);
130 return CheckPermission(origin); 98 return CheckPermission(origin);
131 } 99 }
132 100
133 blink::WebNotificationPermission 101 blink::WebNotificationPermission
134 LayoutTestNotificationManager::CheckPermissionOnIOThread( 102 LayoutTestNotificationManager::CheckPermissionOnIOThread(
135 ResourceContext* resource_context, 103 ResourceContext* resource_context,
136 const GURL& origin, 104 const GURL& origin,
137 int render_process_id) { 105 int render_process_id) {
138 DCHECK_CURRENTLY_ON(BrowserThread::IO); 106 DCHECK_CURRENTLY_ON(BrowserThread::IO);
139 return CheckPermission(origin); 107 return CheckPermission(origin);
140 } 108 }
141 109
142 void LayoutTestNotificationManager::Close(const std::string& title) {
143 DCHECK_CURRENTLY_ON(BrowserThread::UI);
144 auto iterator = page_notifications_.find(title);
145 if (iterator == page_notifications_.end())
146 return;
147
148 iterator->second->NotificationClosed();
149 }
150
151 void LayoutTestNotificationManager::ReplaceNotificationIfNeeded(
152 const PlatformNotificationData& notification_data) {
153 if (!notification_data.tag.length())
154 return;
155
156 std::string tag = notification_data.tag;
157 const auto& replace_iter = replacements_.find(tag);
158 if (replace_iter != replacements_.end()) {
159 const std::string& previous_title = replace_iter->second;
160
161 const auto& page_notification_iter =
162 page_notifications_.find(previous_title);
163 if (page_notification_iter != page_notifications_.end()) {
164 DesktopNotificationDelegate* previous_delegate =
165 page_notification_iter->second;
166
167 previous_delegate->NotificationClosed();
168
169 page_notifications_.erase(page_notification_iter);
170 delete previous_delegate;
171 }
172
173 const auto& persistent_notification_iter =
174 persistent_notifications_.find(previous_title);
175 if (persistent_notification_iter != persistent_notifications_.end())
176 persistent_notifications_.erase(persistent_notification_iter);
177 }
178
179 replacements_[tag] = base::UTF16ToUTF8(notification_data.title);
180 }
181
182 blink::WebNotificationPermission 110 blink::WebNotificationPermission
183 LayoutTestNotificationManager::CheckPermission(const GURL& origin) { 111 LayoutTestNotificationManager::CheckPermission(const GURL& origin) {
184 return ToWebNotificationPermission(LayoutTestContentBrowserClient::Get() 112 return ToWebNotificationPermission(LayoutTestContentBrowserClient::Get()
185 ->GetLayoutTestBrowserContext() 113 ->GetLayoutTestBrowserContext()
186 ->GetLayoutTestPermissionManager() 114 ->GetLayoutTestPermissionManager()
187 ->GetPermissionStatus(PermissionType::NOTIFICATIONS, 115 ->GetPermissionStatus(PermissionType::NOTIFICATIONS,
188 origin, 116 origin,
189 origin)); 117 origin));
190 } 118 }
191 119
192 } // namespace content 120 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698