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

Unified Diff: chrome/browser/notifications/desktop_notifications_unittest.cc

Issue 231723006: Remove balloon notification code. The last user was the Linux GTK port but that's deleted now. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: sync past sadrul's r262988 which removed mac/views Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/notifications/desktop_notifications_unittest.cc
===================================================================
--- chrome/browser/notifications/desktop_notifications_unittest.cc (revision 263011)
+++ chrome/browser/notifications/desktop_notifications_unittest.cc (working copy)
@@ -1,588 +0,0 @@
-// 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 "chrome/browser/notifications/desktop_notifications_unittest.h"
-
-#include "base/prefs/testing_pref_service.h"
-#include "base/strings/string_util.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chrome/browser/notifications/balloon_notification_ui_manager.h"
-#include "chrome/browser/notifications/fake_balloon_view.h"
-#include "chrome/browser/prefs/browser_prefs.h"
-#include "chrome/common/pref_names.h"
-#include "chrome/test/base/chrome_unit_test_suite.h"
-#include "chrome/test/base/testing_browser_process.h"
-#include "chrome/test/base/testing_profile.h"
-#include "chrome/test/base/testing_profile_manager.h"
-#include "content/public/common/show_desktop_notification_params.h"
-#include "ui/base/ime/input_method_initializer.h"
-#include "ui/gl/gl_surface.h"
-#include "ui/message_center/message_center.h"
-
-#if defined(USE_ASH)
-#include "ash/shell.h"
-#include "ash/test/test_shell_delegate.h"
-#include "ui/aura/env.h"
-#include "ui/aura/window_event_dispatcher.h"
-#include "ui/compositor/scoped_animation_duration_scale_mode.h"
-#include "ui/compositor/test/context_factories_for_test.h"
-#endif
-
-#if defined(USE_AURA)
-#include "ui/wm/core/wm_state.h"
-#endif
-
-
-using content::BrowserThread;
-
-// static
-const int MockBalloonCollection::kMockBalloonSpace = 5;
-
-// static
-std::string DesktopNotificationsTest::log_output_;
-
-MockBalloonCollection::MockBalloonCollection() {}
-
-MockBalloonCollection::~MockBalloonCollection() {}
-
-void MockBalloonCollection::Add(const Notification& notification,
- Profile* profile) {
- // Swap in a logging proxy for the purpose of logging calls that
- // would be made into javascript, then pass this down to the
- // balloon collection.
- Notification test_notification(
- notification.origin_url(),
- notification.content_url(),
- notification.display_source(),
- notification.replace_id(),
- new LoggingNotificationProxy(notification.notification_id()));
- BalloonCollectionImpl::Add(test_notification, profile);
-}
-
-bool MockBalloonCollection::HasSpace() const {
- return count() < kMockBalloonSpace;
-}
-
-Balloon* MockBalloonCollection::MakeBalloon(const Notification& notification,
- Profile* profile) {
- // Start with a normal balloon but mock out the view.
- Balloon* balloon = BalloonCollectionImpl::MakeBalloon(notification, profile);
- balloon->set_view(new FakeBalloonView(balloon));
- balloons_.push_back(balloon);
- return balloon;
-}
-
-void MockBalloonCollection::OnBalloonClosed(Balloon* source) {
- std::deque<Balloon*>::iterator it;
- for (it = balloons_.begin(); it != balloons_.end(); ++it) {
- if (*it == source) {
- balloons_.erase(it);
- BalloonCollectionImpl::OnBalloonClosed(source);
- break;
- }
- }
-}
-
-const BalloonCollection::Balloons& MockBalloonCollection::GetActiveBalloons() {
- return balloons_;
-}
-
-int MockBalloonCollection::UppermostVerticalPosition() {
- int min = 0;
- std::deque<Balloon*>::iterator iter;
- for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) {
- int pos = (*iter)->GetPosition().y();
- if (iter == balloons_.begin() || pos < min)
- min = pos;
- }
- return min;
-}
-
-DesktopNotificationsTest::DesktopNotificationsTest()
- : ui_thread_(BrowserThread::UI, &message_loop_),
- balloon_collection_(NULL) {
-}
-
-DesktopNotificationsTest::~DesktopNotificationsTest() {
-}
-
-void DesktopNotificationsTest::SetUp() {
- ChromeUnitTestSuite::InitializeProviders();
- ChromeUnitTestSuite::InitializeResourceBundle();
- ui::InitializeInputMethodForTesting();
-#if defined(USE_AURA)
- wm_state_.reset(new wm::WMState);
-#endif
-#if defined(USE_ASH)
- ui::ScopedAnimationDurationScaleMode normal_duration_mode(
- ui::ScopedAnimationDurationScaleMode::ZERO_DURATION);
- // The message center is notmally initialized on |g_browser_process| which
- // is not created for these tests.
- message_center::MessageCenter::Initialize();
- // The ContextFactory must exist before any Compositors are created.
- bool enable_pixel_output = false;
- ui::InitializeContextFactoryForTests(enable_pixel_output);
- // MockBalloonCollection retrieves information about the screen on creation.
- // So it is necessary to make sure the desktop gets created first.
- ash::Shell::CreateInstance(new ash::test::TestShellDelegate);
-#endif
- chrome::RegisterLocalState(local_state_.registry());
- profile_.reset(new TestingProfile());
- ui_manager_.reset(new BalloonNotificationUIManager(&local_state_));
- balloon_collection_ = new MockBalloonCollection();
- ui_manager_->SetBalloonCollection(balloon_collection_);
- service_.reset(new DesktopNotificationService(profile(), ui_manager_.get()));
- log_output_.clear();
-}
-
-void DesktopNotificationsTest::TearDown() {
- service_.reset(NULL);
- ui_manager_.reset(NULL);
- profile_.reset(NULL);
-#if defined(USE_ASH)
- ash::Shell::DeleteInstance();
- // The message center is notmally shutdown on |g_browser_process| which
- // is not created for these tests.
- message_center::MessageCenter::Shutdown();
- aura::Env::DeleteInstance();
- ui::TerminateContextFactoryForTests();
-#endif
-#if defined(USE_AURA)
- wm_state_.reset();
-#endif
- ui::ShutdownInputMethodForTesting();
-}
-
-content::ShowDesktopNotificationHostMsgParams
-DesktopNotificationsTest::StandardTestNotification() {
- content::ShowDesktopNotificationHostMsgParams params;
- params.notification_id = 0;
- params.origin = GURL("http://www.google.com");
- params.icon_url = GURL("/icon.png");
- params.title = base::ASCIIToUTF16("Title");
- params.body = base::ASCIIToUTF16("Text");
- params.direction = blink::WebTextDirectionDefault;
- return params;
-}
-
-TEST_F(DesktopNotificationsTest, TestShow) {
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- params.notification_id = 1;
-
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- base::MessageLoopForUI::current()->RunUntilIdle();
- EXPECT_EQ(1, balloon_collection_->count());
-
- content::ShowDesktopNotificationHostMsgParams params2 =
- StandardTestNotification();
- params2.notification_id = 2;
- params2.origin = GURL("http://www.google.com");
- params2.body = base::ASCIIToUTF16("Text");
-
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params2, 0, 0, DesktopNotificationService::PageNotification));
- base::MessageLoopForUI::current()->RunUntilIdle();
- EXPECT_EQ(2, balloon_collection_->count());
-
- EXPECT_EQ("notification displayed\n"
- "notification displayed\n",
- log_output_);
-}
-
-TEST_F(DesktopNotificationsTest, TestClose) {
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- params.notification_id = 1;
-
- // Request a notification; should open a balloon.
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- base::MessageLoopForUI::current()->RunUntilIdle();
- EXPECT_EQ(1, balloon_collection_->count());
-
- // Close all the open balloons.
- while (balloon_collection_->count() > 0) {
- (*(balloon_collection_->GetActiveBalloons().begin()))->OnClose(true);
- }
-
- EXPECT_EQ("notification displayed\n"
- "notification closed by user\n",
- log_output_);
-}
-
-TEST_F(DesktopNotificationsTest, TestCancel) {
- int process_id = 0;
- int route_id = 0;
- int notification_id = 1;
-
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- params.notification_id = notification_id;
-
- // Request a notification; should open a balloon.
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, process_id, route_id,
- DesktopNotificationService::PageNotification));
- base::MessageLoopForUI::current()->RunUntilIdle();
- EXPECT_EQ(1, balloon_collection_->count());
-
- // Cancel the same notification
- service_->CancelDesktopNotification(process_id,
- route_id,
- notification_id);
- base::MessageLoopForUI::current()->RunUntilIdle();
- // Verify that the balloon collection is now empty.
- EXPECT_EQ(0, balloon_collection_->count());
-
- EXPECT_EQ("notification displayed\n"
- "notification closed by script\n",
- log_output_);
-}
-
-#if defined(OS_WIN) || defined(TOOLKIT_VIEWS)
-TEST_F(DesktopNotificationsTest, TestPositioning) {
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- std::string expected_log;
- // Create some toasts. After each but the first, make sure there
- // is a minimum separation between the toasts.
- int last_top = 0;
- for (int id = 0; id <= 3; ++id) {
- params.notification_id = id;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- expected_log.append("notification displayed\n");
- int top = balloon_collection_->UppermostVerticalPosition();
- if (id > 0)
- EXPECT_LE(top, last_top - balloon_collection_->MinHeight());
- last_top = top;
- }
-
- EXPECT_EQ(expected_log, log_output_);
-}
-
-TEST_F(DesktopNotificationsTest, TestVariableSize) {
- content::ShowDesktopNotificationHostMsgParams params;
- params.origin = GURL("http://long.google.com");
- params.icon_url = GURL("/icon.png");
- params.title = base::ASCIIToUTF16("Really Really Really Really Really Really "
- "Really Really Really Really Really Really "
- "Really Really Really Really Really Really "
- "Really Long Title"),
- params.body = base::ASCIIToUTF16("Text");
- params.notification_id = 0;
-
- std::string expected_log;
- // Create some toasts. After each but the first, make sure there
- // is a minimum separation between the toasts.
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- expected_log.append("notification displayed\n");
-
- params.origin = GURL("http://short.google.com");
- params.title = base::ASCIIToUTF16("Short title");
- params.notification_id = 1;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- expected_log.append("notification displayed\n");
-
- std::deque<Balloon*>& balloons = balloon_collection_->balloons();
- std::deque<Balloon*>::iterator iter;
- for (iter = balloons.begin(); iter != balloons.end(); ++iter) {
- if ((*iter)->notification().origin_url().host() == "long.google.com") {
- EXPECT_GE((*iter)->GetViewSize().height(),
- balloon_collection_->MinHeight());
- EXPECT_LE((*iter)->GetViewSize().height(),
- balloon_collection_->MaxHeight());
- } else {
- EXPECT_EQ((*iter)->GetViewSize().height(),
- balloon_collection_->MinHeight());
- }
- }
- EXPECT_EQ(expected_log, log_output_);
-}
-#endif
-
-TEST_F(DesktopNotificationsTest, TestCancelByProfile) {
- int process_id = 0;
- int route_id = 0;
-
- TestingBrowserProcess* browser_process =
- TestingBrowserProcess::GetGlobal();
- TestingProfileManager profile_manager(browser_process);
- ASSERT_TRUE(profile_manager.SetUp());
-
- TestingProfile* second_profile =
- profile_manager.CreateTestingProfile("SecondTestingProfile");
-
- scoped_ptr<DesktopNotificationService> second_service(
- new DesktopNotificationService(second_profile, ui_manager_.get()));
-
- // Request lots of identical notifications.
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- params.notification_id = 1;
- // Notice that the first one is the only one that doesn't use
- // the second profile.
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, process_id, route_id,
- DesktopNotificationService::PageNotification));
-
- // |kLotsOfToasts| must be large enough to trigger a resize of the underlying
- // std::deque while we're clearing it.
- const int kLotsOfToasts = 20;
- for (int id = 2; id <= kLotsOfToasts; ++id) {
- params.notification_id = id;
- EXPECT_TRUE(second_service->ShowDesktopNotification(
- params, process_id, route_id,
- DesktopNotificationService::PageNotification));
- }
- base::MessageLoopForUI::current()->RunUntilIdle();
-
- ui_manager_->CancelAllByProfile(second_profile);
-
- // Verify that the balloon collection only contains the single
- // notification from the first profile.
- EXPECT_EQ(1, balloon_collection_->count());
-}
-
-TEST_F(DesktopNotificationsTest, TestCancelBySourceOrigin) {
- int process_id = 0;
- int route_id = 0;
-
- // Request lots of identical notifications.
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
-
- // After the first, all the notifications are from attacker.com.
- content::ShowDesktopNotificationHostMsgParams odd_params =
- StandardTestNotification();
- odd_params.origin = GURL("attacker.com");
-
- // Show the only non-attacker.com notification.
- params.notification_id = 1;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, process_id, route_id,
- DesktopNotificationService::PageNotification));
-
- // |kLotsOfToasts| must be large enough to trigger a resize of the underlying
- // std::deque while we're clearing it.
- const int kLotsOfToasts = 20;
- for (int id = 2; id <= kLotsOfToasts; ++id) {
- odd_params.notification_id = id;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- odd_params, process_id, route_id,
- DesktopNotificationService::PageNotification));
- }
- base::MessageLoopForUI::current()->RunUntilIdle();
-
- ui_manager_->CancelAllBySourceOrigin(odd_params.origin);
-
- // Verify that the balloon collection only contains the single
- // notification which is not from the canceled origin.
- EXPECT_EQ(1, balloon_collection_->count());
-}
-
-TEST_F(DesktopNotificationsTest, TestQueueing) {
- int process_id = 0;
- int route_id = 0;
-
- // Request lots of identical notifications.
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- const int kLotsOfToasts = 20;
- for (int id = 1; id <= kLotsOfToasts; ++id) {
- params.notification_id = id;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, process_id, route_id,
- DesktopNotificationService::PageNotification));
- }
- base::MessageLoopForUI::current()->RunUntilIdle();
-
- // Build up an expected log of what should be happening.
- std::string expected_log;
- for (int i = 0; i < balloon_collection_->max_balloon_count(); ++i) {
- expected_log.append("notification displayed\n");
- }
-
- // The max number that our balloon collection can hold should be
- // shown.
- EXPECT_EQ(balloon_collection_->max_balloon_count(),
- balloon_collection_->count());
- EXPECT_EQ(expected_log, log_output_);
-
- // Cancel the notifications from the start; the balloon space should
- // remain full.
- {
- int id;
- for (id = 1;
- id <= kLotsOfToasts - balloon_collection_->max_balloon_count();
- ++id) {
- service_->CancelDesktopNotification(process_id, route_id, id);
- base::MessageLoopForUI::current()->RunUntilIdle();
- expected_log.append("notification closed by script\n");
- expected_log.append("notification displayed\n");
- EXPECT_EQ(balloon_collection_->max_balloon_count(),
- balloon_collection_->count());
- EXPECT_EQ(expected_log, log_output_);
- }
-
- // Now cancel the rest. It should empty the balloon space.
- for (; id <= kLotsOfToasts; ++id) {
- service_->CancelDesktopNotification(process_id, route_id, id);
- expected_log.append("notification closed by script\n");
- base::MessageLoopForUI::current()->RunUntilIdle();
- EXPECT_EQ(expected_log, log_output_);
- }
- }
-
- // Verify that the balloon collection is now empty.
- EXPECT_EQ(0, balloon_collection_->count());
-}
-
-TEST_F(DesktopNotificationsTest, TestEarlyDestruction) {
- // Create some toasts and then prematurely delete the notification service,
- // just to make sure nothing crashes/leaks.
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- for (int id = 0; id <= 3; ++id) {
- params.notification_id = id;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- }
- service_.reset(NULL);
-}
-
-TEST_F(DesktopNotificationsTest, TestUserInputEscaping) {
- // Create a test script with some HTML; assert that it doesn't get into the
- // data:// URL that's produced for the balloon.
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- params.title = base::ASCIIToUTF16("<script>window.alert('uh oh');</script>");
- params.body = base::ASCIIToUTF16("<i>this text is in italics</i>");
- params.notification_id = 1;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
-
- base::MessageLoopForUI::current()->RunUntilIdle();
- EXPECT_EQ(1, balloon_collection_->count());
- Balloon* balloon = (*balloon_collection_->balloons().begin());
- GURL data_url = balloon->notification().content_url();
- EXPECT_EQ(std::string::npos, data_url.spec().find("<script>"));
- EXPECT_EQ(std::string::npos, data_url.spec().find("<i>"));
- // URL-encoded versions of tags should also not be found.
- EXPECT_EQ(std::string::npos, data_url.spec().find("%3cscript%3e"));
- EXPECT_EQ(std::string::npos, data_url.spec().find("%3ci%3e"));
-}
-
-TEST_F(DesktopNotificationsTest, TestBoundingBox) {
- // Create some notifications.
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- for (int id = 0; id <= 3; ++id) {
- params.notification_id = id;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- }
-
- gfx::Rect box = balloon_collection_->GetBalloonsBoundingBox();
-
- // Try this for all positions.
- BalloonCollection::PositionPreference pref;
- for (pref = BalloonCollection::UPPER_RIGHT;
- pref <= BalloonCollection::LOWER_LEFT;
- pref = static_cast<BalloonCollection::PositionPreference>(pref + 1)) {
- // Make sure each balloon's 4 corners are inside the box.
- std::deque<Balloon*>& balloons = balloon_collection_->balloons();
- std::deque<Balloon*>::iterator iter;
- for (iter = balloons.begin(); iter != balloons.end(); ++iter) {
- int min_x = (*iter)->GetPosition().x();
- int max_x = min_x + (*iter)->GetViewSize().width() - 1;
- int min_y = (*iter)->GetPosition().y();
- int max_y = min_y + (*iter)->GetViewSize().height() - 1;
-
- EXPECT_TRUE(box.Contains(gfx::Point(min_x, min_y)));
- EXPECT_TRUE(box.Contains(gfx::Point(min_x, max_y)));
- EXPECT_TRUE(box.Contains(gfx::Point(max_x, min_y)));
- EXPECT_TRUE(box.Contains(gfx::Point(max_x, max_y)));
- }
- }
-}
-
-TEST_F(DesktopNotificationsTest, TestPositionPreference) {
- // Set position preference to lower right.
- local_state_.SetInteger(prefs::kDesktopNotificationPosition,
- BalloonCollection::LOWER_RIGHT);
-
- // Create some notifications.
- content::ShowDesktopNotificationHostMsgParams params =
- StandardTestNotification();
- for (int id = 0; id <= 3; ++id) {
- params.notification_id = id;
- EXPECT_TRUE(service_->ShowDesktopNotification(
- params, 0, 0, DesktopNotificationService::PageNotification));
- }
-
- std::deque<Balloon*>& balloons = balloon_collection_->balloons();
- std::deque<Balloon*>::iterator iter;
-
- // Check that they decrease in y-position (for MAC, with reversed
- // coordinates, they should increase).
- int last_y = -1;
- int last_x = -1;
-
- for (iter = balloons.begin(); iter != balloons.end(); ++iter) {
- int current_x = (*iter)->GetPosition().x();
- int current_y = (*iter)->GetPosition().y();
- if (last_x > 0)
- EXPECT_EQ(last_x, current_x);
-
- if (last_y > 0) {
-#if defined(OS_MACOSX)
- EXPECT_GT(current_y, last_y);
-#else
- EXPECT_LT(current_y, last_y);
-#endif
- }
-
- last_x = current_x;
- last_y = current_y;
- }
-
- // Now change the position to upper right. This should cause an immediate
- // repositioning, and we check for the reverse ordering.
- local_state_.SetInteger(prefs::kDesktopNotificationPosition,
- BalloonCollection::UPPER_RIGHT);
- last_x = -1;
- last_y = -1;
-
- for (iter = balloons.begin(); iter != balloons.end(); ++iter) {
- int current_x = (*iter)->GetPosition().x();
- int current_y = (*iter)->GetPosition().y();
-
- if (last_x > 0)
- EXPECT_EQ(last_x, current_x);
-
- if (last_y > 0) {
-#if defined(OS_MACOSX)
- EXPECT_LT(current_y, last_y);
-#else
- EXPECT_GT(current_y, last_y);
-#endif
- }
-
- last_x = current_x;
- last_y = current_y;
- }
-
- // Now change the position to upper left. Confirm that the X value for the
- // balloons gets smaller.
- local_state_.SetInteger(prefs::kDesktopNotificationPosition,
- BalloonCollection::UPPER_LEFT);
-
- int current_x = (*balloons.begin())->GetPosition().x();
- EXPECT_LT(current_x, last_x);
-}

Powered by Google App Engine
This is Rietveld 408576698