Chromium Code Reviews| Index: chrome/browser/notifications/notification_browsertest.cc |
| diff --git a/chrome/browser/notifications/notification_browsertest.cc b/chrome/browser/notifications/notification_browsertest.cc |
| index 3a693da62ab1bc75aa4622195efb5b80c72b9247..92da7364c3155cf63ab0b9dec1bc46b24c128bb5 100644 |
| --- a/chrome/browser/notifications/notification_browsertest.cc |
| +++ b/chrome/browser/notifications/notification_browsertest.cc |
| @@ -2,25 +2,433 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <deque> |
| +#include <string> |
| + |
| +#include "base/bind.h" |
| +#include "base/callback.h" |
| +#include "base/compiler_specific.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/run_loop.h" |
| +#include "base/stringprintf.h" |
| +#include "base/utf_string_conversions.h" |
| +#include "chrome/browser/api/infobars/confirm_infobar_delegate.h" |
| +#include "chrome/browser/api/infobars/infobar_delegate.h" |
| +#include "chrome/browser/browser_process.h" |
| #include "chrome/browser/infobars/infobar_tab_helper.h" |
| +#include "chrome/browser/notifications/balloon.h" |
| +#include "chrome/browser/notifications/balloon_collection.h" |
| +#include "chrome/browser/notifications/balloon_host.h" |
| +#include "chrome/browser/notifications/desktop_notification_service.h" |
| +#include "chrome/browser/notifications/desktop_notification_service_factory.h" |
| +#include "chrome/browser/notifications/notification.h" |
| +#include "chrome/browser/notifications/notification_ui_manager.h" |
| +#include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/browser_tabstrip.h" |
| +#include "chrome/browser/ui/browser_window.h" |
| +#include "chrome/browser/ui/tab_contents/tab_contents.h" |
| +#include "chrome/common/chrome_notification_types.h" |
| +#include "chrome/common/content_settings.h" |
| +#include "chrome/common/content_settings_pattern.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| +#include "content/public/browser/notification_service.h" |
| +#include "content/public/browser/notification_source.h" |
| +#include "content/public/browser/notification_types.h" |
| +#include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/web_contents.h" |
| #include "content/public/test/browser_test_utils.h" |
| +#include "content/public/test/test_utils.h" |
| +#include "googleurl/src/gurl.h" |
| #include "net/base/net_util.h" |
| #include "net/test/test_server.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "webkit/glue/window_open_disposition.h" |
| + |
| +namespace { |
| + |
| +const char kExpectedIconUrl[] = "files/notifications/no_such_file.png"; |
| -class NotificationsPermissionTest : public InProcessBrowserTest { |
| +enum InfobarAction { |
| + DISMISS = 0, |
| + ALLOW, |
| + DENY, |
| +}; |
| + |
| +class NotificationBalloonChangeObserver : public content::NotificationObserver { |
| public: |
| - NotificationsPermissionTest() {} |
| + NotificationBalloonChangeObserver() |
| + : collection_( |
| + g_browser_process->notification_ui_manager()->balloon_collection()), |
| + collection_changed_(false), |
| + notification_received_(false), |
| + running_(false), |
| + done_(false) { |
| + registrar_.Add(this, chrome::NOTIFICATION_NOTIFY_BALLOON_CONNECTED, |
| + content::NotificationService::AllSources()); |
| + registrar_.Add(this, chrome::NOTIFICATION_NOTIFY_BALLOON_DISCONNECTED, |
| + content::NotificationService::AllSources()); |
| + collection_->set_on_collection_changed_callback( |
| + base::Bind(&NotificationBalloonChangeObserver::onCollectionChanged, |
| + base::Unretained(this))); |
| + } |
| + |
| + virtual ~NotificationBalloonChangeObserver() { |
| + collection_->set_on_collection_changed_callback(base::Closure()); |
| + } |
| + |
| + bool Wait() { |
| + if (!Check()) { |
| + running_ = true; |
| + message_loop_runner_ = new content::MessageLoopRunner; |
| + message_loop_runner_->Run(); |
| + EXPECT_TRUE(done_); |
| + } |
| + return done_; |
| + } |
| + |
| + bool Check() { |
|
stevenjb
2012/11/29 03:32:16
nit: 'if (done_) return true;' might be slightly m
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + if (!done_ && collection_changed_ && notification_received_) { |
| + done_ = true; |
| + if (running_) { |
| + message_loop_runner_->Quit(); |
| + running_ = false; |
| + } |
| + } |
| + return done_; |
| + } |
| + |
| + void onCollectionChanged() { |
|
stevenjb
2012/11/29 03:32:16
OnCollectionChanged()
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + collection_changed_ = true; |
| + Check(); |
| + } |
| + |
| + // Overridden from content::NotificationObserver: |
| + virtual void Observe(int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) OVERRIDE { |
|
stevenjb
2012/11/29 03:32:16
test that type == BALLOON_CONNECTED or BALLOON_DIS
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + notification_received_ = true; |
| + Check(); |
| + } |
| + |
| + private: |
| + content::NotificationRegistrar registrar_; |
| + BalloonCollection* collection_; |
| + |
| + bool collection_changed_; |
| + bool notification_received_; |
| + bool running_; |
| + bool done_; |
| + scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(NotificationBalloonChangeObserver); |
| }; |
| -// If this flakes, use http://crbug.com/62311 and http://crbug.com/74428. |
| -IN_PROC_BROWSER_TEST_F(NotificationsPermissionTest, TestUserGestureInfobar) { |
| +} // namespace |
| + |
| +class NotificationsTest : public InProcessBrowserTest { |
| + public: |
| + NotificationsTest() {} |
| + |
| + protected: |
| + // Overriden from InProcessBrowserTest: |
| + virtual void SetUpInProcessBrowserTestFixture() OVERRIDE; |
| + |
| + const std::deque<Balloon*>& GetActiveBalloons(); |
| + int GetNotificationCount(); |
| + |
| + bool CloseNotificationAndWait(const Notification& notification); |
| + void CloseBrowserWindow(Browser* browser); |
| + void CrashTab(Browser* browser, int index); |
| + void CrashNotification(Balloon* balloon); |
| + |
| + void SetDefaultPermissionSetting(ContentSetting setting); |
| + void DenyOrigin(const GURL& origin); |
| + void AllowOrigin(const GURL& origin); |
| + void AllowAllOrigins(); |
| + |
| + void VerifyInfobar(const Browser* browser, |
| + const std::string& origin, |
| + int index); |
| + std::string CreateNotification(Browser* browser, |
| + bool wait_for_new_balloon, |
| + const char* icon, |
| + const char* title, |
| + const char* body, |
| + const char* replace_id); |
| + std::string CreateSimpleNotification(Browser* browser, |
| + bool wait_for_new_balloon); |
| + bool RequestPermissionAndWait(Browser* browser); |
| + bool CancelNotification(const char* notification_id, Browser* browser); |
| + bool PerformActionOnInfobar(Browser* browser, |
| + InfobarAction action, |
| + int infobar_index, |
| + int tab_index); |
| + void GetPrefsByContentSetting(ContentSetting setting, |
| + ContentSettingsForOneType* settings); |
| + bool CheckOriginInSetting(const ContentSettingsForOneType& settings, |
| + const GURL& origin); |
| + |
| + GURL empty_page_url_; |
| + GURL test_page_url_; |
| + |
| + private: |
| + void DropOriginPreference(const GURL& origin); |
| + DesktopNotificationService* GetDesktopNotificationService(); |
| +}; |
| + |
| +void NotificationsTest::SetUpInProcessBrowserTestFixture() { |
| + InProcessBrowserTest::SetUpInProcessBrowserTestFixture(); |
| + |
| ASSERT_TRUE(test_server()->Start()); |
| + empty_page_url_ = test_server()->GetURL("files/empty.html"); |
| + test_page_url_ = test_server()->GetURL( |
| + "files/notifications/notification_tester.html"); |
| +} |
| + |
| +const std::deque<Balloon*>& NotificationsTest::GetActiveBalloons() { |
| + NotificationUIManager* manager = g_browser_process->notification_ui_manager(); |
| + return manager->balloon_collection()->GetActiveBalloons(); |
|
stevenjb
2012/11/29 03:32:16
nit: No need for local manager variable
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| +} |
| + |
| +int NotificationsTest::GetNotificationCount() { |
| + NotificationUIManager* manager = g_browser_process->notification_ui_manager(); |
| + return manager->balloon_collection()->GetActiveBalloons().size(); |
|
stevenjb
2012/11/29 03:32:16
nit: No need for local manager variable
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| +} |
| + |
| +bool NotificationsTest::CloseNotificationAndWait( |
| + const Notification& notification) { |
| + NotificationBalloonChangeObserver observer; |
| + NotificationUIManager* manager = g_browser_process->notification_ui_manager(); |
| + bool success = manager->CancelById(notification.notification_id()); |
|
stevenjb
2012/11/29 03:32:16
nit: No need for local manager variable
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + if (success) |
| + return observer.Wait(); |
| + return false; |
| +} |
| +void NotificationsTest::CloseBrowserWindow(Browser* browser) { |
| + content::WindowedNotificationObserver observer( |
| + chrome::NOTIFICATION_BROWSER_CLOSED, |
| + content::Source<Browser>(browser)); |
| + browser->window()->Close(); |
| + observer.Wait(); |
| +} |
| + |
| +void NotificationsTest::CrashTab(Browser* browser, int index) { |
| + content::CrashTab(chrome::GetWebContentsAt(browser, index)); |
| +} |
| + |
| +void NotificationsTest::CrashNotification(Balloon* balloon) { |
| + content::CrashTab(balloon->balloon_view()->GetHost()->web_contents()); |
| +} |
| + |
| +void NotificationsTest::SetDefaultPermissionSetting(ContentSetting setting) { |
| + DesktopNotificationService* service = GetDesktopNotificationService(); |
| + service->SetDefaultContentSetting(setting); |
| +} |
| + |
| +void NotificationsTest::DenyOrigin(const GURL& origin) { |
| + DropOriginPreference(origin); |
| + GetDesktopNotificationService()->DenyPermission(origin); |
| +} |
| + |
| +void NotificationsTest::AllowOrigin(const GURL& origin) { |
| + DropOriginPreference(origin); |
| + GetDesktopNotificationService()->GrantPermission(origin); |
| +} |
| + |
| +void NotificationsTest::AllowAllOrigins() { |
| + GetDesktopNotificationService()->ResetAllOrigins(); |
| + GetDesktopNotificationService()->SetDefaultContentSetting( |
| + CONTENT_SETTING_ALLOW); |
| +} |
| + |
| +void NotificationsTest::VerifyInfobar( |
| + const Browser* browser, |
| + const std::string& origin, |
| + int index) { |
| + InfoBarTabHelper* infobar_helper = InfoBarTabHelper::FromWebContents( |
| + chrome::GetWebContentsAt(browser, index)); |
| + |
| + ASSERT_EQ(1U, infobar_helper->GetInfoBarCount()); |
| + InfoBarDelegate* infobar = infobar_helper->GetInfoBarDelegateAt(0); |
| + ASSERT_TRUE(infobar->AsConfirmInfoBarDelegate()); |
|
stevenjb
2012/11/29 03:32:16
Move below as ASSERT_TRUE(confirm_infobar)
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + ConfirmInfoBarDelegate* confirm_infobar = infobar->AsConfirmInfoBarDelegate(); |
| + int buttons = confirm_infobar->GetButtons(); |
| + if (buttons & ConfirmInfoBarDelegate::BUTTON_OK) { |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Allow"), |
| + confirm_infobar->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_OK)); |
| + } else { |
| + EXPECT_TRUE(false); |
|
stevenjb
2012/11/29 03:32:16
This seems weird, I'd ask about a better way to do
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Removed the if-else block, just check the OK butto
|
| + } |
| + if (buttons & ConfirmInfoBarDelegate::BUTTON_CANCEL) { |
| + EXPECT_EQ( |
| + ASCIIToUTF16("Deny"), |
| + confirm_infobar->GetButtonLabel(ConfirmInfoBarDelegate::BUTTON_CANCEL)); |
| + } else { |
| + EXPECT_TRUE(false); |
|
stevenjb
2012/11/29 03:32:16
same here
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Removed the if-else block, just check the Cancel b
|
| + } |
| + std::string text = base::StringPrintf( |
| + "Allow %s to show desktop notifications?", |
| + origin.c_str()); |
|
stevenjb
2012/11/29 03:32:16
Is this translation dependent? Not sure how we do
chrisgao (Use stgao instead)
2012/11/29 22:49:31
After discussion with Ken, decided to remove the v
|
| + EXPECT_EQ(UTF8ToUTF16(text), confirm_infobar->GetMessageText()); |
| +} |
| + |
| +std::string NotificationsTest::CreateNotification( |
| + Browser* browser, |
| + bool wait_for_new_balloon, |
| + const char* icon, |
| + const char* title, |
| + const char* body, |
| + const char* replace_id) { |
| + std::string script = base::StringPrintf( |
| + "createNotification('%s', '%s', '%s', '%s');", |
| + icon, |
| + title, |
| + body, |
| + replace_id); |
|
stevenjb
2012/11/29 03:32:16
nit: no need for separate lines for the args?
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + |
| + NotificationBalloonChangeObserver observer; |
| + std::string result; |
| + bool success = content::ExecuteJavaScriptAndExtractString( |
| + chrome::GetActiveWebContents(browser)->GetRenderViewHost(), |
| + L"", |
| + UTF8ToWide(script), |
| + &result); |
| + if (success && result != "-1" && wait_for_new_balloon) |
| + success = observer.Wait(); |
| + EXPECT_TRUE(success); |
| + |
| + return result; |
| +} |
| + |
| +std::string NotificationsTest::CreateSimpleNotification( |
| + Browser* browser, |
| + bool wait_for_new_balloon) { |
| + return CreateNotification( |
| + browser, |
| + wait_for_new_balloon, |
| + "no_such_file.png", |
| + "My Title", |
| + "My Body", |
| + ""); |
| +} |
| + |
| +bool NotificationsTest::RequestPermissionAndWait(Browser* browser) { |
| + InfoBarTabHelper* infobar_helper = InfoBarTabHelper::FromWebContents( |
| + chrome::GetActiveWebContents(browser)); |
| + content::WindowedNotificationObserver observer( |
| + chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED, |
| + content::Source<InfoBarTabHelper>(infobar_helper)); |
| + std::string result; |
| + bool success = content::ExecuteJavaScriptAndExtractString( |
| + chrome::GetActiveWebContents(browser)->GetRenderViewHost(), |
| + L"", |
| + L"requestPermission();", |
| + &result); |
| + if (!success || result != "1") |
| + return false; |
| + observer.Wait(); |
| + return true; |
| +} |
| + |
| +bool NotificationsTest::CancelNotification( |
| + const char* notification_id, |
| + Browser* browser) { |
| + std::string script = base::StringPrintf( |
| + "cancelNotification('%s');", |
| + notification_id); |
| + |
| + NotificationBalloonChangeObserver observer; |
| + std::string result; |
| + bool success = content::ExecuteJavaScriptAndExtractString( |
| + chrome::GetActiveWebContents(browser)->GetRenderViewHost(), |
| + L"", |
| + UTF8ToWide(script), |
| + &result); |
| + if (!success || result != "1") |
| + return false; |
| + return observer.Wait(); |
| +} |
| + |
| +bool NotificationsTest::PerformActionOnInfobar( |
| + Browser* browser, |
| + InfobarAction action, |
| + int infobar_index, |
| + int tab_index) { |
| + InfoBarTabHelper* infobar_helper = InfoBarTabHelper::FromWebContents( |
| + chrome::GetWebContentsAt(browser, tab_index)); |
| + |
| + InfoBarDelegate* infobar = infobar_helper->GetInfoBarDelegateAt( |
| + infobar_index); |
| + switch (action) { |
| + case DISMISS: { |
| + infobar->InfoBarDismissed(); |
| + infobar_helper->RemoveInfoBar(infobar); |
| + return true; |
| + } |
| + case ALLOW: { |
| + ConfirmInfoBarDelegate* confirm_bar = infobar->AsConfirmInfoBarDelegate(); |
| + if (confirm_bar->Accept()) { |
| + infobar_helper->RemoveInfoBar(infobar); |
| + return true; |
| + } |
| + } |
| + case DENY: { |
| + ConfirmInfoBarDelegate* confirm_bar = infobar->AsConfirmInfoBarDelegate(); |
| + if (confirm_bar->Cancel()) { |
| + infobar_helper->RemoveInfoBar(infobar); |
| + return true; |
| + } |
| + } |
| + } |
| + |
| + return false; |
| +} |
| + |
| +void NotificationsTest::GetPrefsByContentSetting( |
| + ContentSetting setting, |
| + ContentSettingsForOneType* settings) { |
| + DesktopNotificationService* service = GetDesktopNotificationService(); |
| + service->GetNotificationsSettings(settings); |
| + for (ContentSettingsForOneType::iterator it = settings->begin(); |
| + it != settings->end();) { |
|
stevenjb
2012/11/29 03:32:16
nit: ' ' between ; and )
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + if (it->setting != setting || it->source.compare("preference") != 0) { |
| + it = settings->erase(it); |
| + } else { |
| + ++it; |
| + } |
|
stevenjb
2012/11/29 03:32:16
nit: {} unnecessary for single line ifs.
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + } |
| +} |
| + |
| +bool NotificationsTest::CheckOriginInSetting( |
| + const ContentSettingsForOneType& settings, |
| + const GURL& origin) { |
| + ContentSettingsPattern pattern = |
| + ContentSettingsPattern::FromURLNoWildcard(origin); |
| + for (ContentSettingsForOneType::const_iterator it = settings.begin(); |
| + it != settings.end(); ++it) { |
| + if (it->primary_pattern == pattern) { |
| + return true; |
| + } |
|
stevenjb
2012/11/29 03:32:16
nit: no {}
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + } |
| + return false; |
| +} |
| + |
| +void NotificationsTest::DropOriginPreference(const GURL& origin) { |
| + GetDesktopNotificationService()->ClearSetting( |
| + ContentSettingsPattern::FromURLNoWildcard(origin)); |
| +} |
| + |
| +DesktopNotificationService* NotificationsTest::GetDesktopNotificationService() { |
| + Profile* profile = browser()->profile(); |
| + return DesktopNotificationServiceFactory::GetForProfile(profile); |
| +} |
| + |
| +// If this flakes, use http://crbug.com/62311 and http://crbug.com/74428. |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestUserGestureInfobar) { |
| ui_test_utils::NavigateToURL( |
| browser(), |
| test_server()->GetURL( |
| @@ -41,9 +449,7 @@ IN_PROC_BROWSER_TEST_F(NotificationsPermissionTest, TestUserGestureInfobar) { |
| } |
| // If this flakes, use http://crbug.com/62311. |
| -IN_PROC_BROWSER_TEST_F(NotificationsPermissionTest, TestNoUserGestureInfobar) { |
| - ASSERT_TRUE(test_server()->Start()); |
| - |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestNoUserGestureInfobar) { |
| // Load a page which just does a request; no user gesture should result |
| // in no infobar. |
| ui_test_utils::NavigateToURL( |
| @@ -54,3 +460,369 @@ IN_PROC_BROWSER_TEST_F(NotificationsPermissionTest, TestNoUserGestureInfobar) { |
| EXPECT_EQ(0U, InfoBarTabHelper::FromWebContents( |
| chrome::GetWebContentsAt(browser(), 0))->GetInfoBarCount()); |
| } |
| + |
| +// Disable new testcases on Chrome OS due to failure on creating notification. |
| +#if !defined(OS_CHROMEOS) |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCreateSimpleNotification) { |
| + // Creates a simple notification. |
| + AllowAllOrigins(); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), true); |
| + EXPECT_NE("-1", result); |
| + |
| + const std::deque<Balloon*>& balloons = GetActiveBalloons(); |
| + ASSERT_EQ(1U, balloons.size()); |
| + Balloon* balloon = balloons[0]; |
| + const Notification& notification = balloon->notification(); |
| + GURL EXPECTED_ICON_URL = test_server()->GetURL(kExpectedIconUrl); |
| + EXPECT_EQ(EXPECTED_ICON_URL, notification.icon_url()); |
| + EXPECT_EQ(ASCIIToUTF16("My Title"), notification.title()); |
| + EXPECT_EQ(ASCIIToUTF16("My Body"), notification.body()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCloseNotification) { |
| + // Creates a notification and closes it. |
| + AllowAllOrigins(); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), true); |
| + EXPECT_NE("-1", result); |
| + |
| + const std::deque<Balloon*>& balloons = GetActiveBalloons(); |
| + ASSERT_EQ(1U, balloons.size()); |
| + EXPECT_TRUE(CloseNotificationAndWait(balloons[0]->notification())); |
| + ASSERT_EQ(0, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCancelNotification) { |
| + // Creates a notification and cancels it in the origin page. |
| + AllowAllOrigins(); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string note_id = CreateSimpleNotification(browser(), true); |
| + EXPECT_NE(note_id, "-1"); |
| + |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + ASSERT_TRUE(CancelNotification(note_id.c_str(), browser())); |
| + ASSERT_EQ(0, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestPermissionInfobarAppears) { |
| + // Requests notification privileges and verifies the infobar appears. |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + |
| + ASSERT_EQ(0, GetNotificationCount()); |
| + VerifyInfobar(browser(), test_page_url_.host(), 0); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowOnPermissionInfobar) { |
| + // Tries to create a notification and clicks allow on the infobar. |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + // This notification should not be shown because we do not have permission. |
| + CreateSimpleNotification(browser(), false); |
| + ASSERT_EQ(0, GetNotificationCount()); |
| + |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + ASSERT_TRUE(PerformActionOnInfobar(browser(), ALLOW, 0, 0)); |
| + |
| + CreateSimpleNotification(browser(), true); |
| + EXPECT_EQ(1, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyOnPermissionInfobar) { |
| + // Test that no notification is created |
| + // when Deny is chosen from permission infobar. |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + PerformActionOnInfobar(browser(), DENY, 0, 0); |
| + CreateSimpleNotification(browser(), false); |
| + ASSERT_EQ(0, GetNotificationCount()); |
| + ContentSettingsForOneType settings; |
| + GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings); |
| + EXPECT_TRUE(CheckOriginInSetting(settings, test_page_url_)); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestClosePermissionInfobar) { |
| + // Test that no notification is created when permission infobar is dismissed. |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + PerformActionOnInfobar(browser(), DISMISS, 0, 0); |
| + CreateSimpleNotification(browser(), false); |
| + ASSERT_EQ(0, GetNotificationCount()); |
| + ContentSettingsForOneType settings; |
| + GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings); |
| + EXPECT_EQ(0U, settings.size()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestNotificationWithPropertyMissing) { |
| + // Test that a notification can be created if one property is missing. |
| + AllowAllOrigins(); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), true); |
| + EXPECT_NE("-1", result); |
| + |
| + const std::deque<Balloon*>& balloons = GetActiveBalloons(); |
| + ASSERT_EQ(1U, balloons.size()); |
| + Balloon* balloon = balloons[0]; |
| + const Notification& notification = balloon->notification(); |
| + GURL EXPECTED_ICON_URL = test_server()->GetURL(kExpectedIconUrl); |
| + EXPECT_EQ(EXPECTED_ICON_URL, notification.icon_url()); |
| + EXPECT_EQ(ASCIIToUTF16("My Title"), notification.title()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowNotificationsFromAllSites) { |
| + // Verify that all domains can be allowed to show notifications. |
| + SetDefaultPermissionSetting(CONTENT_SETTING_ALLOW); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), true); |
| + EXPECT_NE("-1", result); |
| + |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + EXPECT_EQ(0U, InfoBarTabHelper::FromWebContents( |
| + chrome::GetWebContentsAt(browser(), 0))->GetInfoBarCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyNotificationsFromAllSites) { |
| + // Verify that no domain can show notifications. |
| + SetDefaultPermissionSetting(CONTENT_SETTING_BLOCK); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), false); |
| + EXPECT_EQ("-1", result); |
| + |
| + ASSERT_EQ(0, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyDomainAndAllowAll) { |
| + // Verify that denying a domain and allowing all shouldn't show |
| + // notifications from the denied domain. |
| + DenyOrigin(test_page_url_.GetOrigin()); |
| + SetDefaultPermissionSetting(CONTENT_SETTING_ALLOW); |
| + |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), false); |
| + EXPECT_EQ("-1", result); |
| + |
| + ASSERT_EQ(0, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowDomainAndDenyAll) { |
| + // Verify that allowing a domain and denying all others should show |
| + // notifications from the allowed domain. |
| + AllowOrigin(test_page_url_.GetOrigin()); |
| + SetDefaultPermissionSetting(CONTENT_SETTING_BLOCK); |
| + |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), true); |
| + EXPECT_NE("-1", result); |
| + |
| + ASSERT_EQ(1, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyAndThenAllowDomain) { |
| + // Verify that denying and again allowing should show notifications. |
| + DenyOrigin(test_page_url_.GetOrigin()); |
| + |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateSimpleNotification(browser(), false); |
| + EXPECT_EQ("-1", result); |
| + |
| + ASSERT_EQ(0, GetNotificationCount()); |
| + |
| + AllowOrigin(test_page_url_.GetOrigin()); |
| + result = CreateSimpleNotification(browser(), true); |
| + EXPECT_NE("-1", result); |
| + |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + EXPECT_EQ(0U, InfoBarTabHelper::FromWebContents( |
| + chrome::GetWebContentsAt(browser(), 0))->GetInfoBarCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCreateDenyCloseNotifications) { |
| + // Verify able to create, deny, and close the notification. |
| + AllowAllOrigins(); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + CreateSimpleNotification(browser(), true); |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + |
| + DenyOrigin(test_page_url_.GetOrigin()); |
| + ContentSettingsForOneType settings; |
| + GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings); |
| + ASSERT_TRUE(CheckOriginInSetting(settings, test_page_url_.GetOrigin())); |
| + |
| + const std::deque<Balloon*>& balloons1 = GetActiveBalloons(); |
| + EXPECT_EQ(1U, balloons1.size()); |
| + ASSERT_TRUE(CloseNotificationAndWait(balloons1[0]->notification())); |
| + ASSERT_EQ(0, GetNotificationCount()); |
| +} |
| + |
| +// Crashes on Linux/Win. See http://crbug.com/160657. |
| +IN_PROC_BROWSER_TEST_F( |
| + NotificationsTest, |
| + DISABLED_TestOriginPrefsNotSavedInIncognito) { |
| + // Verify that allow/deny origin preferences are not saved in incognito. |
| + Browser* incognito = CreateIncognitoBrowser(); |
| + ui_test_utils::NavigateToURL(incognito, test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(incognito)); |
| + PerformActionOnInfobar(incognito, DENY, 0, 0); |
| + CloseBrowserWindow(incognito); |
| + |
| + incognito = CreateIncognitoBrowser(); |
| + ui_test_utils::NavigateToURL(incognito, test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(incognito)); |
| + PerformActionOnInfobar(incognito, ALLOW, 0, 0); |
| + CreateSimpleNotification(incognito, true); |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + CloseBrowserWindow(incognito); |
| + |
| + incognito = CreateIncognitoBrowser(); |
| + ui_test_utils::NavigateToURL(incognito, test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(incognito)); |
| + |
| + ContentSettingsForOneType settings; |
| + GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings); |
| + EXPECT_EQ(0U, settings.size()); |
| + GetPrefsByContentSetting(CONTENT_SETTING_ALLOW, &settings); |
| + EXPECT_EQ(0U, settings.size()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestExitBrowserWithInfobar) { |
| + // Exit the browser window, when the infobar appears. |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCrashTabWithPermissionInfobar) { |
| + // Test crashing the tab with permission infobar doesn't crash Chrome. |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser(), |
| + empty_page_url_, |
| + NEW_BACKGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| + chrome::ActivateTabAt(browser(), 0, true); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + CrashTab(browser(), 0); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestKillNotificationProcess) { |
| + // Test killing a notification doesn't crash Chrome. |
| + AllowAllOrigins(); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + CreateSimpleNotification(browser(), true); |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + |
| + const std::deque<Balloon*>& balloons = GetActiveBalloons(); |
| + ASSERT_EQ(1U, balloons.size()); |
| + CrashNotification(balloons[0]); |
| + ASSERT_EQ(0, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestIncognitoNotification) { |
| + // Test notifications in incognito window. |
| + Browser* browser = CreateIncognitoBrowser(); |
| + ui_test_utils::NavigateToURL(browser, test_page_url_); |
| + chrome::ActivateTabAt(browser, 0, true); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser)); |
| + PerformActionOnInfobar(browser, ALLOW, 0, 0); |
| + CreateSimpleNotification(browser, true); |
| + ASSERT_EQ(1, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCloseTabWithPermissionInfobar) { |
| + // Test that user can close tab when infobar present. |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser(), |
| + GURL("about:blank"), |
| + NEW_BACKGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| + chrome::ActivateTabAt(browser(), 0, true); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + content::WindowedNotificationObserver observer( |
| + content::NOTIFICATION_WEB_CONTENTS_DESTROYED, |
| + content::NotificationService::AllSources()); |
| + chrome::CloseWebContents(browser(), chrome::GetWebContentsAt(browser(), 0)); |
| + observer.Wait(); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F( |
| + NotificationsTest, |
| + TestNavigateAwayWithPermissionInfobar) { |
| + // Test navigating away when an infobar is present, |
| + // then trying to create a notification from the same page. |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser(), |
| + GURL("about:blank"), |
| + NEW_BACKGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| + chrome::ActivateTabAt(browser(), 0, true); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + ASSERT_TRUE(RequestPermissionAndWait(browser())); |
| + PerformActionOnInfobar(browser(), ALLOW, 0, 0); |
| + CreateSimpleNotification(browser(), true); |
| + ASSERT_EQ(1, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCrashRendererNotificationRemain) { |
| + // Test crashing renderer does not close or crash notification. |
| + AllowAllOrigins(); |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser(), |
| + GURL("about:blank"), |
| + NEW_BACKGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| + chrome::ActivateTabAt(browser(), 0, true); |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + CreateSimpleNotification(browser(), true); |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + CrashTab(browser(), 0); |
| + ASSERT_EQ(1, GetNotificationCount()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(NotificationsTest, TestNotificationReplacement) { |
| + // Test that we can replace a notification using the replaceId. |
| + AllowAllOrigins(); |
| + |
| + ui_test_utils::NavigateToURL(browser(), test_page_url_); |
| + |
| + std::string result = CreateNotification( |
| + browser(), |
| + true, |
| + "abc.png", |
| + "Title1", |
| + "Body1", |
| + "chat"); |
|
stevenjb
2012/11/29 03:32:16
nit: one or two lines for args, here and below
chrisgao (Use stgao instead)
2012/11/29 22:49:31
Done.
|
| + EXPECT_NE("-1", result); |
| + |
| + ASSERT_EQ(1, GetNotificationCount()); |
| + |
| + result = CreateNotification( |
| + browser(), |
| + false, |
| + "no_such_file.png", |
| + "Title2", |
| + "Body2", |
| + "chat"); |
| + EXPECT_NE("-1", result); |
| + |
| + const std::deque<Balloon*>& balloons = GetActiveBalloons(); |
| + EXPECT_EQ(1U, balloons.size()); |
| + const Notification& notification = balloons[0]->notification(); |
| + GURL EXPECTED_ICON_URL = test_server()->GetURL(kExpectedIconUrl); |
| + EXPECT_EQ(EXPECTED_ICON_URL, notification.icon_url()); |
| + EXPECT_EQ(ASCIIToUTF16("Title2"), notification.title()); |
| + EXPECT_EQ(ASCIIToUTF16("Body2"), notification.body()); |
| +} |
| + |
| +#endif // !defined(OS_CHROMEOS) |