Index: chrome/browser/ui/panels/old_panel_and_desktop_notification_browsertest.cc |
diff --git a/chrome/browser/ui/panels/old_panel_and_desktop_notification_browsertest.cc b/chrome/browser/ui/panels/old_panel_and_desktop_notification_browsertest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..44128bf04dcbe6f7270ece85cc1c5536646cad14 |
--- /dev/null |
+++ b/chrome/browser/ui/panels/old_panel_and_desktop_notification_browsertest.cc |
@@ -0,0 +1,408 @@ |
+// 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 "base/utf_string_conversions.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/notifications/balloon.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/pref_service.h" |
+#include "chrome/browser/ui/browser.h" |
+#include "chrome/browser/ui/panels/base_panel_browser_test.h" |
+#include "chrome/browser/ui/panels/panel.h" |
+#include "chrome/browser/ui/panels/panel_manager.h" |
+#include "chrome/browser/ui/panels/test_panel_mouse_watcher.h" |
+#include "chrome/common/pref_names.h" |
+#include "content/public/common/show_desktop_notification_params.h" |
+#include "ui/gfx/screen.h" |
+ |
+// Desktop notification code subscribes to various panel change notifications |
+// so that it knows when to adjusts balloon positions. In order to give |
+// desktop notification code a chance to process the change notifications, |
+// we call MessageLoopForUI::current()->RunAllPending() after any panel change |
+// has been made. |
+class PanelAndDesktopNotificationTest : public BasePanelBrowserTest { |
+ public: |
+ PanelAndDesktopNotificationTest() : BasePanelBrowserTest() { |
+ } |
+ |
+ virtual ~PanelAndDesktopNotificationTest() { |
+ } |
+ |
+ virtual void SetUpOnMainThread() OVERRIDE { |
+ // Do not use our own testing work area since desktop notification code |
+ // does not have the hook up for testing work area. |
+ disable_display_settings_mock(); |
+ |
+ BasePanelBrowserTest::SetUpOnMainThread(); |
+ |
+ 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())); |
+ } |
+ |
+ virtual void CleanUpOnMainThread() OVERRIDE { |
+ balloons_->RemoveAll(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ |
+ service_.reset(); |
+ ui_manager_.reset(); |
+ |
+ BasePanelBrowserTest::CleanUpOnMainThread(); |
+ } |
+ |
+ content::ShowDesktopNotificationHostMsgParams StandardTestNotification() { |
+ content::ShowDesktopNotificationHostMsgParams 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; |
+ } |
+ |
+ Balloon* CreateBalloon() { |
+ content::ShowDesktopNotificationHostMsgParams params = |
+ StandardTestNotification(); |
+ EXPECT_TRUE(service()->ShowDesktopNotification( |
+ params, 0, 0, DesktopNotificationService::PageNotification)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ return balloons().front(); |
+ } |
+ |
+ static int GetBalloonBottomPosition(Balloon* balloon) { |
+#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::GetPrimaryMonitor().size(); |
+ return screen_size.height() - balloon->GetPosition().y(); |
+#else |
+ return balloon->GetPosition().y() + balloon->GetViewSize().height(); |
+#endif |
+ } |
+ |
+ static void DragPanelToMouseLocation(Panel* panel, |
+ const gfx::Point& new_mouse_location) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ panel_manager->StartDragging(panel, panel->GetBounds().origin()); |
+ panel_manager->Drag(new_mouse_location); |
+ panel_manager->EndDragging(false); |
+ } |
+ |
+ static void ResizePanelByMouseWithDelta(Panel* panel, |
+ panel::ResizingSides side, |
+ const gfx::Point& delta) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ gfx::Point mouse_location = panel->GetBounds().origin(); |
+ panel_manager->StartResizingByMouse(panel, mouse_location, side); |
+ panel_manager->ResizeByMouse(mouse_location.Add(delta)); |
+ panel_manager->EndResizingByMouse(false); |
+ } |
+ |
+ 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(PanelAndDesktopNotificationTest, AddAndClosePanel) { |
+ Balloon* balloon = CreateBalloon(); |
+ int original_balloon_bottom = GetBalloonBottomPosition(balloon); |
+ |
+ // Create a docked panel. Expect that the notification balloon moves up to be |
+ // above the panel. |
+ Panel* panel = CreateDockedPanel("1", gfx::Rect(0, 0, 200, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom, panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom, original_balloon_bottom); |
+ |
+ // Close the panel. Expect the notification balloon moves back to its original |
+ // position. |
+ panel->Close(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ EXPECT_EQ(original_balloon_bottom, GetBalloonBottomPosition(balloon)); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelAndDesktopNotificationTest, |
+ ExpandAndCollapsePanel) { |
+ // Disable mouse watcher since we don't want mouse movements to affect panel |
+ // testing for title-only state. |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ PanelMouseWatcher* mouse_watcher = new TestPanelMouseWatcher(); |
+ panel_manager->SetMouseWatcherForTesting(mouse_watcher); |
+ |
+ Balloon* balloon = CreateBalloon(); |
+ |
+ // Create a docked panel. Expect that the notification balloon moves up to be |
+ // above the panel. |
+ Panel* panel = CreateDockedPanel("1", gfx::Rect(0, 0, 200, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_on_expanded = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_on_expanded, panel->GetBounds().y()); |
+ |
+ // Minimize the panel. Expect that the notification balloon moves down, but |
+ // still above the minimized panel. |
+ panel->Minimize(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_on_minimized = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_on_minimized, panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom_on_expanded, balloon_bottom_on_minimized); |
+ |
+ // Bring up the title-bar for the panel by drawing attention. Expect that the |
+ // notification balloon moves up a little bit to be still above the title-only |
+ // panel. |
+ panel->FlashFrame(true); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_on_title_only = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_on_title_only, panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom_on_title_only, balloon_bottom_on_minimized); |
+ EXPECT_LT(balloon_bottom_on_expanded, balloon_bottom_on_title_only); |
+ |
+ // Expand the panel. Expect that the notification balloon moves up to go back |
+ // to the same position when the panel is expanded. |
+ panel->Restore(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ EXPECT_EQ(balloon_bottom_on_expanded, GetBalloonBottomPosition(balloon)); |
+ |
+ PanelManager::GetInstance()->CloseAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelAndDesktopNotificationTest, DragNarrowPanel) { |
+ Balloon* balloon = CreateBalloon(); |
+ |
+ // Let the panel width be smaller than the balloon width. |
+ int panel_width = balloon->GetViewSize().width() - 50; |
+ |
+ // Create 2 docked panels. Expect that the notification balloon moves up to be |
+ // above the tall panel. |
+ Panel* tall_panel = CreateDockedPanel("1", gfx::Rect(0, 0, panel_width, 300)); |
+ Panel* short_panel = CreateDockedPanel( |
+ "2", gfx::Rect(0, 0, panel_width, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom, tall_panel->GetBounds().y()); |
+ |
+ // Swap 2 docked panels by dragging. Expect that the notificaition balloon |
+ // remains at the same position. |
+ DragPanelToMouseLocation(tall_panel, short_panel->GetBounds().origin()); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ EXPECT_EQ(balloon_bottom, GetBalloonBottomPosition(balloon)); |
+ |
+ PanelManager::GetInstance()->CloseAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelAndDesktopNotificationTest, DragWidePanel) { |
+ Balloon* balloon = CreateBalloon(); |
+ |
+ // Let the panel width be greater than the balloon width. |
+ int panel_width = balloon->GetViewSize().width() + 50; |
+ |
+ // Create 2 docked panels. Expect that the notification balloon moves up to be |
+ // above the tall panel. |
+ Panel* tall_panel = CreateDockedPanel("1", gfx::Rect(0, 0, panel_width, 300)); |
+ Panel* short_panel = CreateDockedPanel( |
+ "2", gfx::Rect(0, 0, panel_width, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_before_drag = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_before_drag, tall_panel->GetBounds().y()); |
+ |
+ // Swap 2 docked panels by dragging. Expect that the notificaiton balloon |
+ // moves down to be just above the short panel. |
+ DragPanelToMouseLocation(tall_panel, short_panel->GetBounds().origin()); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_after_drag = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_after_drag, short_panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom_before_drag, balloon_bottom_after_drag); |
+ |
+ PanelManager::GetInstance()->CloseAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelAndDesktopNotificationTest, DetachAndAttachPanel) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ Balloon* balloon = CreateBalloon(); |
+ int original_balloon_bottom = GetBalloonBottomPosition(balloon); |
+ |
+ // Create a docked panel. Expect that the notification balloon moves up to be |
+ // above the panel. |
+ Panel* panel = CreateDockedPanel("1", gfx::Rect(0, 0, 200, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_after_panel_created = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_after_panel_created, panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom_after_panel_created, original_balloon_bottom); |
+ |
+ // Detach the panel. Expect that the notification balloon moves down to its |
+ // original position. |
+ panel_manager->MovePanelToStrip( |
+ panel, PanelStrip::DETACHED, PanelStrip::DEFAULT_POSITION); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ EXPECT_EQ(PanelStrip::DETACHED, panel->panel_strip()->type()); |
+ EXPECT_EQ(original_balloon_bottom, GetBalloonBottomPosition(balloon)); |
+ |
+ // Reattach the panel. Expect that the notification balloon moves above the |
+ // panel. |
+ panel_manager->MovePanelToStrip( |
+ panel, PanelStrip::DOCKED, PanelStrip::DEFAULT_POSITION); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ EXPECT_EQ(PanelStrip::DOCKED, panel->panel_strip()->type()); |
+ EXPECT_EQ(balloon_bottom_after_panel_created, |
+ GetBalloonBottomPosition(balloon)); |
+ |
+ panel_manager->CloseAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelAndDesktopNotificationTest, ResizePanel) { |
+ PanelManager* panel_manager = PanelManager::GetInstance(); |
+ Balloon* balloon = CreateBalloon(); |
+ |
+ // Create a docked panel. Expect that the notification balloon moves up to be |
+ // above the panel. |
+ Panel* panel = CreateDockedPanel("1", gfx::Rect(0, 0, 200, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom = GetBalloonBottomPosition(balloon); |
+ gfx::Rect original_bounds = panel->GetBounds(); |
+ EXPECT_LT(balloon_bottom, original_bounds.y()); |
+ |
+ // Resize the panel to make it taller. Expect that the notification balloon |
+ // moves further up by the amount of enlarge offset. |
+ gfx::Point resize_delta(50, 100); |
+ gfx::Rect new_bounds = original_bounds; |
+ new_bounds.set_width(new_bounds.width() + resize_delta.x()); |
+ new_bounds.set_height(new_bounds.height() + resize_delta.y()); |
+ panel->SetBounds(new_bounds); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom2 = GetBalloonBottomPosition(balloon); |
+ EXPECT_EQ(balloon_bottom - resize_delta.y(), balloon_bottom2); |
+ |
+ // Resize the panel to make it shorter. Expect that the notification balloon |
+ // moves down by the amount of shrink offset. |
+ resize_delta = gfx::Point(0, -60); |
+ new_bounds.set_width(new_bounds.width() + resize_delta.x()); |
+ new_bounds.set_height(new_bounds.height() + resize_delta.y()); |
+ panel->SetBounds(new_bounds); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom3 = GetBalloonBottomPosition(balloon); |
+ EXPECT_EQ(balloon_bottom2 - resize_delta.y(), balloon_bottom3); |
+ |
+ panel_manager->CloseAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelAndDesktopNotificationTest, ResizePanelByMouse) { |
+ Balloon* balloon = CreateBalloon(); |
+ |
+ // Create a docked panel. Expect that the notification balloon moves up to be |
+ // above the panel. |
+ Panel* panel = CreateDockedPanel("1", gfx::Rect(0, 0, 200, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom = GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom, panel->GetBounds().y()); |
+ |
+ // Resize the panel to make it taller. Expect that the notification balloon |
+ // moves further up by the amount of enlarge offset. |
+ gfx::Point drag_delta(-50, -100); |
+ ResizePanelByMouseWithDelta(panel, panel::RESIZE_TOP_LEFT, drag_delta); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom2 = GetBalloonBottomPosition(balloon); |
+ EXPECT_EQ(balloon_bottom + drag_delta.y(), balloon_bottom2); |
+ |
+ // Resize the panel to make it shorter. Expect that the notification balloon |
+ // moves down by the amount of shrink offset. |
+ drag_delta = gfx::Point(0, 60); |
+ ResizePanelByMouseWithDelta(panel, panel::RESIZE_TOP, drag_delta); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom3 = GetBalloonBottomPosition(balloon); |
+ EXPECT_EQ(balloon_bottom2 + drag_delta.y(), balloon_bottom3); |
+ |
+ PanelManager::GetInstance()->CloseAll(); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(PanelAndDesktopNotificationTest, InteractWithTwoPanels) { |
+ Balloon* balloon = CreateBalloon(); |
+ int original_balloon_bottom = GetBalloonBottomPosition(balloon); |
+ |
+ // Let the panel width be smaller than the balloon width. |
+ int panel_width = balloon->GetViewSize().width() - 50; |
+ |
+ // Create a short panel. Expect that the notification balloon moves up to be |
+ // above the short panel. |
+ Panel* short_panel = CreateDockedPanel( |
+ "1", gfx::Rect(0, 0, panel_width, 150)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_after_short_panel_created = |
+ GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_after_short_panel_created, |
+ short_panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom_after_short_panel_created, original_balloon_bottom); |
+ |
+ // Create a tall panel. Expect that the notification balloon moves further up |
+ // to be above the tall panel. |
+ Panel* tall_panel = CreateDockedPanel("2", gfx::Rect(0, 0, panel_width, 200)); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_after_tall_panel_created = |
+ GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_after_tall_panel_created, |
+ tall_panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom_after_tall_panel_created, |
+ balloon_bottom_after_short_panel_created); |
+ |
+ // Minimize tall panel. Expect that the notification balloon moves down to the |
+ // same position when short panel is first created. |
+ tall_panel->Minimize(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_after_tall_panel_minimized = |
+ GetBalloonBottomPosition(balloon); |
+ EXPECT_EQ(balloon_bottom_after_short_panel_created, |
+ balloon_bottom_after_tall_panel_minimized); |
+ |
+ // Minimize short panel. Expect that the notification balloon moves further |
+ // down. |
+ short_panel->Minimize(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_after_both_panels_minimized = |
+ GetBalloonBottomPosition(balloon); |
+ EXPECT_LT(balloon_bottom_after_both_panels_minimized, |
+ short_panel->GetBounds().y()); |
+ EXPECT_LT(balloon_bottom_after_both_panels_minimized, |
+ tall_panel->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); |
+ |
+ // Expand short panel. Expect that the notification balloon moves further up |
+ // to the same position when short panel is first created. |
+ short_panel->Restore(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ int balloon_bottom_after_short_panel_expanded = |
+ GetBalloonBottomPosition(balloon); |
+ EXPECT_EQ(balloon_bottom_after_short_panel_created, |
+ balloon_bottom_after_short_panel_expanded); |
+ |
+ // Close tall panel. Expect that the notification balloon moves down to the |
+ // same position when short panel is first created. |
+ tall_panel->Close(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ EXPECT_EQ(balloon_bottom_after_short_panel_created, |
+ GetBalloonBottomPosition(balloon)); |
+ |
+ // Close short panel. Expect that the notification balloo moves back to its |
+ // original position. |
+ short_panel->Close(); |
+ MessageLoopForUI::current()->RunAllPending(); |
+ EXPECT_EQ(original_balloon_bottom, GetBalloonBottomPosition(balloon)); |
+} |