Index: ash/wm/workspace/workspace_manager2_unittest.cc |
diff --git a/ash/wm/workspace/workspace_manager2_unittest.cc b/ash/wm/workspace/workspace_manager2_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1b9f43d3de48da29f56799b2255f7bf5853da827 |
--- /dev/null |
+++ b/ash/wm/workspace/workspace_manager2_unittest.cc |
@@ -0,0 +1,764 @@ |
+// 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/workspace/workspace_manager2.h" |
+ |
+#include "ash/ash_switches.h" |
+#include "ash/screen_ash.h" |
+#include "ash/shell.h" |
+#include "ash/shell_window_ids.h" |
+#include "ash/test/ash_test_base.h" |
+#include "ash/wm/activation_controller.h" |
+#include "ash/wm/property_util.h" |
+#include "ash/wm/shelf_layout_manager.h" |
+#include "ash/wm/window_util.h" |
+#include "ash/wm/workspace/workspace2.h" |
+#include "ash/wm/workspace_controller_test_helper.h" |
+#include "base/command_line.h" |
+#include "base/string_number_conversions.h" |
+#include "ui/aura/client/aura_constants.h" |
+#include "ui/aura/root_window.h" |
+#include "ui/aura/test/event_generator.h" |
+#include "ui/aura/window.h" |
+#include "ui/base/ui_base_types.h" |
+#include "ui/compositor/layer.h" |
+#include "ui/gfx/screen.h" |
+ |
+using aura::Window; |
+ |
+namespace ash { |
+namespace internal { |
+ |
+class WorkspaceManager2Test : public test::AshTestBase { |
+ public: |
+ WorkspaceManager2Test() : manager_(NULL) {} |
+ virtual ~WorkspaceManager2Test() {} |
+ |
+ aura::Window* CreateTestWindowUnparented() { |
+ aura::Window* window = new aura::Window(NULL); |
+ window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ window->SetType(aura::client::WINDOW_TYPE_NORMAL); |
+ window->Init(ui::LAYER_TEXTURED); |
+ return window; |
+ } |
+ |
+ aura::Window* CreateTestWindow() { |
+ aura::Window* window = new aura::Window(NULL); |
+ window->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ window->SetType(aura::client::WINDOW_TYPE_NORMAL); |
+ window->Init(ui::LAYER_TEXTURED); |
+ window->SetParent(NULL); |
+ return window; |
+ } |
+ |
+ aura::Window* GetViewport() { |
+ return Shell::GetContainer(Shell::GetPrimaryRootWindow(), |
+ kShellWindowId_DefaultContainer); |
+ } |
+ |
+ const std::vector<Workspace2*>& workspaces() const { |
+ return manager_->workspaces_; |
+ } |
+ |
+ gfx::Rect GetFullscreenBounds(aura::Window* window) { |
+ return gfx::Screen::GetDisplayNearestWindow(window).bounds(); |
+ } |
+ |
+ Workspace2* active_workspace() { |
+ return manager_->active_workspace_; |
+ } |
+ |
+ Workspace2* FindBy(aura::Window* window) const { |
+ return manager_->FindBy(window); |
+ } |
+ |
+ std::string WorkspaceStateString(Workspace2* workspace) { |
+ return (workspace->is_maximized() ? "M" : "") + |
+ base::IntToString(static_cast<int>( |
+ workspace->window()->children().size())); |
+ } |
+ |
+ int active_index() { |
+ return static_cast<int>( |
+ manager_->FindWorkspace(manager_->active_workspace_) - |
+ manager_->workspaces_.begin()); |
+ } |
+ |
+ std::string StateString() { |
+ std::string result; |
+ for (size_t i = 0; i < manager_->workspaces_.size(); ++i) { |
+ if (i > 0) |
+ result += " "; |
+ result += WorkspaceStateString(manager_->workspaces_[i]); |
+ } |
+ |
+ if (!manager_->pending_workspaces_.empty()) { |
+ result += " P="; |
+ for (std::set<Workspace2*>::const_iterator i = |
+ manager_->pending_workspaces_.begin(); |
+ i != manager_->pending_workspaces_.end(); ++i) { |
+ if (i != manager_->pending_workspaces_.begin()) |
+ result += " "; |
+ result += WorkspaceStateString(*i); |
+ } |
+ } |
+ |
+ result += " active=" + base::IntToString(active_index()); |
+ return result; |
+ } |
+ |
+ // Overridden from AshTestBase: |
+ virtual void SetUp() OVERRIDE { |
+ CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kAshEnableWorkspace2); |
+ test::AshTestBase::SetUp(); |
+ WorkspaceControllerTestHelper workspace_helper( |
+ Shell::TestApi(Shell::GetInstance()).workspace_controller()); |
+ manager_ = workspace_helper.workspace_manager2(); |
+ manager_->SetGridSize(0); |
+ } |
+ |
+ virtual void TearDown() OVERRIDE { |
+ manager_ = NULL; |
+ test::AshTestBase::TearDown(); |
+ } |
+ |
+ protected: |
+ WorkspaceManager2* manager_; |
+ |
+ private: |
+ scoped_ptr<ActivationController> activation_controller_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WorkspaceManager2Test); |
+}; |
+ |
+// Assertions around adding a normal window. |
+TEST_F(WorkspaceManager2Test, AddNormalWindowWhenEmpty) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ |
+ EXPECT_TRUE(GetRestoreBoundsInScreen(w1.get()) == NULL); |
+ |
+ w1->Show(); |
+ |
+ EXPECT_TRUE(GetRestoreBoundsInScreen(w1.get()) == NULL); |
+ |
+ ASSERT_TRUE(w1->layer() != NULL); |
+ EXPECT_TRUE(w1->layer()->visible()); |
+ |
+ EXPECT_EQ("0,0 250x251", w1->bounds().ToString()); |
+ |
+ // Should be 1 workspace for the desktop, not maximized. |
+ ASSERT_EQ("1 active=0", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+} |
+ |
+// Assertions around maximizing/unmaximizing. |
+TEST_F(WorkspaceManager2Test, SingleMaximizeWindow) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ |
+ w1->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ |
+ EXPECT_TRUE(wm::IsActiveWindow(w1.get())); |
+ |
+ ASSERT_TRUE(w1->layer() != NULL); |
+ EXPECT_TRUE(w1->layer()->visible()); |
+ |
+ EXPECT_EQ("0,0 250x251", w1->bounds().ToString()); |
+ |
+ // Maximize the window. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ |
+ EXPECT_TRUE(wm::IsActiveWindow(w1.get())); |
+ |
+ // Should be 2 workspaces, the second maximized with w1. |
+ ASSERT_EQ("0 M1 active=1", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[1]->window()->children()[0]); |
+ EXPECT_EQ(ScreenAsh::GetMaximizedWindowBoundsInParent(w1.get()).width(), |
+ w1->bounds().width()); |
+ EXPECT_EQ(ScreenAsh::GetMaximizedWindowBoundsInParent(w1.get()).height(), |
+ w1->bounds().height()); |
+ |
+ // Restore the window. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ |
+ // Should be 1 workspace for the desktop. |
+ ASSERT_EQ("1 active=0", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_EQ("0,0 250x251", w1->bounds().ToString()); |
+} |
+ |
+// Assertions around closing the last window in a workspace. |
+TEST_F(WorkspaceManager2Test, CloseLastWindowInWorkspace) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ w1->Show(); |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w2->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ |
+ // Should be 1 workspace and 1 pending, !maximized and maximized. The second |
+ // workspace is pending since the window wasn't active. |
+ ASSERT_EQ("1 P=M1 active=0", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ |
+ // Close w2. |
+ w2.reset(); |
+ |
+ // Should have one workspace. |
+ ASSERT_EQ("1 active=0", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_TRUE(w1->IsVisible()); |
+} |
+ |
+// Assertions around adding a maximized window when empty. |
+TEST_F(WorkspaceManager2Test, AddMaximizedWindowWhenEmpty) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w1->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ |
+ ASSERT_TRUE(w1->layer() != NULL); |
+ EXPECT_TRUE(w1->layer()->visible()); |
+ gfx::Rect work_area( |
+ ScreenAsh::GetMaximizedWindowBoundsInParent(w1.get())); |
+ EXPECT_EQ(work_area.width(), w1->bounds().width()); |
+ EXPECT_EQ(work_area.height(), w1->bounds().height()); |
+ |
+ // Should be 2 workspaces (since we always keep the desktop). |
+ ASSERT_EQ("0 M1 active=1", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+} |
+ |
+// Assertions around two windows and toggling one to be maximized. |
+TEST_F(WorkspaceManager2Test, MaximizeWithNormalWindow) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ w1->Show(); |
+ |
+ ASSERT_TRUE(w1->layer() != NULL); |
+ EXPECT_TRUE(w1->layer()->visible()); |
+ |
+ w2->SetBounds(gfx::Rect(0, 0, 50, 51)); |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w2->Show(); |
+ wm::ActivateWindow(w2.get()); |
+ |
+ // Should now be two workspaces. |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_EQ(w2.get(), workspaces()[1]->window()->children()[0]); |
+ |
+ gfx::Rect work_area(ScreenAsh::GetMaximizedWindowBoundsInParent(w1.get())); |
+ EXPECT_EQ(work_area.width(), w2->bounds().width()); |
+ EXPECT_EQ(work_area.height(), w2->bounds().height()); |
+ |
+ // Restore w2, which should then go back to one workspace. |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ ASSERT_EQ("2 active=0", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_EQ(w2.get(), workspaces()[0]->window()->children()[1]); |
+ EXPECT_EQ(50, w2->bounds().width()); |
+ EXPECT_EQ(51, w2->bounds().height()); |
+ EXPECT_TRUE(wm::IsActiveWindow(w2.get())); |
+} |
+ |
+// Assertions around two maximized windows. |
+TEST_F(WorkspaceManager2Test, TwoMaximized) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ w1->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ |
+ w2->SetBounds(gfx::Rect(0, 0, 50, 51)); |
+ w2->Show(); |
+ wm::ActivateWindow(w2.get()); |
+ ASSERT_EQ("1 M1 active=0", StateString()); |
+ |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ EXPECT_TRUE(wm::IsActiveWindow(w2.get())); |
+ ASSERT_EQ("0 M1 M1 active=2", StateString()); |
+ |
+ // The last stacked window (|w2|) should be last since it was maximized last. |
+ EXPECT_EQ(w1.get(), workspaces()[1]->window()->children()[0]); |
+ EXPECT_EQ(w2.get(), workspaces()[2]->window()->children()[0]); |
+} |
+ |
+// Makes sure requests to change the bounds of a normal window go through. |
+TEST_F(WorkspaceManager2Test, ChangeBoundsOfNormalWindow) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->Show(); |
+ |
+ // Setting the bounds should go through since the window is in the normal |
+ // workspace. |
+ w1->SetBounds(gfx::Rect(0, 0, 200, 500)); |
+ EXPECT_EQ(200, w1->bounds().width()); |
+ EXPECT_EQ(500, w1->bounds().height()); |
+} |
+ |
+// Verifies the bounds is not altered when showing and grid is enabled. |
+TEST_F(WorkspaceManager2Test, SnapToGrid) { |
+ manager_->SetGridSize(8); |
+ |
+ scoped_ptr<Window> w1(CreateTestWindowUnparented()); |
+ w1->SetBounds(gfx::Rect(1, 6, 25, 30)); |
+ w1->SetParent(NULL); |
+ // We are not aligning this anymore this way. When the window gets shown |
+ // the window is expected to be handled differently, but this cannot be |
+ // tested with this test. So the result of this test should be that the |
+ // bounds are exactly as passed in. |
+ EXPECT_EQ("1,6 25x30", w1->bounds().ToString()); |
+} |
+ |
+// Assertions around a fullscreen window. |
+TEST_F(WorkspaceManager2Test, SingleFullscreenWindow) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ // Make the window fullscreen. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN); |
+ w1->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ |
+ // Should be 2 workspaces, normal and maximized. |
+ ASSERT_EQ("0 M1 active=1", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_EQ(GetFullscreenBounds(w1.get()).width(), w1->bounds().width()); |
+ EXPECT_EQ(GetFullscreenBounds(w1.get()).height(), w1->bounds().height()); |
+ |
+ // Restore the window. Use SHOW_STATE_DEFAULT as that is what we'll end up |
+ // with when using views::Widget. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_DEFAULT); |
+ EXPECT_EQ("0,0 250x251", w1->bounds().ToString()); |
+ |
+ // Should be 1 workspace for the desktop. |
+ ASSERT_EQ("1 active=0", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_EQ(250, w1->bounds().width()); |
+ EXPECT_EQ(251, w1->bounds().height()); |
+ |
+ // Back to fullscreen. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN); |
+ ASSERT_EQ("0 M1 active=1", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[1]->window()->children()[0]); |
+ EXPECT_EQ(GetFullscreenBounds(w1.get()).width(), w1->bounds().width()); |
+ EXPECT_EQ(GetFullscreenBounds(w1.get()).height(), w1->bounds().height()); |
+ ASSERT_TRUE(GetRestoreBoundsInScreen(w1.get())); |
+ EXPECT_EQ("0,0 250x251", GetRestoreBoundsInScreen(w1.get())->ToString()); |
+} |
+ |
+// Makes sure switching workspaces doesn't show transient windows. |
+TEST_F(WorkspaceManager2Test, DontShowTransientsOnSwitch) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ |
+ w1->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ w2->SetBounds(gfx::Rect(0, 0, 250, 251)); |
+ w1->AddTransientChild(w2.get()); |
+ |
+ w1->Show(); |
+ |
+ scoped_ptr<Window> w3(CreateTestWindow()); |
+ w3->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w3->Show(); |
+ wm::ActivateWindow(w3.get()); |
+ |
+ EXPECT_FALSE(w1->layer()->IsDrawn()); |
+ EXPECT_FALSE(w2->layer()->IsDrawn()); |
+ EXPECT_TRUE(w3->layer()->IsDrawn()); |
+ |
+ wm::ActivateWindow(w1.get()); |
+ EXPECT_TRUE(w1->layer()->IsDrawn()); |
+ EXPECT_FALSE(w2->layer()->IsDrawn()); |
+ EXPECT_FALSE(w3->layer()->IsDrawn()); |
+} |
+ |
+// Assertions around minimizing a single window. |
+TEST_F(WorkspaceManager2Test, MinimizeSingleWindow) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ |
+ w1->Show(); |
+ ASSERT_EQ("1 active=0", StateString()); |
+ |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ ASSERT_EQ("1 active=0", StateString()); |
+ EXPECT_FALSE(w1->layer()->IsDrawn()); |
+ |
+ // Show the window. |
+ w1->Show(); |
+ EXPECT_TRUE(wm::IsWindowNormal(w1.get())); |
+ ASSERT_EQ("1 active=0", StateString()); |
+ EXPECT_TRUE(w1->layer()->IsDrawn()); |
+} |
+ |
+// Assertions around minimizing a maximized window. |
+TEST_F(WorkspaceManager2Test, MinimizeMaximizedWindow) { |
+ // Two windows, w1 normal, w2 maximized. |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w1->Show(); |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w2->Show(); |
+ wm::ActivateWindow(w2.get()); |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ |
+ // Minimize w2. |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ ASSERT_EQ("1 P=M1 active=0", StateString()); |
+ EXPECT_TRUE(w1->layer()->IsDrawn()); |
+ EXPECT_FALSE(w2->layer()->IsDrawn()); |
+ |
+ // Show the window, which should trigger unminimizing. |
+ w2->Show(); |
+ ASSERT_EQ("1 P=M1 active=0", StateString()); |
+ |
+ wm::ActivateWindow(w2.get()); |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ |
+ EXPECT_TRUE(wm::IsWindowMaximized(w2.get())); |
+ EXPECT_FALSE(w1->layer()->IsDrawn()); |
+ EXPECT_TRUE(w2->layer()->IsDrawn()); |
+ |
+ // Minimize the window, which should hide the window and activate another. |
+ EXPECT_TRUE(wm::IsActiveWindow(w2.get())); |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ EXPECT_FALSE(wm::IsActiveWindow(w2.get())); |
+ EXPECT_FALSE(w2->layer()->IsDrawn()); |
+ EXPECT_TRUE(wm::IsActiveWindow(w1.get())); |
+ |
+ // Make the window normal. |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ ASSERT_EQ("2 active=0", StateString()); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_EQ(w2.get(), workspaces()[0]->window()->children()[1]); |
+ EXPECT_TRUE(w2->layer()->IsDrawn()); |
+} |
+ |
+// Verifies ShelfLayoutManager's visibility/auto-hide state is correctly |
+// updated. |
+TEST_F(WorkspaceManager2Test, ShelfStateUpdated) { |
+ // Since ShelfLayoutManager queries for mouse location, move the mouse so |
+ // it isn't over the shelf. |
+ aura::test::EventGenerator generator( |
+ Shell::GetPrimaryRootWindow(), gfx::Point()); |
+ generator.MoveMouseTo(0, 0); |
+ |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->SetBounds(gfx::Rect(0, 1, 101, 102)); |
+ w1->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ |
+ ShelfLayoutManager* shelf = Shell::GetInstance()->shelf(); |
+ |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ |
+ // Maximize the window. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE, shelf->visibility_state()); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE_HIDDEN, shelf->auto_hide_state()); |
+ |
+ // Restore. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); |
+ |
+ // Fullscreen. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN); |
+ EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state()); |
+ |
+ // Normal. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); |
+ |
+ // Maximize again. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE, shelf->visibility_state()); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE_HIDDEN, shelf->auto_hide_state()); |
+ |
+ // Minimize. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ |
+ // Restore. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); |
+ |
+ // Create another window, maximized. |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w2->SetBounds(gfx::Rect(10, 11, 250, 251)); |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w2->Show(); |
+ wm::ActivateWindow(w2.get()); |
+ EXPECT_EQ(1, active_index()); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE, shelf->visibility_state()); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE_HIDDEN, shelf->auto_hide_state()); |
+ EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); |
+ |
+ // Switch to w1. |
+ wm::ActivateWindow(w1.get()); |
+ EXPECT_EQ(0, active_index()); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); |
+ EXPECT_EQ(ScreenAsh::GetMaximizedWindowBoundsInParent(w2.get()).ToString(), |
+ w2->bounds().ToString()); |
+ |
+ // Switch to w2. |
+ wm::ActivateWindow(w2.get()); |
+ EXPECT_EQ(1, active_index()); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE, shelf->visibility_state()); |
+ EXPECT_EQ(ShelfLayoutManager::AUTO_HIDE_HIDDEN, shelf->auto_hide_state()); |
+ EXPECT_EQ("0,1 101x102", w1->bounds().ToString()); |
+ EXPECT_EQ(ScreenAsh::GetMaximizedWindowBoundsInParent(w2.get()).ToString(), |
+ w2->bounds().ToString()); |
+} |
+ |
+// Verifies persist across all workspaces. |
+TEST_F(WorkspaceManager2Test, PersistAcrossAllWorkspaces) { |
+ // Create a maximized window. |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->Show(); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ wm::ActivateWindow(w1.get()); |
+ ASSERT_EQ("0 M1 active=1", StateString()); |
+ |
+ // Create a window that persists across all workspaces. It should be placed in |
+ // the current maximized workspace. |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ SetPersistsAcrossAllWorkspaces( |
+ w2.get(), |
+ WINDOW_PERSISTS_ACROSS_ALL_WORKSPACES_VALUE_YES); |
+ w2->Show(); |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ |
+ // Activate w2, which should move it to the 2nd workspace. |
+ wm::ActivateWindow(w2.get()); |
+ ASSERT_EQ("0 M2 active=1", StateString()); |
+ |
+ // Restoring w2 should drop the persists window back to the desktop, and drop |
+ // it to the bottom of the stack. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ ASSERT_EQ("2 active=0", StateString()); |
+ EXPECT_EQ(w2.get(), workspaces()[0]->window()->children()[0]); |
+ EXPECT_EQ(w1.get(), workspaces()[0]->window()->children()[1]); |
+ |
+ // Repeat, but this time minimize. The minimize window should end up in |
+ // pending. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w2.reset(CreateTestWindow()); |
+ SetPersistsAcrossAllWorkspaces( |
+ w2.get(), |
+ WINDOW_PERSISTS_ACROSS_ALL_WORKSPACES_VALUE_YES); |
+ w2->Show(); |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ wm::ActivateWindow(w2.get()); |
+ ASSERT_EQ("0 M2 active=1", StateString()); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ ASSERT_EQ("1 P=M1 active=0", StateString()); |
+ EXPECT_EQ(w2.get(), workspaces()[0]->window()->children()[0]); |
+} |
+ |
+// Verifies that when a window persists across all workpaces is activated that |
+// it moves to the current workspace. |
+TEST_F(WorkspaceManager2Test, ActivatePersistAcrossAllWorkspacesWhenNotActive) { |
+ // Create a window that persists across all workspaces. |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ SetPersistsAcrossAllWorkspaces( |
+ w2.get(), |
+ WINDOW_PERSISTS_ACROSS_ALL_WORKSPACES_VALUE_YES); |
+ w2->Show(); |
+ ASSERT_EQ("1 active=0", StateString()); |
+ |
+ // Create a maximized window. |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->Show(); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ wm::ActivateWindow(w1.get()); |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ |
+ // Activate the persists across all workspace window. It should move to the |
+ // current workspace. |
+ wm::ActivateWindow(w2.get()); |
+ ASSERT_EQ("0 M2 active=1", StateString()); |
+ // The window that persists across all workspaces should be moved to the top |
+ // of the stacking order. |
+ EXPECT_EQ(w1.get(), workspaces()[1]->window()->children()[0]); |
+ EXPECT_EQ(w2.get(), workspaces()[1]->window()->children()[1]); |
+ EXPECT_TRUE(wm::IsActiveWindow(w2.get())); |
+} |
+ |
+// Verifies Show()ing a minimized window that persists across all workspaces |
+// unminimizes the window. |
+TEST_F(WorkspaceManager2Test, ShowMinimizedPersistWindow) { |
+ // Create a window that persists across all workspaces. |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ SetPersistsAcrossAllWorkspaces( |
+ w1.get(), |
+ WINDOW_PERSISTS_ACROSS_ALL_WORKSPACES_VALUE_YES); |
+ w1->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ EXPECT_FALSE(w1->IsVisible()); |
+ w1->Show(); |
+ EXPECT_TRUE(w1->IsVisible()); |
+} |
+ |
+// Test that we report we're in the fullscreen state even if the fullscreen |
+// window isn't being managed by us (http://crbug.com/123931). |
+TEST_F(WorkspaceManager2Test, GetWindowStateWithUnmanagedFullscreenWindow) { |
+ ShelfLayoutManager* shelf = Shell::GetInstance()->shelf(); |
+ |
+ // We need to create a regular window first so there's an active workspace. |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->Show(); |
+ |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN); |
+ SetPersistsAcrossAllWorkspaces( |
+ w2.get(), |
+ WINDOW_PERSISTS_ACROSS_ALL_WORKSPACES_VALUE_YES); |
+ w2->Show(); |
+ wm::ActivateWindow(w2.get()); |
+ |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ |
+ EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state()); |
+ EXPECT_EQ(WORKSPACE_WINDOW_STATE_FULL_SCREEN, manager_->GetWindowState()); |
+ |
+ w2->Hide(); |
+ ASSERT_EQ("1 P=M1 active=0", StateString()); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ |
+ w2->Show(); |
+ ASSERT_EQ("1 P=M1 active=0", StateString()); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ EXPECT_EQ(WORKSPACE_WINDOW_STATE_DEFAULT, manager_->GetWindowState()); |
+ |
+ wm::ActivateWindow(w2.get()); |
+ ASSERT_EQ("1 M1 active=1", StateString()); |
+ EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state()); |
+ EXPECT_EQ(WORKSPACE_WINDOW_STATE_FULL_SCREEN, manager_->GetWindowState()); |
+ |
+ w2.reset(); |
+ ASSERT_EQ("1 active=0", StateString()); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ EXPECT_EQ(WORKSPACE_WINDOW_STATE_DEFAULT, manager_->GetWindowState()); |
+} |
+ |
+// Variant of GetWindowStateWithUnmanagedFullscreenWindow that uses a maximized |
+// window rather than a normal window. |
+TEST_F(WorkspaceManager2Test, |
+ GetWindowStateWithUnmanagedFullscreenWindowWithMaximized) { |
+ ShelfLayoutManager* shelf = Shell::GetInstance()->shelf(); |
+ shelf->SetAutoHideBehavior(SHELF_AUTO_HIDE_BEHAVIOR_NEVER); |
+ |
+ // Make the first window maximized. |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w1->Show(); |
+ |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w2->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_FULLSCREEN); |
+ SetPersistsAcrossAllWorkspaces( |
+ w2.get(), |
+ WINDOW_PERSISTS_ACROSS_ALL_WORKSPACES_VALUE_YES); |
+ w2->Show(); |
+ wm::ActivateWindow(w2.get()); |
+ |
+ // Even though auto-hide behavior is NEVER full-screen windows cause the shelf |
+ // to hide. |
+ EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state()); |
+ EXPECT_EQ(WORKSPACE_WINDOW_STATE_FULL_SCREEN, |
+ manager_->GetWindowState()); |
+ |
+ w2->Hide(); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+ |
+ w2->Show(); |
+ wm::ActivateWindow(w2.get()); |
+ EXPECT_EQ(ShelfLayoutManager::HIDDEN, shelf->visibility_state()); |
+ EXPECT_EQ(WORKSPACE_WINDOW_STATE_FULL_SCREEN, |
+ manager_->GetWindowState()); |
+ |
+ w2.reset(); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, shelf->visibility_state()); |
+} |
+ |
+// Verifies a window marked as persisting across all workspaces ends up in its |
+// own workspace when maximized. |
+TEST_F(WorkspaceManager2Test, MaximizeDontPersistEndsUpInOwnWorkspace) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ |
+ SetPersistsAcrossAllWorkspaces( |
+ w1.get(), |
+ WINDOW_PERSISTS_ACROSS_ALL_WORKSPACES_VALUE_YES); |
+ w1->Show(); |
+ |
+ ASSERT_EQ("1 active=0", StateString()); |
+ |
+ // Maximize should trigger containing the window. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ ASSERT_EQ("0 P=M1 active=0", StateString()); |
+ |
+ // And resetting to normal should remove it. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ ASSERT_EQ("1 active=0", StateString()); |
+} |
+ |
+// Verifies going from maximized to minimized sets the right state for painting |
+// the background of the launcher. |
+TEST_F(WorkspaceManager2Test, MinimizeResetsVisibility) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ EXPECT_EQ(ShelfLayoutManager::VISIBLE, |
+ Shell::GetInstance()->shelf()->visibility_state()); |
+ EXPECT_FALSE(Shell::GetInstance()->launcher()->paints_background()); |
+} |
+ |
+// Verifies transients are moved when maximizing. |
+TEST_F(WorkspaceManager2Test, MoveTransientOnMaximize) { |
+ scoped_ptr<Window> w1(CreateTestWindow()); |
+ w1->Show(); |
+ scoped_ptr<Window> w2(CreateTestWindow()); |
+ w1->AddTransientChild(w2.get()); |
+ w2->Show(); |
+ wm::ActivateWindow(w1.get()); |
+ ASSERT_EQ("2 active=0", StateString()); |
+ |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MAXIMIZED); |
+ ASSERT_EQ("0 M2 active=1", StateString()); |
+ EXPECT_TRUE(wm::IsActiveWindow(w1.get())); |
+ |
+ // Create another transient child of |w1|. We do this unparented, set up the |
+ // transient parent then set parent. This is how NativeWidgetAura does things |
+ // too. |
+ scoped_ptr<Window> w3(CreateTestWindowUnparented()); |
+ w1->AddTransientChild(w3.get()); |
+ w3->SetParent(NULL); |
+ w3->Show(); |
+ ASSERT_EQ("0 M3 active=1", StateString()); |
+ |
+ // Minimize the window. All the transients are hidden as a result, so it ends |
+ // up in pending. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_MINIMIZED); |
+ ASSERT_EQ("0 P=M3 active=0", StateString()); |
+ |
+ // Restore and everything should go back to the first workspace. |
+ w1->SetProperty(aura::client::kShowStateKey, ui::SHOW_STATE_NORMAL); |
+ ASSERT_EQ("3 active=0", StateString()); |
+} |
+ |
+} // namespace internal |
+} // namespace ash |