blob: 3819bd326089aba9c84ab0abd2cff24a5a3d0d1b [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string>
#include "base/bind.h"
#include "base/callback.h"
#include "base/command_line.h"
#include "base/compiler_specific.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/simple_test_clock.h"
#include "base/time/clock.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/notifications/notification_interactive_uitest_support.h"
#include "chrome/browser/notifications/notification_test_util.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/exclusive_access/exclusive_access_context.h"
#include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/interactive_test_utils.h"
#include "chrome/test/base/ui_test_utils.h"
#include "components/content_settings/core/common/content_settings_pattern.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 "net/test/embedded_test_server/embedded_test_server.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/window_open_disposition.h"
#include "ui/message_center/message_center.h"
#include "ui/message_center/message_center_observer.h"
#include "ui/message_center/notification.h"
#include "ui/message_center/notification_blocker.h"
#include "ui/message_center/public/cpp/message_center_constants.h"
#include "url/gurl.h"
#if defined(OS_MACOSX)
#include "base/mac/mac_util.h"
#include "ui/base/test/scoped_fake_nswindow_fullscreen.h"
#endif
namespace {
class ToggledNotificationBlocker : public message_center::NotificationBlocker {
public:
ToggledNotificationBlocker()
: message_center::NotificationBlocker(
message_center::MessageCenter::Get()),
notifications_enabled_(true) {}
~ToggledNotificationBlocker() override {}
void SetNotificationsEnabled(bool enabled) {
if (notifications_enabled_ != enabled) {
notifications_enabled_ = enabled;
NotifyBlockingStateChanged();
}
}
// NotificationBlocker overrides:
bool ShouldShowNotificationAsPopup(
const message_center::Notification& notification) const override {
return notifications_enabled_;
}
private:
bool notifications_enabled_;
DISALLOW_COPY_AND_ASSIGN(ToggledNotificationBlocker);
};
} // namespace
namespace {
const char kExpectedIconUrl[] = "/notifications/no_such_file.png";
} // namespace
// Flaky on Windows, Mac, Linux: http://crbug.com/437414.
IN_PROC_BROWSER_TEST_F(NotificationsTest, DISABLED_TestUserGestureInfobar) {
ASSERT_TRUE(embedded_test_server()->Start());
ui_test_utils::NavigateToURL(
browser(),
embedded_test_server()->GetURL(
"/notifications/notifications_request_function.html"));
// Request permission by calling request() while eval'ing an inline script;
// That's considered a user gesture to webkit, and should produce an infobar.
bool result;
ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
GetActiveWebContents(browser()),
"window.domAutomationController.send(request());", &result));
EXPECT_TRUE(result);
InfoBarService* infobar_service = InfoBarService::FromWebContents(
browser()->tab_strip_model()->GetWebContentsAt(0));
EXPECT_EQ(1U, infobar_service->infobar_count());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCreateSimpleNotification) {
ASSERT_TRUE(embedded_test_server()->Start());
// Creates a simple notification.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
GURL EXPECTED_ICON_URL = embedded_test_server()->GetURL(kExpectedIconUrl);
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
EXPECT_EQ(base::ASCIIToUTF16("My Title"),
(*notifications.rbegin())->title());
EXPECT_EQ(base::ASCIIToUTF16("My Body"),
(*notifications.rbegin())->message());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, NotificationBlockerTest) {
ToggledNotificationBlocker blocker;
ASSERT_TRUE(embedded_test_server()->Start());
// Creates a simple notification.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
blocker.SetNotificationsEnabled(false);
EXPECT_EQ(0, GetNotificationPopupCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCloseNotification) {
ASSERT_TRUE(embedded_test_server()->Start());
// Creates a notification and closes it.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
message_center::MessageCenter::Get()->RemoveNotification(
(*notifications.rbegin())->id(),
true); // by_user
ASSERT_EQ(0, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCancelNotification) {
ASSERT_TRUE(embedded_test_server()->Start());
// Creates a notification and cancels it in the origin page.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
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());
}
// Requests notification privileges and verifies the prompt appears.
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestPermissionRequestUIAppears) {
ASSERT_TRUE(embedded_test_server()->Start());
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
EXPECT_TRUE(RequestPermissionAndWait(browser()));
ASSERT_EQ(0, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowOnPermissionRequestUI) {
ASSERT_TRUE(embedded_test_server()->Start());
// Tries to create a notification & clicks 'allow' on the prompt.
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
// This notification should not be shown because we do not have permission.
CreateSimpleNotification(browser(), false);
ASSERT_EQ(0, GetNotificationCount());
ASSERT_TRUE(RequestAndAcceptPermission(browser()));
CreateSimpleNotification(browser(), true);
EXPECT_EQ(1, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyOnPermissionRequestUI) {
ASSERT_TRUE(embedded_test_server()->Start());
// Test that no notification is created when Deny is chosen from prompt.
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
ASSERT_TRUE(RequestAndDenyPermission(browser()));
CreateSimpleNotification(browser(), false);
ASSERT_EQ(0, GetNotificationCount());
ContentSettingsForOneType settings;
GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings);
EXPECT_TRUE(CheckOriginInSetting(settings, GetTestPageURL()));
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestClosePermissionRequestUI) {
ASSERT_TRUE(embedded_test_server()->Start());
// Test that no notification is created when prompt is dismissed.
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
ASSERT_TRUE(RequestAndDismissPermission(browser()));
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, TestPermissionAPI) {
base::test::ScopedFeatureList scoped_feature_list;
EnablePermissionsEmbargo(&scoped_feature_list);
ASSERT_TRUE(embedded_test_server()->Start());
// Test that Notification.permission returns the right thing.
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
EXPECT_EQ("default", QueryPermissionStatus(browser()));
AllowOrigin(GetTestPageURL().GetOrigin());
EXPECT_EQ("granted", QueryPermissionStatus(browser()));
DenyOrigin(GetTestPageURL().GetOrigin());
EXPECT_EQ("denied", QueryPermissionStatus(browser()));
DropOriginPreference(GetTestPageURL().GetOrigin());
// Verify embargo behaviour - automatically blocked after 3 dismisses.
ASSERT_TRUE(RequestAndDismissPermission(browser()));
EXPECT_EQ("default", QueryPermissionStatus(browser()));
ASSERT_TRUE(RequestAndDismissPermission(browser()));
EXPECT_EQ("default", QueryPermissionStatus(browser()));
ASSERT_TRUE(RequestAndDismissPermission(browser()));
EXPECT_EQ("denied", QueryPermissionStatus(browser()));
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowNotificationsFromAllSites) {
ASSERT_TRUE(embedded_test_server()->Start());
// Verify that all domains can be allowed to show notifications.
SetDefaultContentSetting(CONTENT_SETTING_ALLOW);
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyNotificationsFromAllSites) {
ASSERT_TRUE(embedded_test_server()->Start());
// Verify that no domain can show notifications.
SetDefaultContentSetting(CONTENT_SETTING_BLOCK);
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), false);
EXPECT_EQ("-1", result);
ASSERT_EQ(0, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyDomainAndAllowAll) {
ASSERT_TRUE(embedded_test_server()->Start());
// Verify that denying a domain and allowing all shouldn't show
// notifications from the denied domain.
DenyOrigin(GetTestPageURL().GetOrigin());
SetDefaultContentSetting(CONTENT_SETTING_ALLOW);
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), false);
EXPECT_EQ("-1", result);
ASSERT_EQ(0, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowDomainAndDenyAll) {
ASSERT_TRUE(embedded_test_server()->Start());
// Verify that allowing a domain and denying all others should show
// notifications from the allowed domain.
AllowOrigin(GetTestPageURL().GetOrigin());
SetDefaultContentSetting(CONTENT_SETTING_BLOCK);
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyAndThenAllowDomain) {
ASSERT_TRUE(embedded_test_server()->Start());
// Verify that denying and again allowing should show notifications.
DenyOrigin(GetTestPageURL().GetOrigin());
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), false);
EXPECT_EQ("-1", result);
ASSERT_EQ(0, GetNotificationCount());
AllowOrigin(GetTestPageURL().GetOrigin());
result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCreateDenyCloseNotifications) {
ASSERT_TRUE(embedded_test_server()->Start());
// Verify able to create, deny, and close the notification.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
CreateSimpleNotification(browser(), true);
ASSERT_EQ(1, GetNotificationCount());
DenyOrigin(GetTestPageURL().GetOrigin());
ContentSettingsForOneType settings;
GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings);
ASSERT_TRUE(CheckOriginInSetting(settings, GetTestPageURL().GetOrigin()));
EXPECT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
message_center::MessageCenter::Get()->RemoveNotification(
(*notifications.rbegin())->id(),
true); // by_user
ASSERT_EQ(0, GetNotificationCount());
}
// Crashes on Linux/Win. See http://crbug.com/160657.
IN_PROC_BROWSER_TEST_F(
NotificationsTest,
DISABLED_TestOriginPrefsNotSavedInIncognito) {
ASSERT_TRUE(embedded_test_server()->Start());
// Verify that allow/deny origin preferences are not saved in incognito.
Browser* incognito = CreateIncognitoBrowser();
ui_test_utils::NavigateToURL(incognito, GetTestPageURL());
ASSERT_TRUE(RequestAndDenyPermission(incognito));
CloseBrowserWindow(incognito);
incognito = CreateIncognitoBrowser();
ui_test_utils::NavigateToURL(incognito, GetTestPageURL());
ASSERT_TRUE(RequestAndAcceptPermission(incognito));
CreateSimpleNotification(incognito, true);
ASSERT_EQ(1, GetNotificationCount());
CloseBrowserWindow(incognito);
incognito = CreateIncognitoBrowser();
ui_test_utils::NavigateToURL(incognito, GetTestPageURL());
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, TestCloseTabWithPermissionRequestUI) {
ASSERT_TRUE(embedded_test_server()->Start());
// Test that user can close tab when bubble present.
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
EXPECT_TRUE(RequestPermissionAndWait(browser()));
content::WebContentsDestroyedWatcher destroyed_watcher(
browser()->tab_strip_model()->GetWebContentsAt(0));
browser()->tab_strip_model()->CloseWebContentsAt(0,
TabStripModel::CLOSE_NONE);
destroyed_watcher.Wait();
}
// See crbug.com/248470
#if defined(OS_LINUX)
#define MAYBE_TestCrashRendererNotificationRemain \
DISABLED_TestCrashRendererNotificationRemain
#else
#define MAYBE_TestCrashRendererNotificationRemain \
TestCrashRendererNotificationRemain
#endif
IN_PROC_BROWSER_TEST_F(NotificationsTest,
MAYBE_TestCrashRendererNotificationRemain) {
ASSERT_TRUE(embedded_test_server()->Start());
// Test crashing renderer does not close or crash notification.
AllowAllOrigins();
ui_test_utils::NavigateToURLWithDisposition(
browser(), GURL("about:blank"), WindowOpenDisposition::NEW_BACKGROUND_TAB,
ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
browser()->tab_strip_model()->ActivateTabAt(0, true);
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
CreateSimpleNotification(browser(), true);
ASSERT_EQ(1, GetNotificationCount());
CrashTab(browser(), 0);
ASSERT_EQ(1, GetNotificationCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestNotificationReplacement) {
ASSERT_TRUE(embedded_test_server()->Start());
// Test that we can replace a notification using the replaceId.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateNotification(
browser(), true, "abc.png", "Title1", "Body1", "chat");
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
result = CreateNotification(
browser(), false, "no_such_file.png", "Title2", "Body2", "chat");
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
EXPECT_EQ(base::ASCIIToUTF16("Title2"), (*notifications.rbegin())->title());
EXPECT_EQ(base::ASCIIToUTF16("Body2"),
(*notifications.rbegin())->message());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest,
TestNotificationReplacementReappearance) {
ASSERT_TRUE(embedded_test_server()->Start());
// Test that we can replace a notification using the tag, and that it will
// cause the notification to reappear as a popup again.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
ASSERT_EQ(0, GetNotificationPopupCount());
std::string result = CreateNotification(
browser(), true, "abc.png", "Title1", "Body1", "chat");
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationPopupCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
message_center::MessageCenter::Get()->ClickOnNotification(
(*notifications.rbegin())->id());
#if defined(OS_CHROMEOS)
ASSERT_EQ(0, GetNotificationPopupCount());
#else
ASSERT_EQ(1, GetNotificationPopupCount());
#endif
result = CreateNotification(
browser(), true, "abc.png", "Title2", "Body2", "chat");
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationPopupCount());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestNotificationValidIcon) {
ASSERT_TRUE(embedded_test_server()->Start());
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
ASSERT_EQ(0, GetNotificationPopupCount());
std::string result = CreateNotification(
browser(), true, "icon.png", "Title1", "Body1", "chat");
EXPECT_NE("-1", result);
message_center::NotificationList::PopupNotifications notifications =
message_center::MessageCenter::Get()->GetPopupNotifications();
ASSERT_EQ(1u, notifications.size());
auto* notification = *notifications.rbegin();
EXPECT_EQ(100, notification->icon().Width());
EXPECT_EQ(100, notification->icon().Height());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestNotificationInvalidIcon) {
ASSERT_TRUE(embedded_test_server()->Start());
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
ASSERT_EQ(0, GetNotificationPopupCount());
// Not supplying an icon URL.
std::string result = CreateNotification(
browser(), true, "", "Title1", "Body1", "chat");
EXPECT_NE("-1", result);
message_center::NotificationList::PopupNotifications notifications =
message_center::MessageCenter::Get()->GetPopupNotifications();
ASSERT_EQ(1u, notifications.size());
auto* notification = *notifications.rbegin();
EXPECT_TRUE(notification->icon().IsEmpty());
// Supplying an invalid icon URL.
result = CreateNotification(
browser(), true, "invalid.png", "Title1", "Body1", "chat");
EXPECT_NE("-1", result);
notifications = message_center::MessageCenter::Get()->GetPopupNotifications();
ASSERT_EQ(1u, notifications.size());
notification = *notifications.rbegin();
EXPECT_TRUE(notification->icon().IsEmpty());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestNotificationDoubleClose) {
ASSERT_TRUE(embedded_test_server()->Start());
AllowAllOrigins();
ui_test_utils::NavigateToURL(
browser(), GetTestPageURLForFile("notification-double-close.html"));
ASSERT_EQ(0, GetNotificationPopupCount());
std::string result = CreateNotification(
browser(), true, "", "Title1", "Body1", "chat");
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
message_center::MessageCenter::Get()->RemoveNotification(
(*notifications.rbegin())->id(),
true); // by_user
ASSERT_EQ(0, GetNotificationCount());
// Calling WebContents::IsCrashed() will return FALSE here, even if the WC did
// crash. Work around this timing issue by creating another notification,
// which requires interaction with the renderer process.
result = CreateNotification(browser(), true, "", "Title1", "Body1", "chat");
EXPECT_NE("-1", result);
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestShouldDisplayNormal) {
ASSERT_TRUE(embedded_test_server()->Start());
// Creates a simple notification.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
// Because the webpage is not fullscreen, there will be no special fullscreen
// visibility tagged on the notification.
EXPECT_EQ(message_center::FullscreenVisibility::NONE,
(*notifications.rbegin())->fullscreen_visibility());
}
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestShouldDisplayFullscreen) {
#if defined(OS_MACOSX)
ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
#endif
ASSERT_TRUE(embedded_test_server()->Start());
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
// Set the page fullscreen
browser()->exclusive_access_manager()->fullscreen_controller()->
ToggleBrowserFullscreenMode();
{
FullscreenStateWaiter fs_state(browser(), true);
fs_state.Wait();
}
ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(
browser()->window()->GetNativeWindow()));
ASSERT_TRUE(browser()->window()->IsActive());
// Creates a simple notification.
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
// Because the webpage is fullscreen, the fullscreen bit will be set.
EXPECT_EQ(message_center::FullscreenVisibility::OVER_USER,
(*notifications.rbegin())->fullscreen_visibility());
}
// The Fake OSX fullscreen window doesn't like drawing a second fullscreen
// window when another is visible.
#if !defined(OS_MACOSX)
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestShouldDisplayMultiFullscreen) {
ASSERT_TRUE(embedded_test_server()->Start());
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
Browser* other_browser = CreateBrowser(browser()->profile());
ui_test_utils::NavigateToURL(other_browser, GURL("about:blank"));
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
// Set the notifcation page fullscreen
browser()->exclusive_access_manager()->fullscreen_controller()->
ToggleBrowserFullscreenMode();
{
FullscreenStateWaiter fs_state(browser(), true);
fs_state.Wait();
}
// Set the other browser fullscreen
other_browser->exclusive_access_manager()->fullscreen_controller()->
ToggleBrowserFullscreenMode();
{
FullscreenStateWaiter fs_state(other_browser, true);
fs_state.Wait();
}
ASSERT_TRUE(browser()->exclusive_access_manager()->context()->IsFullscreen());
ASSERT_TRUE(
other_browser->exclusive_access_manager()->context()->IsFullscreen());
ASSERT_FALSE(browser()->window()->IsActive());
ASSERT_TRUE(other_browser->window()->IsActive());
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::Notifications notifications =
message_center::MessageCenter::Get()->GetVisibleNotifications();
// Because the second page is the top-most fullscreen, the fullscreen bit
// won't be set.
EXPECT_EQ(message_center::FullscreenVisibility::NONE,
(*notifications.rbegin())->fullscreen_visibility());
}
#endif
// Verify that a notification is actually displayed when the webpage that
// creates it is fullscreen with the fullscreen notification flag turned on.
IN_PROC_BROWSER_TEST_F(NotificationsTest, TestShouldDisplayPopupNotification) {
#if defined(OS_MACOSX)
ui::test::ScopedFakeNSWindowFullscreen fake_fullscreen;
#endif
ASSERT_TRUE(embedded_test_server()->Start());
// Creates a simple notification.
AllowAllOrigins();
ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
// Set the page fullscreen
browser()->exclusive_access_manager()->fullscreen_controller()->
ToggleBrowserFullscreenMode();
{
FullscreenStateWaiter fs_state(browser(), true);
fs_state.Wait();
}
ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(
browser()->window()->GetNativeWindow()));
std::string result = CreateSimpleNotification(browser(), true);
EXPECT_NE("-1", result);
ASSERT_EQ(1, GetNotificationCount());
message_center::NotificationList::PopupNotifications notifications =
message_center::MessageCenter::Get()->GetPopupNotifications();
ASSERT_EQ(1u, notifications.size());
}