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

Unified Diff: ash/wm/overview/window_selector_unittest.cc

Issue 2133333002: [ash-md] Allows docked windows to be selected in overview mode (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: [ash-md] Allows docked windows to be selected in overview mode (comments + tests) Created 4 years, 5 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
« no previous file with comments | « ash/common/wm/overview/window_selector.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « ash/common/wm/overview/window_selector.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698