summaryrefslogtreecommitdiffstats
path: root/ash/wm/panels/panel_layout_manager_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ash/wm/panels/panel_layout_manager_unittest.cc')
-rw-r--r--ash/wm/panels/panel_layout_manager_unittest.cc549
1 files changed, 549 insertions, 0 deletions
diff --git a/ash/wm/panels/panel_layout_manager_unittest.cc b/ash/wm/panels/panel_layout_manager_unittest.cc
new file mode 100644
index 0000000..a7a7a6e
--- /dev/null
+++ b/ash/wm/panels/panel_layout_manager_unittest.cc
@@ -0,0 +1,549 @@
+// 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 "ash/wm/panels/panel_layout_manager.h"
+
+#include "ash/ash_switches.h"
+#include "ash/launcher/launcher.h"
+#include "ash/launcher/launcher_button.h"
+#include "ash/launcher/launcher_model.h"
+#include "ash/launcher/launcher_view.h"
+#include "ash/screen_ash.h"
+#include "ash/shelf_types.h"
+#include "ash/shell.h"
+#include "ash/shell_window_ids.h"
+#include "ash/test/ash_test_base.h"
+#include "ash/test/launcher_view_test_api.h"
+#include "ash/test/shell_test_api.h"
+#include "ash/test/test_launcher_delegate.h"
+#include "ash/wm/window_util.h"
+#include "base/basictypes.h"
+#include "base/command_line.h"
+#include "base/compiler_specific.h"
+#include "ui/aura/client/aura_constants.h"
+#include "ui/aura/root_window.h"
+#include "ui/aura/test/event_generator.h"
+#include "ui/aura/test/test_windows.h"
+#include "ui/aura/window.h"
+#include "ui/views/corewm/corewm_switches.h"
+#include "ui/views/widget/widget.h"
+
+namespace ash {
+namespace internal {
+
+using aura::test::WindowIsAbove;
+
+class PanelLayoutManagerTest : public test::AshTestBase {
+ public:
+ PanelLayoutManagerTest() {}
+ virtual ~PanelLayoutManagerTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ test::AshTestBase::SetUp();
+ ASSERT_TRUE(test::TestLauncherDelegate::instance());
+
+ launcher_view_test_.reset(new test::LauncherViewTestAPI(
+ Launcher::ForPrimaryDisplay()->GetLauncherViewForTest()));
+ launcher_view_test_->SetAnimationDuration(1);
+ }
+
+ aura::Window* CreateNormalWindow() {
+ return CreateTestWindowInShellWithBounds(gfx::Rect());
+ }
+
+ aura::Window* CreatePanelWindow(const gfx::Rect& bounds) {
+ aura::Window* window = CreateTestWindowInShellWithDelegateAndType(
+ NULL,
+ aura::client::WINDOW_TYPE_PANEL,
+ 0,
+ bounds);
+ test::TestLauncherDelegate* launcher_delegate =
+ test::TestLauncherDelegate::instance();
+ launcher_delegate->AddLauncherItem(window);
+ PanelLayoutManager* manager =
+ static_cast<PanelLayoutManager*>(GetPanelContainer()->layout_manager());
+ manager->Relayout();
+ return window;
+ }
+
+ aura::Window* GetPanelContainer() {
+ return Shell::GetContainer(
+ Shell::GetPrimaryRootWindow(),
+ internal::kShellWindowId_PanelContainer);
+ }
+
+ views::Widget* GetCalloutWidgetForPanel(aura::Window* panel) {
+ PanelLayoutManager* manager =
+ static_cast<PanelLayoutManager*>(GetPanelContainer()->layout_manager());
+ DCHECK(manager);
+ PanelLayoutManager::PanelList::iterator found = std::find(
+ manager->panel_windows_.begin(), manager->panel_windows_.end(),
+ panel);
+ DCHECK(found != manager->panel_windows_.end());
+ DCHECK(found->callout_widget);
+ return reinterpret_cast<views::Widget*>(found->callout_widget);
+ }
+
+ void PanelInScreen(aura::Window* panel) {
+ gfx::Rect panel_bounds = panel->GetBoundsInRootWindow();
+ gfx::Point root_point = gfx::Point(panel_bounds.x(), panel_bounds.y());
+ gfx::Display display = ScreenAsh::FindDisplayContainingPoint(root_point);
+
+ gfx::Rect panel_bounds_in_screen = panel->GetBoundsInScreen();
+ gfx::Point screen_bottom_right = gfx::Point(
+ panel_bounds_in_screen.right(),
+ panel_bounds_in_screen.bottom());
+ gfx::Rect display_bounds = display.bounds();
+ EXPECT_TRUE(screen_bottom_right.x() < display_bounds.width() &&
+ screen_bottom_right.y() < display_bounds.height());
+ }
+
+ void PanelsNotOverlapping(aura::Window* panel1, aura::Window* panel2) {
+ // Waits until all launcher view animations are done.
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+ gfx::Rect window1_bounds = panel1->GetBoundsInRootWindow();
+ gfx::Rect window2_bounds = panel2->GetBoundsInRootWindow();
+
+ EXPECT_FALSE(window1_bounds.Intersects(window2_bounds));
+ }
+
+ // TODO(dcheng): This should be const, but GetScreenBoundsOfItemIconForWindow
+ // takes a non-const Window. We can probably fix that.
+ void IsPanelAboveLauncherIcon(aura::Window* panel) {
+ // Waits until all launcher view animations are done.
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+
+ Launcher* launcher = Launcher::ForPrimaryDisplay();
+ gfx::Rect icon_bounds = launcher->GetScreenBoundsOfItemIconForWindow(panel);
+ ASSERT_FALSE(icon_bounds.IsEmpty());
+
+ gfx::Rect window_bounds = panel->GetBoundsInRootWindow();
+ gfx::Rect launcher_bounds = launcher->widget()->GetWindowBoundsInScreen();
+ ShelfAlignment alignment = GetAlignment();
+
+ if (IsHorizontal(alignment)) {
+ // The horizontal bounds of the panel window should contain the bounds of
+ // the launcher icon.
+ EXPECT_LE(window_bounds.x(), icon_bounds.x());
+ EXPECT_GE(window_bounds.right(), icon_bounds.right());
+ } else {
+ // The vertical bounds of the panel window should contain the bounds of
+ // the launcher icon.
+ EXPECT_LE(window_bounds.y(), icon_bounds.y());
+ EXPECT_GE(window_bounds.bottom(), icon_bounds.bottom());
+ }
+
+ switch (alignment) {
+ case SHELF_ALIGNMENT_BOTTOM:
+ EXPECT_EQ(launcher_bounds.y(), window_bounds.bottom());
+ break;
+ case SHELF_ALIGNMENT_LEFT:
+ EXPECT_EQ(launcher_bounds.right(), window_bounds.x());
+ break;
+ case SHELF_ALIGNMENT_RIGHT:
+ EXPECT_EQ(launcher_bounds.x(), window_bounds.right());
+ break;
+ case SHELF_ALIGNMENT_TOP:
+ EXPECT_EQ(launcher_bounds.bottom(), window_bounds.y());
+ break;
+ }
+ }
+
+ void IsCalloutAboveLauncherIcon(aura::Window* panel) {
+ // Flush the message loop, since callout updates use a delayed task.
+ MessageLoop::current()->RunUntilIdle();
+ views::Widget* widget = GetCalloutWidgetForPanel(panel);
+
+ Launcher* launcher = Launcher::ForPrimaryDisplay();
+ gfx::Rect icon_bounds = launcher->GetScreenBoundsOfItemIconForWindow(panel);
+ gfx::Rect panel_bounds = panel->GetBoundsInRootWindow();
+ gfx::Rect callout_bounds = widget->GetWindowBoundsInScreen();
+ ASSERT_FALSE(icon_bounds.IsEmpty());
+
+ EXPECT_TRUE(widget->IsVisible());
+
+ ShelfAlignment alignment = GetAlignment();
+ switch (alignment) {
+ case SHELF_ALIGNMENT_BOTTOM:
+ EXPECT_EQ(panel_bounds.bottom(), callout_bounds.y());
+ break;
+ case SHELF_ALIGNMENT_LEFT:
+ EXPECT_EQ(panel_bounds.x(), callout_bounds.right());
+ break;
+ case SHELF_ALIGNMENT_RIGHT:
+ EXPECT_EQ(panel_bounds.right(), callout_bounds.x());
+ break;
+ case SHELF_ALIGNMENT_TOP:
+ EXPECT_EQ(panel_bounds.y(), callout_bounds.bottom());
+ break;
+ }
+
+ if (IsHorizontal(alignment)) {
+ EXPECT_NEAR(icon_bounds.CenterPoint().x(),
+ widget->GetWindowBoundsInScreen().CenterPoint().x(),
+ 1);
+ } else {
+ EXPECT_NEAR(icon_bounds.CenterPoint().y(),
+ widget->GetWindowBoundsInScreen().CenterPoint().y(),
+ 1);
+ }
+ }
+
+ bool IsPanelCalloutVisible(aura::Window* panel) {
+ views::Widget* widget = GetCalloutWidgetForPanel(panel);
+ return widget->IsVisible();
+ }
+
+ test::LauncherViewTestAPI* launcher_view_test() {
+ return launcher_view_test_.get();
+ }
+
+ // Clicks the launcher items on |launcher_view| that is
+ /// associated with given |window|.
+ void ClickLauncherItemForWindow(LauncherView* launcher_view,
+ aura::Window* window) {
+ test::LauncherViewTestAPI test_api(launcher_view);
+ test_api.SetAnimationDuration(1);
+
+ LauncherModel* model =
+ test::ShellTestApi(Shell::GetInstance()).launcher_model();
+ test::TestLauncherDelegate* launcher_delegate =
+ test::TestLauncherDelegate::instance();
+ int index = model->ItemIndexByID(launcher_delegate->GetIDByWindow(window));
+ gfx::Rect bounds = test_api.GetButton(index)->GetBoundsInScreen();
+
+ aura::test::EventGenerator& event_generator = GetEventGenerator();
+ event_generator.MoveMouseTo(bounds.CenterPoint());
+ event_generator.ClickLeftButton();
+
+ test_api.RunMessageLoopUntilAnimationsDone();
+ }
+
+ void SetAlignment(ShelfAlignment alignment) {
+ ash::Shell* shell = ash::Shell::GetInstance();
+ shell->SetShelfAlignment(alignment, shell->GetPrimaryRootWindow());
+ }
+
+ ShelfAlignment GetAlignment() {
+ ash::Shell* shell = ash::Shell::GetInstance();
+ return shell->GetShelfAlignment(shell->GetPrimaryRootWindow());
+ }
+
+ private:
+ scoped_ptr<test::LauncherViewTestAPI> launcher_view_test_;
+
+ bool IsHorizontal(ShelfAlignment alignment) {
+ return alignment == SHELF_ALIGNMENT_BOTTOM ||
+ alignment == SHELF_ALIGNMENT_TOP;
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(PanelLayoutManagerTest);
+};
+
+// Tests that a created panel window is successfully added to the panel
+// layout manager.
+TEST_F(PanelLayoutManagerTest, AddOnePanel) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> window(CreatePanelWindow(bounds));
+ EXPECT_EQ(GetPanelContainer(), window->parent());
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(window.get()));
+}
+
+// Tests interactions between multiple panels
+TEST_F(PanelLayoutManagerTest, MultiplePanelsAreAboveIcons) {
+ gfx::Rect odd_bounds(0, 0, 201, 201);
+ gfx::Rect even_bounds(0, 0, 200, 200);
+
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(odd_bounds));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get()));
+
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(even_bounds));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get()));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get()));
+
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(odd_bounds));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get()));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get()));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get()));
+}
+
+TEST_F(PanelLayoutManagerTest, MultiplePanelStacking) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(bounds));
+
+ // Default stacking order.
+ EXPECT_TRUE(WindowIsAbove(w3.get(), w2.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get()));
+
+ // Changing the active window should update the stacking order.
+ wm::ActivateWindow(w1.get());
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+ EXPECT_TRUE(WindowIsAbove(w1.get(), w2.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get()));
+
+ wm::ActivateWindow(w2.get());
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+ EXPECT_TRUE(WindowIsAbove(w1.get(), w3.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get()));
+
+ wm::ActivateWindow(w3.get());
+ EXPECT_TRUE(WindowIsAbove(w3.get(), w2.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get()));
+}
+
+TEST_F(PanelLayoutManagerTest, MultiplePanelCallout) {
+ gfx::Rect bounds(0, 0, 200, 200);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w4(CreateNormalWindow());
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+ EXPECT_TRUE(IsPanelCalloutVisible(w1.get()));
+ EXPECT_TRUE(IsPanelCalloutVisible(w2.get()));
+ EXPECT_TRUE(IsPanelCalloutVisible(w3.get()));
+ wm::ActivateWindow(w1.get());
+ EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w1.get()));
+ wm::ActivateWindow(w2.get());
+ EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w2.get()));
+ wm::ActivateWindow(w3.get());
+ EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w3.get()));
+ wm::ActivateWindow(w4.get());
+ wm::ActivateWindow(w3.get());
+ EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w3.get()));
+ w3.reset();
+ if (views::corewm::UseFocusController())
+ EXPECT_NO_FATAL_FAILURE(IsCalloutAboveLauncherIcon(w2.get()));
+}
+
+// Tests removing panels.
+TEST_F(PanelLayoutManagerTest, RemoveLeftPanel) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(bounds));
+
+ // At this point, windows should be stacked with 1 < 2 < 3
+ wm::ActivateWindow(w1.get());
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+ // Now, windows should be stacked 1 > 2 > 3
+ w1.reset();
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get()));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get()));
+}
+
+TEST_F(PanelLayoutManagerTest, RemoveMiddlePanel) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(bounds));
+
+ // At this point, windows should be stacked with 1 < 2 < 3
+ wm::ActivateWindow(w2.get());
+ // Windows should be stacked 1 < 2 > 3
+ w2.reset();
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get()));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get()));
+ EXPECT_TRUE(WindowIsAbove(w3.get(), w1.get()));
+}
+
+TEST_F(PanelLayoutManagerTest, RemoveRightPanel) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(bounds));
+
+ // At this point, windows should be stacked with 1 < 2 < 3
+ wm::ActivateWindow(w3.get());
+ // Order shouldn't change.
+ w3.reset();
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w1.get()));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w1.get()));
+}
+
+TEST_F(PanelLayoutManagerTest, RemoveNonActivePanel) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(bounds));
+
+ // At this point, windows should be stacked with 1 < 2 < 3
+ wm::ActivateWindow(w2.get());
+ // Windows should be stacked 1 < 2 > 3
+ w1.reset();
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w2.get()));
+ EXPECT_NO_FATAL_FAILURE(IsPanelAboveLauncherIcon(w3.get()));
+ EXPECT_TRUE(WindowIsAbove(w2.get(), w3.get()));
+}
+
+TEST_F(PanelLayoutManagerTest, SplitView) {
+ gfx::Rect bounds(0, 0, 90, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+
+ EXPECT_NO_FATAL_FAILURE(PanelsNotOverlapping(w1.get(), w2.get()));
+}
+
+#if defined(OS_WIN)
+// RootWindow and Display can't resize on Windows Ash. http://crbug.com/165962
+#define MAYBE_SplitViewOverlapWhenLarge DISABLED_SplitViewOverlapWhenLarge
+#else
+#define MAYBE_SplitViewOverlapWhenLarge SplitViewOverlapWhenLarge
+#endif
+
+TEST_F(PanelLayoutManagerTest, MAYBE_SplitViewOverlapWhenLarge) {
+ gfx::Rect bounds(0, 0, 600, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+
+ EXPECT_NO_FATAL_FAILURE(PanelInScreen(w1.get()));
+ EXPECT_NO_FATAL_FAILURE(PanelInScreen(w2.get()));
+}
+
+TEST_F(PanelLayoutManagerTest, FanWindows) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w1(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w2(CreatePanelWindow(bounds));
+ scoped_ptr<aura::Window> w3(CreatePanelWindow(bounds));
+
+ launcher_view_test()->RunMessageLoopUntilAnimationsDone();
+ int window_x1 = w1->GetBoundsInRootWindow().x();
+ int window_x2 = w2->GetBoundsInRootWindow().x();
+ int window_x3 = w3->GetBoundsInRootWindow().x();
+ Launcher* launcher = Launcher::ForPrimaryDisplay();
+ int icon_x1 = launcher->GetScreenBoundsOfItemIconForWindow(w1.get()).x();
+ int icon_x2 = launcher->GetScreenBoundsOfItemIconForWindow(w2.get()).x();
+ EXPECT_EQ(window_x2 - window_x1, window_x3 - window_x2);
+ int spacing = window_x2 - window_x1;
+ EXPECT_GT(spacing, icon_x2 - icon_x1);
+}
+
+TEST_F(PanelLayoutManagerTest, MinimizeRestorePanel) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> window(CreatePanelWindow(bounds));
+ // Activate the window, ensure callout is visible.
+ wm::ActivateWindow(window.get());
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(IsPanelCalloutVisible(window.get()));
+ // Minimize the panel, callout should be hidden.
+ window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED);
+ RunAllPendingInMessageLoop();
+ EXPECT_FALSE(IsPanelCalloutVisible(window.get()));
+ // Restore the pantel; panel should not be activated by default but callout
+ // should be visible.
+ window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL);
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(IsPanelCalloutVisible(window.get()));
+ // Activate the window, ensure callout is visible.
+ wm::ActivateWindow(window.get());
+ RunAllPendingInMessageLoop();
+ EXPECT_TRUE(IsPanelCalloutVisible(window.get()));
+}
+
+#if defined(OS_WIN)
+// Multiple displays aren't supported on Windows Metro/Ash.
+// http://crbug.com/165962
+#define MAYBE_PanelMoveBetweenMultipleDisplays \
+ DISABLED_PanelMoveBetweenMultipleDisplays
+#else
+#define MAYBE_PanelMoveBetweenMultipleDisplays PanelMoveBetweenMultipleDisplays
+#endif
+
+TEST_F(PanelLayoutManagerTest, MAYBE_PanelMoveBetweenMultipleDisplays) {
+ // Keep the displays wide so that launchers have enough
+ // spaces for launcher buttons.
+ UpdateDisplay("500x400,500x400");
+ Shell::RootWindowList root_windows = Shell::GetAllRootWindows();
+
+ scoped_ptr<aura::Window> p1_d1(CreatePanelWindow(gfx::Rect(0, 0, 50, 50)));
+ scoped_ptr<aura::Window> p2_d1(CreatePanelWindow(gfx::Rect(0, 0, 50, 50)));
+ scoped_ptr<aura::Window> p1_d2(CreatePanelWindow(gfx::Rect(500, 0, 50, 50)));
+ scoped_ptr<aura::Window> p2_d2(CreatePanelWindow(gfx::Rect(500, 0, 50, 50)));
+
+ LauncherView* launcher_view_1st =
+ Launcher::ForPrimaryDisplay()->GetLauncherViewForTest();
+ LauncherView* launcher_view_2nd =
+ Launcher::ForWindow(root_windows[1])->GetLauncherViewForTest();
+
+ EXPECT_EQ(root_windows[0], p1_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[0], p2_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p1_d2->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p2_d2->GetRootWindow());
+
+ EXPECT_EQ(internal::kShellWindowId_PanelContainer, p1_d1->parent()->id());
+ EXPECT_EQ(internal::kShellWindowId_PanelContainer, p2_d1->parent()->id());
+ EXPECT_EQ(internal::kShellWindowId_PanelContainer, p1_d2->parent()->id());
+ EXPECT_EQ(internal::kShellWindowId_PanelContainer, p2_d2->parent()->id());
+
+ // Test a panel on 1st display.
+ // Clicking on the same display has no effect.
+ ClickLauncherItemForWindow(launcher_view_1st, p1_d1.get());
+ EXPECT_EQ(root_windows[0], p1_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[0], p2_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p1_d2->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p1_d2->GetRootWindow());
+ EXPECT_FALSE(root_windows[1]->GetBoundsInScreen().Contains(
+ p1_d1->GetBoundsInScreen()));
+
+ // Test if clicking on another display moves the panel to
+ // that display.
+ ClickLauncherItemForWindow(launcher_view_2nd, p1_d1.get());
+ EXPECT_EQ(root_windows[1], p1_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[0], p2_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p1_d2->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p2_d2->GetRootWindow());
+ EXPECT_TRUE(root_windows[1]->GetBoundsInScreen().Contains(
+ p1_d1->GetBoundsInScreen()));
+
+ // Test a panel on 2nd display.
+ // Clicking on the same display has no effect.
+ ClickLauncherItemForWindow(launcher_view_2nd, p1_d2.get());
+ EXPECT_EQ(root_windows[1], p1_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[0], p2_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p1_d2->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p2_d2->GetRootWindow());
+ EXPECT_TRUE(root_windows[1]->GetBoundsInScreen().Contains(
+ p1_d2->GetBoundsInScreen()));
+
+ // Test if clicking on another display moves the panel to
+ // that display.
+ ClickLauncherItemForWindow(launcher_view_1st, p1_d2.get());
+ EXPECT_EQ(root_windows[1], p1_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[0], p2_d1->GetRootWindow());
+ EXPECT_EQ(root_windows[0], p1_d2->GetRootWindow());
+ EXPECT_EQ(root_windows[1], p2_d2->GetRootWindow());
+ EXPECT_TRUE(root_windows[0]->GetBoundsInScreen().Contains(
+ p1_d2->GetBoundsInScreen()));
+}
+
+TEST_F(PanelLayoutManagerTest, AlignmentLeft) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w(CreatePanelWindow(bounds));
+ SetAlignment(SHELF_ALIGNMENT_LEFT);
+ IsPanelAboveLauncherIcon(w.get());
+ IsCalloutAboveLauncherIcon(w.get());
+}
+
+TEST_F(PanelLayoutManagerTest, AlignmentRight) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w(CreatePanelWindow(bounds));
+ SetAlignment(SHELF_ALIGNMENT_RIGHT);
+ IsPanelAboveLauncherIcon(w.get());
+ IsCalloutAboveLauncherIcon(w.get());
+}
+
+TEST_F(PanelLayoutManagerTest, AlignmentTop) {
+ gfx::Rect bounds(0, 0, 201, 201);
+ scoped_ptr<aura::Window> w(CreatePanelWindow(bounds));
+ SetAlignment(SHELF_ALIGNMENT_TOP);
+ IsPanelAboveLauncherIcon(w.get());
+ IsCalloutAboveLauncherIcon(w.get());
+}
+
+} // namespace internal
+} // namespace ash