| Index: ash/wm/overview/window_selector_unittest.cc
|
| diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc
|
| index af82c9d5f605d133e9cbc0220438d284cc1a9780..8607da3039fe6613a922a1d26d60ac9b4845b501 100644
|
| --- a/ash/wm/overview/window_selector_unittest.cc
|
| +++ b/ash/wm/overview/window_selector_unittest.cc
|
| @@ -11,6 +11,7 @@
|
| #include "ash/common/ash_switches.h"
|
| #include "ash/common/material_design/material_design_controller.h"
|
| #include "ash/common/shell_window_ids.h"
|
| +#include "ash/common/wm/dock/docked_window_layout_manager.h"
|
| #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
|
| #include "ash/common/wm/mru_window_tracker.h"
|
| #include "ash/common/wm/overview/scoped_transform_overview_window.h"
|
| @@ -616,14 +617,233 @@ TEST_P(WindowSelectorTest, BasicWithDocked) {
|
| ToggleOverview();
|
|
|
| EXPECT_FALSE(WindowsOverlapping(window1.get(), window2.get()));
|
| - // Docked windows stays the same.
|
| - EXPECT_EQ(docked_bounds.ToString(), docked1->GetBoundsInScreen().ToString());
|
| - EXPECT_FALSE(docked2->IsVisible());
|
|
|
| + gfx::Rect container_bounds = docked1->parent()->bounds();
|
| + ShelfWidget* shelf = Shell::GetPrimaryRootWindowController()->shelf_widget();
|
| + DockedWindowLayoutManager* manager =
|
| + DockedWindowLayoutManager::Get(WmWindowAura::Get(docked1.get()));
|
| +
|
| + if (ash::MaterialDesignController::IsOverviewMaterial()) {
|
| + // Docked windows get shown and transformed.
|
| + EXPECT_TRUE(docked2->IsVisible());
|
| +
|
| + // Docked area shrinks.
|
| + DockedWindowLayoutManager* manager =
|
| + DockedWindowLayoutManager::Get(WmWindowAura::Get(docked1.get()));
|
| + EXPECT_EQ(0, manager->docked_bounds().width());
|
| +
|
| + // Work area takes the whole screen minus the shelf.
|
| + gfx::Rect work_area = display::Screen::GetScreen()
|
| + ->GetDisplayNearestWindow(docked1.get())
|
| + .work_area();
|
| + gfx::Size expected_work_area_bounds(container_bounds.size());
|
| + expected_work_area_bounds.Enlarge(
|
| + 0, -shelf->GetWindowBoundsInScreen().height());
|
| + EXPECT_EQ(expected_work_area_bounds.ToString(),
|
| + work_area.size().ToString());
|
| + } else {
|
| + // Docked windows stays the same.
|
| + EXPECT_EQ(docked_bounds.ToString(),
|
| + docked1->GetBoundsInScreen().ToString());
|
| + EXPECT_FALSE(docked2->IsVisible());
|
| + }
|
| // Docked window can still be activated, which will exit the overview mode.
|
| ClickWindow(docked1.get());
|
| EXPECT_TRUE(wm::IsActiveWindow(docked1.get()));
|
| EXPECT_FALSE(window_selector_controller()->IsSelecting());
|
| +
|
| + // Docked area has a window in it.
|
| + EXPECT_GT(manager->docked_bounds().width(), 0);
|
| +
|
| + // Work area takes the whole screen minus the shelf and the docked area.
|
| + gfx::Rect work_area = display::Screen::GetScreen()
|
| + ->GetDisplayNearestWindow(docked1.get())
|
| + .work_area();
|
| + gfx::Size expected_work_area_bounds(container_bounds.size());
|
| + expected_work_area_bounds.Enlarge(-manager->docked_bounds().width(),
|
| + -shelf->GetWindowBoundsInScreen().height());
|
| + EXPECT_EQ(expected_work_area_bounds.ToString(), work_area.size().ToString());
|
| +}
|
| +
|
| +// Tests that selecting a docked window updates docked layout pushing another
|
| +// window to get docked-minimized.
|
| +TEST_P(WindowSelectorTest, ActivateDockedWindow) {
|
| + if (!ash::MaterialDesignController::IsOverviewMaterial())
|
| + return;
|
| +
|
| + // aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| + gfx::Rect bounds(300, 0, 200, 200);
|
| + std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds);
|
| + std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds);
|
| +
|
| + aura::test::TestWindowDelegate delegate;
|
| + delegate.set_minimum_size(gfx::Size(200, 500));
|
| + std::unique_ptr<aura::Window> docked_window1(
|
| + CreateTestWindowInShellWithDelegate(&delegate, -1, bounds));
|
| + std::unique_ptr<aura::Window> docked_window2(
|
| + CreateTestWindowInShellWithDelegate(&delegate, -1, bounds));
|
| + wm::WindowState* state1 = wm::GetWindowState(docked_window1.get());
|
| + wm::WindowState* state2 = wm::GetWindowState(docked_window2.get());
|
| +
|
| + // Dock the second window first, then the first window.
|
| + wm::WMEvent dock_event(wm::WM_EVENT_DOCK);
|
| + state2->OnWMEvent(&dock_event);
|
| + state1->OnWMEvent(&dock_event);
|
| +
|
| + // Both windows' restored bounds are same.
|
| + const gfx::Rect expected_bounds = docked_window1->bounds();
|
| + EXPECT_EQ(expected_bounds.ToString(), docked_window2->bounds().ToString());
|
| +
|
| + // |docked_window1| is docked and visible.
|
| + EXPECT_TRUE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state1->GetStateType());
|
| + // |docked_window2| is docked-minimized and hidden.
|
| + EXPECT_FALSE(docked_window2->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state2->GetStateType());
|
| +
|
| + ToggleOverview();
|
| +
|
| + // Activate |docked_window2| leaving the overview.
|
| + const gfx::RectF rect =
|
| + GetTransformedBoundsInRootWindow(docked_window2.get());
|
| + gfx::Point point(rect.top_right().x() - 50, rect.top_right().y() + 10);
|
| + ui::test::EventGenerator event_generator(docked_window2->GetRootWindow(),
|
| + point);
|
| + event_generator.ClickLeftButton();
|
| +
|
| + // Windows' bounds are still the same.
|
| + EXPECT_EQ(expected_bounds.ToString(), docked_window1->bounds().ToString());
|
| + EXPECT_EQ(expected_bounds.ToString(), docked_window2->bounds().ToString());
|
| +
|
| + // |docked_window1| is docked-minimized and hidden.
|
| + EXPECT_FALSE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state1->GetStateType());
|
| + // |docked_window2| is docked and visible.
|
| + EXPECT_TRUE(docked_window2->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state2->GetStateType());
|
| +}
|
| +
|
| +// Tests that clicking on the close button closes the docked window.
|
| +TEST_P(WindowSelectorTest, CloseDockedWindow) {
|
| + if (!ash::MaterialDesignController::IsOverviewMaterial())
|
| + return;
|
| +
|
| + // aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| + gfx::Rect bounds(300, 0, 200, 200);
|
| + std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds);
|
| + std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds);
|
| +
|
| + aura::test::TestWindowDelegate delegate;
|
| + delegate.set_minimum_size(gfx::Size(200, 500));
|
| + std::unique_ptr<aura::Window> docked_window1(
|
| + CreateTestWindowInShellWithDelegate(&delegate, -1, bounds));
|
| + std::unique_ptr<views::Widget> docked2 = CreateWindowWidget(bounds);
|
| + aura::Window* docked_window2 = docked2->GetNativeWindow();
|
| + wm::WindowState* state1 = wm::GetWindowState(docked_window1.get());
|
| + wm::WindowState* state2 = wm::GetWindowState(docked_window2);
|
| +
|
| + // Dock the first window first, then the second window.
|
| + wm::WMEvent dock_event(wm::WM_EVENT_DOCK);
|
| + state1->OnWMEvent(&dock_event);
|
| + state2->OnWMEvent(&dock_event);
|
| +
|
| + const gfx::Rect expected_bounds1 = docked_window1->bounds();
|
| +
|
| + // |docked_window1| is docked-minimized and hidden.
|
| + EXPECT_FALSE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state1->GetStateType());
|
| + // |docked_window2| is docked and visible.
|
| + EXPECT_TRUE(docked_window2->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state2->GetStateType());
|
| +
|
| + ToggleOverview();
|
| +
|
| + // Close |docked_window2| (staying in overview).
|
| + const gfx::RectF rect = GetTransformedBoundsInRootWindow(docked_window2);
|
| + gfx::Point point(rect.top_right().x() - 5, rect.top_right().y() - 5);
|
| + ui::test::EventGenerator event_generator(docked_window2->GetRootWindow(),
|
| + point);
|
| + // Both windows are visible while in overview.
|
| + EXPECT_TRUE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state1->GetStateType());
|
| + EXPECT_TRUE(docked_window2->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state2->GetStateType());
|
| +
|
| + event_generator.ClickLeftButton();
|
| + // |docked2| widget is closed.
|
| + EXPECT_TRUE(docked2->IsClosed());
|
| +
|
| + // Exit overview.
|
| + ToggleOverview();
|
| +
|
| + // Window bounds are still the same.
|
| + EXPECT_EQ(expected_bounds1.ToString(), docked_window1->bounds().ToString());
|
| +
|
| + // |docked_window1| returns to docked-minimized and hidden state.
|
| + EXPECT_FALSE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state1->GetStateType());
|
| +}
|
| +
|
| +// Tests that clicking on the close button closes the docked-minimized window.
|
| +TEST_P(WindowSelectorTest, CloseDockedMinimizedWindow) {
|
| + if (!ash::MaterialDesignController::IsOverviewMaterial())
|
| + return;
|
| +
|
| + // aura::Window* root_window = Shell::GetPrimaryRootWindow();
|
| + gfx::Rect bounds(300, 0, 200, 200);
|
| + std::unique_ptr<views::Widget> widget1 = CreateWindowWidget(bounds);
|
| + std::unique_ptr<views::Widget> widget2 = CreateWindowWidget(bounds);
|
| +
|
| + aura::test::TestWindowDelegate delegate;
|
| + delegate.set_minimum_size(gfx::Size(200, 500));
|
| + std::unique_ptr<aura::Window> docked_window1(
|
| + CreateTestWindowInShellWithDelegate(&delegate, -1, bounds));
|
| + std::unique_ptr<views::Widget> docked2 = CreateWindowWidget(bounds);
|
| + aura::Window* docked_window2 = docked2->GetNativeWindow();
|
| + wm::WindowState* state1 = wm::GetWindowState(docked_window1.get());
|
| + wm::WindowState* state2 = wm::GetWindowState(docked_window2);
|
| +
|
| + // Dock the second window first, then the first window.
|
| + wm::WMEvent dock_event(wm::WM_EVENT_DOCK);
|
| + state2->OnWMEvent(&dock_event);
|
| + state1->OnWMEvent(&dock_event);
|
| +
|
| + const gfx::Rect expected_bounds1 = docked_window1->bounds();
|
| +
|
| + // |docked_window1| is docked and visible.
|
| + EXPECT_TRUE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state1->GetStateType());
|
| + // |docked_window2| is docked-minimized and hidden.
|
| + EXPECT_FALSE(docked_window2->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED_MINIMIZED, state2->GetStateType());
|
| +
|
| + ToggleOverview();
|
| +
|
| + // Close |docked_window2| (staying in overview).
|
| + const gfx::RectF rect = GetTransformedBoundsInRootWindow(docked_window2);
|
| + gfx::Point point(rect.top_right().x() - 5, rect.top_right().y() - 5);
|
| + ui::test::EventGenerator event_generator(docked_window2->GetRootWindow(),
|
| + point);
|
| + // Both windows are visible while in overview.
|
| + EXPECT_TRUE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state1->GetStateType());
|
| + EXPECT_TRUE(docked_window2->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state2->GetStateType());
|
| +
|
| + event_generator.ClickLeftButton();
|
| + // |docked2| widget is closed.
|
| + EXPECT_TRUE(docked2->IsClosed());
|
| +
|
| + // Exit overview.
|
| + ToggleOverview();
|
| +
|
| + // Window bounds are still the same.
|
| + EXPECT_EQ(expected_bounds1.ToString(),
|
| + docked_window1->GetTargetBounds().ToString());
|
| +
|
| + // |docked_window1| returns to docked and visible state.
|
| + EXPECT_TRUE(docked_window1->IsVisible());
|
| + EXPECT_EQ(wm::WINDOW_STATE_TYPE_DOCKED, state1->GetStateType());
|
| }
|
|
|
| // Tests selecting a window by tapping on it.
|
|
|