OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 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 "chrome/browser/notifications/desktop_notification_service.h" | 5 #include "chrome/browser/notifications/desktop_notification_service.h" |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/synchronization/waitable_event.h" | 9 #include "base/synchronization/waitable_event.h" |
10 #include "chrome/browser/content_settings/host_content_settings_map.h" | |
11 #include "chrome/browser/notifications/desktop_notification_service_factory.h" | 10 #include "chrome/browser/notifications/desktop_notification_service_factory.h" |
| 11 #include "chrome/browser/notifications/notifications_prefs_cache.h" |
| 12 #include "chrome/browser/prefs/pref_service.h" |
| 13 #include "chrome/browser/prefs/scoped_user_pref_update.h" |
| 14 #include "chrome/common/pref_names.h" |
12 #include "chrome/test/base/testing_profile.h" | 15 #include "chrome/test/base/testing_profile.h" |
13 #include "content/browser/browser_thread.h" | 16 #include "content/browser/browser_thread.h" |
14 #include "content/browser/renderer_host/test_render_view_host.h" | 17 #include "content/browser/renderer_host/test_render_view_host.h" |
| 18 #include "grit/generated_resources.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
16 #include "third_party/WebKit/Source/WebKit/chromium/public/WebNotificationPresen
ter.h" | 20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebNotificationPresen
ter.h" |
17 | 21 |
18 namespace { | 22 namespace { |
19 | 23 |
20 // The HasPermission method of the DesktopNotificationService wants to be called | 24 // NotificationsPrefsCache wants to be called on the IO thread. This class |
21 // on the IO thread. This class routes calls to the cache on the IO thread. | 25 // routes calls to the cache on the IO thread. |
22 class ThreadProxy : public base::RefCountedThreadSafe<ThreadProxy> { | 26 class ThreadProxy : public base::RefCountedThreadSafe<ThreadProxy> { |
23 public: | 27 public: |
24 ThreadProxy() | 28 ThreadProxy() |
25 : io_event_(false, false), | 29 : io_event_(false, false), |
26 ui_event_(false, false), | 30 ui_event_(false, false), |
27 permission_(WebKit::WebNotificationPresenter::PermissionAllowed) { | 31 permission_(0) { |
28 // The current message loop was already initalized by the test superclass. | 32 // The current message loop was already initalized by the test superclass. |
29 ui_thread_.reset( | 33 ui_thread_.reset( |
30 new BrowserThread(BrowserThread::UI, MessageLoop::current())); | 34 new BrowserThread(BrowserThread::UI, MessageLoop::current())); |
31 | 35 |
32 // Create IO thread, start its message loop. | 36 // Create IO thread, start its message loop. |
33 io_thread_.reset(new BrowserThread(BrowserThread::IO)); | 37 io_thread_.reset(new BrowserThread(BrowserThread::IO)); |
34 io_thread_->Start(); | 38 io_thread_->Start(); |
35 | 39 |
36 // Calling PauseIOThread() here isn't safe, because the runnable method | 40 // Calling PauseIOThread() here isn't safe, because the runnable method |
37 // could complete before the constructor is done, deleting |this|. | 41 // could complete before the constructor is done, deleting |this|. |
38 } | 42 } |
39 | 43 |
40 // Call the HasPermission method of the DesktopNotificationService on the IO | 44 int CacheHasPermission(NotificationsPrefsCache* cache, const GURL& url) { |
41 // thread and returns the permission setting. | |
42 WebKit::WebNotificationPresenter::Permission ServiceHasPermission( | |
43 DesktopNotificationService* service, | |
44 const GURL& url) { | |
45 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 45 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
46 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 46 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
47 NewRunnableMethod(this, &ThreadProxy::ServiceHasPermissionIO, | 47 NewRunnableMethod(this, &ThreadProxy::CacheHasPermissionIO, |
48 service, url)); | 48 make_scoped_refptr(cache), url)); |
49 io_event_.Signal(); | 49 io_event_.Signal(); |
50 ui_event_.Wait(); // Wait for IO thread to be done. | 50 ui_event_.Wait(); // Wait for IO thread to be done. |
51 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 51 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
52 NewRunnableMethod(this, &ThreadProxy::PauseIOThreadIO)); | 52 NewRunnableMethod(this, &ThreadProxy::PauseIOThreadIO)); |
53 | 53 |
54 return permission_; | 54 return permission_; |
55 } | 55 } |
56 | 56 |
57 void PauseIOThread() { | 57 void PauseIOThread() { |
58 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 58 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
(...skipping 10 matching lines...) Expand all Loading... |
69 friend class base::RefCountedThreadSafe<ThreadProxy>; | 69 friend class base::RefCountedThreadSafe<ThreadProxy>; |
70 ~ThreadProxy() { | 70 ~ThreadProxy() { |
71 DrainIOThread(); | 71 DrainIOThread(); |
72 } | 72 } |
73 | 73 |
74 void PauseIOThreadIO() { | 74 void PauseIOThreadIO() { |
75 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 75 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
76 io_event_.Wait(); | 76 io_event_.Wait(); |
77 } | 77 } |
78 | 78 |
79 void ServiceHasPermissionIO(DesktopNotificationService* service, | 79 void CacheHasPermissionIO(NotificationsPrefsCache* cache, const GURL& url) { |
80 const GURL& url) { | |
81 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 80 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
82 permission_ = service->HasPermission(url); | 81 permission_ = cache->HasPermission(url); |
83 ui_event_.Signal(); | 82 ui_event_.Signal(); |
84 } | 83 } |
85 | 84 |
86 base::WaitableEvent io_event_; | 85 base::WaitableEvent io_event_; |
87 base::WaitableEvent ui_event_; | 86 base::WaitableEvent ui_event_; |
88 scoped_ptr<BrowserThread> ui_thread_; | 87 scoped_ptr<BrowserThread> ui_thread_; |
89 scoped_ptr<BrowserThread> io_thread_; | 88 scoped_ptr<BrowserThread> io_thread_; |
90 | 89 |
91 WebKit::WebNotificationPresenter::Permission permission_; | 90 int permission_; |
92 }; | 91 }; |
93 | 92 |
94 } // namespace | |
95 | 93 |
96 class DesktopNotificationServiceTest : public RenderViewHostTestHarness { | 94 class DesktopNotificationServiceTest : public RenderViewHostTestHarness { |
97 public: | 95 public: |
98 DesktopNotificationServiceTest() { | 96 DesktopNotificationServiceTest() { |
99 } | 97 } |
100 | 98 |
101 virtual void SetUp() { | 99 virtual void SetUp() { |
102 RenderViewHostTestHarness::SetUp(); | 100 RenderViewHostTestHarness::SetUp(); |
103 proxy_ = new ThreadProxy; | 101 proxy_ = new ThreadProxy; |
104 proxy_->PauseIOThread(); | 102 proxy_->PauseIOThread(); |
105 | 103 |
106 // Creates the destop notification service. | 104 // Creates the service, calls InitPrefs() on it which loads data from the |
| 105 // profile into the cache and then puts the cache in io thread mode. |
107 service_ = DesktopNotificationServiceFactory::GetForProfile(profile()); | 106 service_ = DesktopNotificationServiceFactory::GetForProfile(profile()); |
| 107 cache_ = service_->prefs_cache(); |
108 } | 108 } |
109 | 109 |
110 virtual void TearDown() { | 110 virtual void TearDown() { |
111 // The io thread's waiting on the io_event_ might hold a ref to |proxy_|, | 111 // The io thread's waiting on the io_event_ might hold a ref to |proxy_|, |
112 // preventing its destruction. Clear that ref. | 112 // preventing its destruction. Clear that ref. |
113 proxy_->DrainIOThread(); | 113 proxy_->DrainIOThread(); |
114 RenderViewHostTestHarness::TearDown(); | 114 RenderViewHostTestHarness::TearDown(); |
115 } | 115 } |
116 | 116 |
117 DesktopNotificationService* service_; | 117 DesktopNotificationService* service_; |
| 118 NotificationsPrefsCache* cache_; |
118 scoped_refptr<ThreadProxy> proxy_; | 119 scoped_refptr<ThreadProxy> proxy_; |
119 }; | 120 }; |
120 | 121 |
| 122 TEST_F(DesktopNotificationServiceTest, DefaultContentSettingSentToCache) { |
| 123 // The default pref registered in DesktopNotificationService is "ask", |
| 124 // and that's what sent to the cache. |
| 125 EXPECT_EQ(CONTENT_SETTING_ASK, cache_->CachedDefaultContentSetting()); |
| 126 |
| 127 // Change the default content setting. This will post a task on the IO thread |
| 128 // to update the cache. |
| 129 service_->SetDefaultContentSetting(CONTENT_SETTING_BLOCK); |
| 130 |
| 131 // The updated pref shouldn't be sent to the cache immediately. |
| 132 EXPECT_EQ(CONTENT_SETTING_ASK, cache_->CachedDefaultContentSetting()); |
| 133 |
| 134 // Run IO thread tasks. |
| 135 proxy_->DrainIOThread(); |
| 136 |
| 137 // Now that IO thread events have been processed, it should be there. |
| 138 EXPECT_EQ(CONTENT_SETTING_BLOCK, cache_->CachedDefaultContentSetting()); |
| 139 } |
| 140 |
121 TEST_F(DesktopNotificationServiceTest, SettingsForSchemes) { | 141 TEST_F(DesktopNotificationServiceTest, SettingsForSchemes) { |
122 GURL url("file:///html/test.html"); | 142 GURL url("file:///html/test.html"); |
123 | 143 |
124 EXPECT_EQ(CONTENT_SETTING_ASK, | 144 EXPECT_EQ(CONTENT_SETTING_ASK, cache_->CachedDefaultContentSetting()); |
125 service_->GetDefaultContentSetting()); | |
126 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, | 145 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
127 proxy_->ServiceHasPermission(service_, url)); | 146 proxy_->CacheHasPermission(cache_, url)); |
128 | 147 |
129 service_->GrantPermission(url); | 148 service_->GrantPermission(url); |
130 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, | 149 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, |
131 proxy_->ServiceHasPermission(service_, url)); | 150 proxy_->CacheHasPermission(cache_, url)); |
132 | 151 |
133 service_->DenyPermission(url); | 152 service_->DenyPermission(url); |
134 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, | 153 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, |
135 proxy_->ServiceHasPermission(service_, url)); | 154 proxy_->CacheHasPermission(cache_, url)); |
136 | 155 |
137 GURL https_url("https://testurl"); | 156 GURL https_url("https://testurl"); |
138 GURL http_url("http://testurl"); | 157 GURL http_url("http://testurl"); |
139 EXPECT_EQ(CONTENT_SETTING_ASK, | 158 EXPECT_EQ(CONTENT_SETTING_ASK, cache_->CachedDefaultContentSetting()); |
140 service_->GetDefaultContentSetting()); | |
141 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, | 159 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
142 proxy_->ServiceHasPermission(service_, http_url)); | 160 proxy_->CacheHasPermission(cache_, http_url)); |
143 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, | 161 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
144 proxy_->ServiceHasPermission(service_, https_url)); | 162 proxy_->CacheHasPermission(cache_, https_url)); |
145 | 163 |
146 service_->GrantPermission(https_url); | 164 service_->GrantPermission(https_url); |
| 165 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, |
| 166 proxy_->CacheHasPermission(cache_, https_url)); |
147 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, | 167 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
148 proxy_->ServiceHasPermission(service_, http_url)); | 168 proxy_->CacheHasPermission(cache_, http_url)); |
149 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, | |
150 proxy_->ServiceHasPermission(service_, https_url)); | |
151 | 169 |
152 service_->DenyPermission(http_url); | 170 service_->DenyPermission(http_url); |
153 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, | 171 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, |
154 proxy_->ServiceHasPermission(service_, http_url)); | 172 proxy_->CacheHasPermission(cache_, http_url)); |
155 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, | 173 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, |
156 proxy_->ServiceHasPermission(service_, https_url)); | 174 proxy_->CacheHasPermission(cache_, https_url)); |
157 } | 175 } |
158 | 176 |
159 TEST_F(DesktopNotificationServiceTest, GetNotificationsSettings) { | 177 TEST_F(DesktopNotificationServiceTest, GrantPermissionSentToCache) { |
| 178 GURL url("http://allowed.com"); |
| 179 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
| 180 proxy_->CacheHasPermission(cache_, url)); |
| 181 |
| 182 service_->GrantPermission(url); |
| 183 |
| 184 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, |
| 185 proxy_->CacheHasPermission(cache_, url)); |
| 186 } |
| 187 |
| 188 TEST_F(DesktopNotificationServiceTest, DenyPermissionSentToCache) { |
| 189 GURL url("http://denied.com"); |
| 190 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
| 191 proxy_->CacheHasPermission(cache_, url)); |
| 192 |
| 193 service_->DenyPermission(url); |
| 194 |
| 195 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, |
| 196 proxy_->CacheHasPermission(cache_, url)); |
| 197 } |
| 198 |
| 199 TEST_F(DesktopNotificationServiceTest, PrefChangesSentToCache) { |
| 200 PrefService* prefs = profile()->GetPrefs(); |
| 201 |
| 202 { |
| 203 ListPrefUpdate update_allowed_origins( |
| 204 prefs, prefs::kDesktopNotificationAllowedOrigins); |
| 205 ListValue* allowed_origins = update_allowed_origins.Get(); |
| 206 allowed_origins->Append(new StringValue(GURL("http://allowed.com").spec())); |
| 207 } |
| 208 |
| 209 { |
| 210 ListPrefUpdate update_denied_origins( |
| 211 prefs, prefs::kDesktopNotificationDeniedOrigins); |
| 212 ListValue* denied_origins = update_denied_origins.Get(); |
| 213 denied_origins->Append(new StringValue(GURL("http://denied.com").spec())); |
| 214 } |
| 215 |
| 216 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, |
| 217 proxy_->CacheHasPermission(cache_, GURL("http://allowed.com"))); |
| 218 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, |
| 219 proxy_->CacheHasPermission(cache_, GURL("http://denied.com"))); |
| 220 } |
| 221 |
| 222 TEST_F(DesktopNotificationServiceTest, GetAllowedOrigins) { |
160 service_->GrantPermission(GURL("http://allowed2.com")); | 223 service_->GrantPermission(GURL("http://allowed2.com")); |
161 service_->GrantPermission(GURL("http://allowed.com")); | 224 service_->GrantPermission(GURL("http://allowed.com")); |
| 225 |
| 226 std::vector<GURL> allowed_origins(service_->GetAllowedOrigins()); |
| 227 ASSERT_EQ(2u, allowed_origins.size()); |
| 228 EXPECT_EQ(GURL("http://allowed2.com"), allowed_origins[0]); |
| 229 EXPECT_EQ(GURL("http://allowed.com"), allowed_origins[1]); |
| 230 } |
| 231 |
| 232 TEST_F(DesktopNotificationServiceTest, GetBlockedOrigins) { |
162 service_->DenyPermission(GURL("http://denied2.com")); | 233 service_->DenyPermission(GURL("http://denied2.com")); |
163 service_->DenyPermission(GURL("http://denied.com")); | 234 service_->DenyPermission(GURL("http://denied.com")); |
164 | 235 |
165 HostContentSettingsMap::SettingsForOneType settings; | 236 std::vector<GURL> denied_origins(service_->GetBlockedOrigins()); |
166 service_->GetNotificationsSettings(&settings); | 237 ASSERT_EQ(2u, denied_origins.size()); |
167 ASSERT_EQ(4u, settings.size()); | 238 EXPECT_EQ(GURL("http://denied2.com"), denied_origins[0]); |
| 239 EXPECT_EQ(GURL("http://denied.com"), denied_origins[1]); |
| 240 } |
168 | 241 |
169 EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard( | 242 TEST_F(DesktopNotificationServiceTest, ResetAllSentToCache) { |
170 GURL("http://allowed.com")), | 243 GURL allowed_url("http://allowed.com"); |
171 settings[0].a); | 244 service_->GrantPermission(allowed_url); |
172 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 245 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, |
173 settings[0].c); | 246 proxy_->CacheHasPermission(cache_, allowed_url)); |
174 EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard( | 247 GURL denied_url("http://denied.com"); |
175 GURL("http://allowed2.com")), | 248 service_->DenyPermission(denied_url); |
176 settings[1].a); | 249 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, |
177 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 250 proxy_->CacheHasPermission(cache_, denied_url)); |
178 settings[1].c); | 251 |
179 EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard( | 252 service_->ResetAllOrigins(); |
180 GURL("http://denied.com")), | 253 |
181 settings[2].a); | 254 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
182 EXPECT_EQ(CONTENT_SETTING_BLOCK, | 255 proxy_->CacheHasPermission(cache_, allowed_url)); |
183 settings[2].c); | 256 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
184 EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard( | 257 proxy_->CacheHasPermission(cache_, denied_url)); |
185 GURL("http://denied2.com")), | |
186 settings[3].a); | |
187 EXPECT_EQ(CONTENT_SETTING_BLOCK, | |
188 settings[3].c); | |
189 } | 258 } |
| 259 |
| 260 TEST_F(DesktopNotificationServiceTest, ResetAllowedSentToCache) { |
| 261 GURL allowed_url("http://allowed.com"); |
| 262 service_->GrantPermission(allowed_url); |
| 263 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionAllowed, |
| 264 proxy_->CacheHasPermission(cache_, allowed_url)); |
| 265 |
| 266 service_->ResetAllowedOrigin(allowed_url); |
| 267 |
| 268 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
| 269 proxy_->CacheHasPermission(cache_, allowed_url)); |
| 270 } |
| 271 |
| 272 TEST_F(DesktopNotificationServiceTest, ResetBlockedSentToCache) { |
| 273 GURL denied_url("http://denied.com"); |
| 274 service_->DenyPermission(denied_url); |
| 275 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionDenied, |
| 276 proxy_->CacheHasPermission(cache_, denied_url)); |
| 277 |
| 278 service_->ResetBlockedOrigin(denied_url); |
| 279 |
| 280 EXPECT_EQ(WebKit::WebNotificationPresenter::PermissionNotAllowed, |
| 281 proxy_->CacheHasPermission(cache_, denied_url)); |
| 282 } |
| 283 |
| 284 } // namespace |
OLD | NEW |