| OLD | NEW |
| 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 <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" | 48 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" |
| 49 #include "chrome/browser/chromeos/settings/cros_settings.h" | 49 #include "chrome/browser/chromeos/settings/cros_settings.h" |
| 50 #include "chrome/browser/chromeos/settings/device_settings_service.h" | 50 #include "chrome/browser/chromeos/settings/device_settings_service.h" |
| 51 #endif | 51 #endif |
| 52 | 52 |
| 53 using content::NotificationResources; | 53 using content::NotificationResources; |
| 54 using content::PlatformNotificationData; | 54 using content::PlatformNotificationData; |
| 55 | 55 |
| 56 namespace { | 56 namespace { |
| 57 | 57 |
| 58 const char kNotificationId[] = "my-notification-id"; | 58 const char kPersistentNotificationId[] = "p:my-notification-id"; |
| 59 const char kNonPersistentNotificationId[] = "n:my-notification-id"; |
| 59 const int kNotificationVibrationPattern[] = { 100, 200, 300 }; | 60 const int kNotificationVibrationPattern[] = { 100, 200, 300 }; |
| 60 | 61 |
| 61 class MockDesktopNotificationDelegate | 62 class MockDesktopNotificationDelegate |
| 62 : public content::DesktopNotificationDelegate { | 63 : public content::DesktopNotificationDelegate { |
| 63 public: | 64 public: |
| 64 MockDesktopNotificationDelegate() | 65 MockDesktopNotificationDelegate() |
| 65 : displayed_(false), | 66 : displayed_(false), |
| 66 clicked_(false) {} | 67 clicked_(false) {} |
| 67 | 68 |
| 68 ~MockDesktopNotificationDelegate() override {} | 69 ~MockDesktopNotificationDelegate() override {} |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 // The close closure may be specified if so desired. | 120 // The close closure may be specified if so desired. |
| 120 MockDesktopNotificationDelegate* CreateSimplePageNotificationWithCloseClosure( | 121 MockDesktopNotificationDelegate* CreateSimplePageNotificationWithCloseClosure( |
| 121 base::Closure* close_closure) const { | 122 base::Closure* close_closure) const { |
| 122 PlatformNotificationData notification_data; | 123 PlatformNotificationData notification_data; |
| 123 notification_data.title = base::ASCIIToUTF16("My Notification"); | 124 notification_data.title = base::ASCIIToUTF16("My Notification"); |
| 124 notification_data.body = base::ASCIIToUTF16("Hello, world!"); | 125 notification_data.body = base::ASCIIToUTF16("Hello, world!"); |
| 125 | 126 |
| 126 MockDesktopNotificationDelegate* delegate = | 127 MockDesktopNotificationDelegate* delegate = |
| 127 new MockDesktopNotificationDelegate(); | 128 new MockDesktopNotificationDelegate(); |
| 128 | 129 |
| 129 service()->DisplayNotification(profile(), kNotificationId, | 130 service()->DisplayNotification(profile(), kNonPersistentNotificationId, |
| 130 GURL("https://chrome.com/"), | 131 GURL("https://chrome.com/"), |
| 131 notification_data, NotificationResources(), | 132 notification_data, NotificationResources(), |
| 132 base::WrapUnique(delegate), close_closure); | 133 base::WrapUnique(delegate), close_closure); |
| 133 | 134 |
| 134 return delegate; | 135 return delegate; |
| 135 } | 136 } |
| 136 | 137 |
| 137 // Returns the Platform Notification Service these unit tests are for. | 138 // Returns the Platform Notification Service these unit tests are for. |
| 138 PlatformNotificationServiceImpl* service() const { | 139 PlatformNotificationServiceImpl* service() const { |
| 139 return PlatformNotificationServiceImpl::GetInstance(); | 140 return PlatformNotificationServiceImpl::GetInstance(); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 // Note that we cannot verify whether the closed event was called on the | 191 // Note that we cannot verify whether the closed event was called on the |
| 191 // delegate given that it'd result in a use-after-free. | 192 // delegate given that it'd result in a use-after-free. |
| 192 } | 193 } |
| 193 | 194 |
| 194 TEST_F(PlatformNotificationServiceTest, PersistentNotificationDisplay) { | 195 TEST_F(PlatformNotificationServiceTest, PersistentNotificationDisplay) { |
| 195 PlatformNotificationData notification_data; | 196 PlatformNotificationData notification_data; |
| 196 notification_data.title = base::ASCIIToUTF16("My notification's title"); | 197 notification_data.title = base::ASCIIToUTF16("My notification's title"); |
| 197 notification_data.body = base::ASCIIToUTF16("Hello, world!"); | 198 notification_data.body = base::ASCIIToUTF16("Hello, world!"); |
| 198 | 199 |
| 199 service()->DisplayPersistentNotification( | 200 service()->DisplayPersistentNotification( |
| 200 profile(), kNotificationId, GURL() /* service_worker_scope */, | 201 profile(), kPersistentNotificationId, GURL() /* service_worker_scope */, |
| 201 GURL("https://chrome.com/"), notification_data, NotificationResources()); | 202 GURL("https://chrome.com/"), notification_data, NotificationResources()); |
| 202 | 203 |
| 203 ASSERT_EQ(1u, GetNotificationCount()); | 204 ASSERT_EQ(1u, GetNotificationCount()); |
| 204 | 205 |
| 205 Notification notification = GetDisplayedNotification(); | 206 Notification notification = GetDisplayedNotification(); |
| 206 EXPECT_EQ("https://chrome.com/", notification.origin_url().spec()); | 207 EXPECT_EQ("https://chrome.com/", notification.origin_url().spec()); |
| 207 EXPECT_EQ("My notification's title", | 208 EXPECT_EQ("My notification's title", |
| 208 base::UTF16ToUTF8(notification.title())); | 209 base::UTF16ToUTF8(notification.title())); |
| 209 EXPECT_EQ("Hello, world!", | 210 EXPECT_EQ("Hello, world!", |
| 210 base::UTF16ToUTF8(notification.message())); | 211 base::UTF16ToUTF8(notification.message())); |
| 211 | 212 |
| 212 service()->ClosePersistentNotification(profile(), kNotificationId); | 213 service()->ClosePersistentNotification(profile(), kPersistentNotificationId); |
| 213 EXPECT_EQ(0u, GetNotificationCount()); | 214 EXPECT_EQ(0u, GetNotificationCount()); |
| 214 } | 215 } |
| 215 | 216 |
| 216 TEST_F(PlatformNotificationServiceTest, DisplayPageNotificationMatches) { | 217 TEST_F(PlatformNotificationServiceTest, DisplayPageNotificationMatches) { |
| 217 std::vector<int> vibration_pattern( | 218 std::vector<int> vibration_pattern( |
| 218 kNotificationVibrationPattern, | 219 kNotificationVibrationPattern, |
| 219 kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern)); | 220 kNotificationVibrationPattern + arraysize(kNotificationVibrationPattern)); |
| 220 | 221 |
| 221 PlatformNotificationData notification_data; | 222 PlatformNotificationData notification_data; |
| 222 notification_data.title = base::ASCIIToUTF16("My notification's title"); | 223 notification_data.title = base::ASCIIToUTF16("My notification's title"); |
| 223 notification_data.body = base::ASCIIToUTF16("Hello, world!"); | 224 notification_data.body = base::ASCIIToUTF16("Hello, world!"); |
| 224 notification_data.vibration_pattern = vibration_pattern; | 225 notification_data.vibration_pattern = vibration_pattern; |
| 225 notification_data.silent = true; | 226 notification_data.silent = true; |
| 226 | 227 |
| 227 MockDesktopNotificationDelegate* delegate | 228 MockDesktopNotificationDelegate* delegate |
| 228 = new MockDesktopNotificationDelegate(); | 229 = new MockDesktopNotificationDelegate(); |
| 229 service()->DisplayNotification(profile(), kNotificationId, | 230 service()->DisplayNotification(profile(), kNonPersistentNotificationId, |
| 230 GURL("https://chrome.com/"), notification_data, | 231 GURL("https://chrome.com/"), notification_data, |
| 231 NotificationResources(), | 232 NotificationResources(), |
| 232 base::WrapUnique(delegate), nullptr); | 233 base::WrapUnique(delegate), nullptr); |
| 233 | 234 |
| 234 ASSERT_EQ(1u, GetNotificationCount()); | 235 ASSERT_EQ(1u, GetNotificationCount()); |
| 235 | 236 |
| 236 Notification notification = GetDisplayedNotification(); | 237 Notification notification = GetDisplayedNotification(); |
| 237 EXPECT_EQ("https://chrome.com/", notification.origin_url().spec()); | 238 EXPECT_EQ("https://chrome.com/", notification.origin_url().spec()); |
| 238 EXPECT_EQ("My notification's title", | 239 EXPECT_EQ("My notification's title", |
| 239 base::UTF16ToUTF8(notification.title())); | 240 base::UTF16ToUTF8(notification.title())); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 261 content::PLATFORM_NOTIFICATION_ACTION_TYPE_BUTTON; | 262 content::PLATFORM_NOTIFICATION_ACTION_TYPE_BUTTON; |
| 262 notification_data.actions[0].title = base::ASCIIToUTF16("Button 1"); | 263 notification_data.actions[0].title = base::ASCIIToUTF16("Button 1"); |
| 263 notification_data.actions[1].type = | 264 notification_data.actions[1].type = |
| 264 content::PLATFORM_NOTIFICATION_ACTION_TYPE_TEXT; | 265 content::PLATFORM_NOTIFICATION_ACTION_TYPE_TEXT; |
| 265 notification_data.actions[1].title = base::ASCIIToUTF16("Button 2"); | 266 notification_data.actions[1].title = base::ASCIIToUTF16("Button 2"); |
| 266 | 267 |
| 267 NotificationResources notification_resources; | 268 NotificationResources notification_resources; |
| 268 notification_resources.action_icons.resize(notification_data.actions.size()); | 269 notification_resources.action_icons.resize(notification_data.actions.size()); |
| 269 | 270 |
| 270 service()->DisplayPersistentNotification( | 271 service()->DisplayPersistentNotification( |
| 271 profile(), kNotificationId, GURL() /* service_worker_scope */, | 272 profile(), kPersistentNotificationId, GURL() /* service_worker_scope */, |
| 272 GURL("https://chrome.com/"), notification_data, notification_resources); | 273 GURL("https://chrome.com/"), notification_data, notification_resources); |
| 273 | 274 |
| 274 ASSERT_EQ(1u, GetNotificationCount()); | 275 ASSERT_EQ(1u, GetNotificationCount()); |
| 275 | 276 |
| 276 Notification notification = GetDisplayedNotification(); | 277 Notification notification = GetDisplayedNotification(); |
| 277 EXPECT_EQ("https://chrome.com/", notification.origin_url().spec()); | 278 EXPECT_EQ("https://chrome.com/", notification.origin_url().spec()); |
| 278 EXPECT_EQ("My notification's title", base::UTF16ToUTF8(notification.title())); | 279 EXPECT_EQ("My notification's title", base::UTF16ToUTF8(notification.title())); |
| 279 EXPECT_EQ("Hello, world!", base::UTF16ToUTF8(notification.message())); | 280 EXPECT_EQ("Hello, world!", base::UTF16ToUTF8(notification.message())); |
| 280 | 281 |
| 281 EXPECT_THAT(notification.vibration_pattern(), | 282 EXPECT_THAT(notification.vibration_pattern(), |
| (...skipping 19 matching lines...) Expand all Loading... |
| 301 | 302 |
| 302 base::Time after_page_notification = | 303 base::Time after_page_notification = |
| 303 HostContentSettingsMapFactory::GetForProfile(profile())->GetLastUsage( | 304 HostContentSettingsMapFactory::GetForProfile(profile())->GetLastUsage( |
| 304 origin, origin, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); | 305 origin, origin, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); |
| 305 EXPECT_GT(after_page_notification, begin_time); | 306 EXPECT_GT(after_page_notification, begin_time); |
| 306 | 307 |
| 307 // Ensure that there is at least some time between the two calls. | 308 // Ensure that there is at least some time between the two calls. |
| 308 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); | 309 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(1)); |
| 309 | 310 |
| 310 service()->DisplayPersistentNotification( | 311 service()->DisplayPersistentNotification( |
| 311 profile(), kNotificationId, GURL() /* service_worker_scope */, origin, | 312 profile(), kPersistentNotificationId, GURL() /* service_worker_scope */, |
| 312 PlatformNotificationData(), NotificationResources()); | 313 origin, PlatformNotificationData(), NotificationResources()); |
| 313 | 314 |
| 314 base::Time after_persistent_notification = | 315 base::Time after_persistent_notification = |
| 315 HostContentSettingsMapFactory::GetForProfile(profile())->GetLastUsage( | 316 HostContentSettingsMapFactory::GetForProfile(profile())->GetLastUsage( |
| 316 origin, origin, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); | 317 origin, origin, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); |
| 317 EXPECT_GT(after_persistent_notification, after_page_notification); | 318 EXPECT_GT(after_persistent_notification, after_page_notification); |
| 318 } | 319 } |
| 319 | 320 |
| 320 #if BUILDFLAG(ENABLE_EXTENSIONS) | 321 #if BUILDFLAG(ENABLE_EXTENSIONS) |
| 321 | 322 |
| 322 TEST_F(PlatformNotificationServiceTest, DisplayNameForContextMessage) { | 323 TEST_F(PlatformNotificationServiceTest, DisplayNameForContextMessage) { |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 notification = service()->CreateNotificationFromData( | 436 notification = service()->CreateNotificationFromData( |
| 436 profile(), | 437 profile(), |
| 437 GURL() /* service_worker_scope */, | 438 GURL() /* service_worker_scope */, |
| 438 GURL("chrome-extension://honijodknafkokifofgiaalefdiedpko/main.html"), | 439 GURL("chrome-extension://honijodknafkokifofgiaalefdiedpko/main.html"), |
| 439 notification_data, NotificationResources(), | 440 notification_data, NotificationResources(), |
| 440 new MockNotificationDelegate("hello")); | 441 new MockNotificationDelegate("hello")); |
| 441 EXPECT_EQ("NotificationTest", | 442 EXPECT_EQ("NotificationTest", |
| 442 base::UTF16ToUTF8(notification.context_message())); | 443 base::UTF16ToUTF8(notification.context_message())); |
| 443 } | 444 } |
| 444 | 445 |
| 446 TEST_F(PlatformNotificationServiceTest, GetDisplayedPersistentNotifications) { |
| 447 PlatformNotificationData notification_data; |
| 448 notification_data.title = |
| 449 base::ASCIIToUTF16("Non Persistent notification's title"); |
| 450 notification_data.body = base::ASCIIToUTF16("Hello, world!"); |
| 451 |
| 452 MockDesktopNotificationDelegate* delegate = |
| 453 new MockDesktopNotificationDelegate(); |
| 454 service()->DisplayNotification(profile(), kNonPersistentNotificationId, |
| 455 GURL("https://chrome.com/"), notification_data, |
| 456 NotificationResources(), |
| 457 base::WrapUnique(delegate), nullptr); |
| 458 |
| 459 notification_data.title = |
| 460 base::ASCIIToUTF16("Persistent notification's title"); |
| 461 service()->DisplayPersistentNotification( |
| 462 profile(), kPersistentNotificationId, GURL() /* service_worker_scope */, |
| 463 GURL("https://chrome.com/"), notification_data, NotificationResources()); |
| 464 ASSERT_EQ(2u, GetNotificationCount()); |
| 465 |
| 466 std::set<std::string> displayed_notifications; |
| 467 ASSERT_TRUE(service()->GetDisplayedPersistentNotifications( |
| 468 profile(), &displayed_notifications)); |
| 469 EXPECT_EQ(1u, displayed_notifications.size()); |
| 470 } |
| 471 |
| 445 #endif // BUILDFLAG(ENABLE_EXTENSIONS) | 472 #endif // BUILDFLAG(ENABLE_EXTENSIONS) |
| OLD | NEW |