| Index: chrome/browser/ui/panels/panel_browsertest.cc
|
| diff --git a/chrome/browser/ui/panels/panel_browsertest.cc b/chrome/browser/ui/panels/panel_browsertest.cc
|
| index f561ace83d05412ef67e146b76b2503ad2e8f490..7af0f025cd807defa2f48fe794afb5c23bef21bd 100644
|
| --- a/chrome/browser/ui/panels/panel_browsertest.cc
|
| +++ b/chrome/browser/ui/panels/panel_browsertest.cc
|
| @@ -4,9 +4,16 @@
|
|
|
| #include "base/bind.h"
|
| #include "base/string_number_conversions.h"
|
| +#include "base/utf_string_conversions.h"
|
| +#include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/download/download_service.h"
|
| #include "chrome/browser/download/download_service_factory.h"
|
| #include "chrome/browser/net/url_request_mock_util.h"
|
| +#include "chrome/browser/notifications/balloon_collection_impl.h"
|
| +#include "chrome/browser/notifications/desktop_notification_service.h"
|
| +#include "chrome/browser/notifications/notification.h"
|
| +#include "chrome/browser/notifications/notification_ui_manager.h"
|
| +#include "chrome/browser/prefs/browser_prefs.h"
|
| #include "chrome/browser/prefs/pref_service.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/ui/browser_list.h"
|
| @@ -22,13 +29,16 @@
|
| #include "chrome/common/chrome_notification_types.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/common/url_constants.h"
|
| +#include "chrome/test/base/testing_pref_service.h"
|
| #include "chrome/test/base/ui_test_utils.h"
|
| #include "content/browser/download/download_manager.h"
|
| #include "content/browser/net/url_request_mock_http_job.h"
|
| #include "content/browser/tab_contents/tab_contents.h"
|
| +#include "content/common/desktop_notification_messages.h"
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/common/url_constants.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| +#include "ui/gfx/screen.h"
|
|
|
| using content::BrowserThread;
|
|
|
| @@ -1563,3 +1573,161 @@ IN_PROC_BROWSER_TEST_F(PanelDownloadTest, DownloadNoTabbedBrowser) {
|
|
|
| panel_browser->CloseWindow();
|
| }
|
| +
|
| +class PanelAndNotificationTest : public PanelBrowserTest {
|
| + public:
|
| + PanelAndNotificationTest() : PanelBrowserTest() {
|
| + // Do not use our own testing work area since desktop notification code
|
| + // does not have the hook up for testing work area.
|
| + set_testing_work_area(gfx::Rect());
|
| + }
|
| +
|
| + virtual ~PanelAndNotificationTest() {
|
| + }
|
| +
|
| + virtual void SetUpOnMainThread() OVERRIDE {
|
| + g_browser_process->local_state()->SetInteger(
|
| + prefs::kDesktopNotificationPosition, BalloonCollection::LOWER_RIGHT);
|
| + balloons_ = new BalloonCollectionImpl();
|
| + ui_manager_.reset(NotificationUIManager::Create(
|
| + g_browser_process->local_state(), balloons_));
|
| + service_.reset(new DesktopNotificationService(browser()->profile(),
|
| + ui_manager_.get()));
|
| +
|
| + PanelBrowserTest::SetUpOnMainThread();
|
| + }
|
| +
|
| + virtual void CleanUpOnMainThread() OVERRIDE {
|
| + balloons_->RemoveAll();
|
| + MessageLoopForUI::current()->RunAllPending();
|
| +
|
| + service_.reset();
|
| + ui_manager_.reset();
|
| +
|
| + PanelBrowserTest::CleanUpOnMainThread();
|
| + }
|
| +
|
| + DesktopNotificationHostMsg_Show_Params StandardTestNotification() {
|
| + DesktopNotificationHostMsg_Show_Params params;
|
| + params.notification_id = 0;
|
| + params.origin = GURL("http://www.google.com");
|
| + params.is_html = false;
|
| + params.icon_url = GURL("/icon.png");
|
| + params.title = ASCIIToUTF16("Title");
|
| + params.body = ASCIIToUTF16("Text");
|
| + params.direction = WebKit::WebTextDirectionDefault;
|
| + return params;
|
| + }
|
| +
|
| + int GetBalloonBottomPosition(Balloon* balloon) const {
|
| +#if defined(OS_MACOSX)
|
| + // The position returned by the notification balloon is based on Mac's
|
| + // vertically inverted orientation. We need to flip it so that it can
|
| + // be compared against the position returned by the panel.
|
| + gfx::Size screen_size = gfx::Screen::GetPrimaryMonitorSize();
|
| + return screen_size.height() - balloon->GetPosition().y() -
|
| + balloon->GetViewSize().height();
|
| +#else
|
| + return balloon->GetPosition().y() + balloon->GetViewSize().height();
|
| +#endif
|
| + }
|
| +
|
| + DesktopNotificationService* service() const { return service_.get(); }
|
| + const BalloonCollection::Balloons& balloons() const {
|
| + return balloons_->GetActiveBalloons();
|
| + }
|
| +
|
| + private:
|
| + BalloonCollectionImpl* balloons_; // Owned by NotificationUIManager.
|
| + scoped_ptr<NotificationUIManager> ui_manager_;
|
| + scoped_ptr<DesktopNotificationService> service_;
|
| +};
|
| +
|
| +IN_PROC_BROWSER_TEST_F(PanelAndNotificationTest, NoOverlapping) {
|
| + const int kPanelWidth = 200;
|
| + const int kShortPanelHeight = 200;
|
| + const int kTallPanelHeight = 400;
|
| +
|
| + DesktopNotificationHostMsg_Show_Params params = StandardTestNotification();
|
| + EXPECT_TRUE(service()->ShowDesktopNotification(
|
| + params, 0, 0, DesktopNotificationService::PageNotification));
|
| + MessageLoopForUI::current()->RunAllPending();
|
| + Balloon* balloon = balloons().front();
|
| + int original_balloon_bottom = GetBalloonBottomPosition(balloon);
|
| + // Ensure that balloon width is greater than the panel width.
|
| + EXPECT_GT(balloon->GetViewSize().width(), kPanelWidth);
|
| +
|
| + // Creating a short panel should move the notification balloon up.
|
| + Panel* panel1 = CreatePanelWithBounds(
|
| + "Panel1", gfx::Rect(0, 0, kPanelWidth, kShortPanelHeight));
|
| + int balloon_bottom_after_short_panel_created =
|
| + GetBalloonBottomPosition(balloon);
|
| + EXPECT_LT(balloon_bottom_after_short_panel_created, panel1->GetBounds().y());
|
| + EXPECT_LT(balloon_bottom_after_short_panel_created, original_balloon_bottom);
|
| +
|
| + // Creating another tall panel should move the notification balloon further
|
| + // up.
|
| + Panel* panel2 = CreatePanelWithBounds(
|
| + "Panel2", gfx::Rect(0, 0, kPanelWidth, kTallPanelHeight));
|
| + int balloon_bottom_after_tall_panel_created =
|
| + GetBalloonBottomPosition(balloon);
|
| + EXPECT_LT(balloon_bottom_after_tall_panel_created, panel2->GetBounds().y());
|
| + EXPECT_LT(balloon_bottom_after_tall_panel_created,
|
| + balloon_bottom_after_short_panel_created);
|
| +
|
| + // Minimizing tall panel should move the notification balloon down to the same
|
| + // position when short panel is first created.
|
| + panel2->SetExpansionState(Panel::MINIMIZED);
|
| + WaitForBoundsAnimationFinished(panel2);
|
| + int balloon_bottom_after_tall_panel_minimized =
|
| + GetBalloonBottomPosition(balloon);
|
| + EXPECT_EQ(balloon_bottom_after_short_panel_created,
|
| + balloon_bottom_after_tall_panel_minimized);
|
| +
|
| + // Minimizing short panel should move the notification balloon further down.
|
| + panel1->SetExpansionState(Panel::MINIMIZED);
|
| + WaitForBoundsAnimationFinished(panel1);
|
| + int balloon_bottom_after_both_panels_minimized =
|
| + GetBalloonBottomPosition(balloon);
|
| + EXPECT_LT(balloon_bottom_after_both_panels_minimized,
|
| + panel1->GetBounds().y());
|
| + EXPECT_LT(balloon_bottom_after_both_panels_minimized,
|
| + panel2->GetBounds().y());
|
| + EXPECT_LT(balloon_bottom_after_short_panel_created,
|
| + balloon_bottom_after_both_panels_minimized);
|
| + EXPECT_LT(balloon_bottom_after_both_panels_minimized,
|
| + original_balloon_bottom);
|
| +
|
| + // Bringing up the titlebar for tall panel should move the notification
|
| + // balloon up a little bit.
|
| + panel2->SetExpansionState(Panel::TITLE_ONLY);
|
| + WaitForBoundsAnimationFinished(panel2);
|
| + int balloon_bottom_after_tall_panel_titlebar_up =
|
| + GetBalloonBottomPosition(balloon);
|
| + EXPECT_LT(balloon_bottom_after_tall_panel_titlebar_up,
|
| + panel2->GetBounds().y());
|
| + EXPECT_LT(balloon_bottom_after_tall_panel_titlebar_up,
|
| + balloon_bottom_after_both_panels_minimized);
|
| + EXPECT_LT(balloon_bottom_after_short_panel_created,
|
| + balloon_bottom_after_tall_panel_titlebar_up);
|
| +
|
| + // Expanding short panel should move the notification balloon further up to
|
| + // the same position when short panel is first created.
|
| + panel1->SetExpansionState(Panel::EXPANDED);
|
| + WaitForBoundsAnimationFinished(panel1);
|
| + int balloon_bottom_after_short_panel_expanded =
|
| + GetBalloonBottomPosition(balloon);
|
| + EXPECT_EQ(balloon_bottom_after_short_panel_created,
|
| + balloon_bottom_after_short_panel_expanded);
|
| +
|
| + // Closing short panel should move the notification balloon down to the same
|
| + // position when tall panel brings up its titlebar.
|
| + CloseWindowAndWait(panel1->browser());
|
| + EXPECT_EQ(balloon_bottom_after_tall_panel_titlebar_up,
|
| + GetBalloonBottomPosition(balloon));
|
| +
|
| + // Closing the remaining tall panel should move the notification balloon back
|
| + // to its original position.
|
| + CloseWindowAndWait(panel2->browser());
|
| + EXPECT_EQ(original_balloon_bottom, GetBalloonBottomPosition(balloon));
|
| +}
|
|
|