Index: ash/wm/solo_window_tracker_unittest.cc |
diff --git a/ash/wm/solo_window_tracker_unittest.cc b/ash/wm/solo_window_tracker_unittest.cc |
deleted file mode 100644 |
index 31746906679bada85f4126b1228b4e030074ced7..0000000000000000000000000000000000000000 |
--- a/ash/wm/solo_window_tracker_unittest.cc |
+++ /dev/null |
@@ -1,429 +0,0 @@ |
-// Copyright 2013 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/solo_window_tracker.h" |
- |
-#include "ash/ash_constants.h" |
-#include "ash/ash_switches.h" |
-#include "ash/root_window_controller.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/window_resizer.h" |
-#include "ash/wm/window_state.h" |
-#include "base/memory/scoped_ptr.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/aura/window_observer.h" |
-#include "ui/base/hit_test.h" |
-#include "ui/gfx/screen.h" |
- |
-namespace ash { |
- |
-namespace { |
- |
-class WindowRepaintChecker : public aura::WindowObserver { |
- public: |
- explicit WindowRepaintChecker(aura::Window* window) |
- : window_(window), |
- is_paint_scheduled_(false) { |
- window_->AddObserver(this); |
- } |
- |
- virtual ~WindowRepaintChecker() { |
- if (window_) |
- window_->RemoveObserver(this); |
- } |
- |
- bool IsPaintScheduledAndReset() { |
- bool result = is_paint_scheduled_; |
- is_paint_scheduled_ = false; |
- return result; |
- } |
- |
- private: |
- // aura::WindowObserver overrides: |
- virtual void OnWindowPaintScheduled(aura::Window* window, |
- const gfx::Rect& region) OVERRIDE { |
- is_paint_scheduled_ = true; |
- } |
- virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE { |
- DCHECK_EQ(window_, window); |
- window_ = NULL; |
- } |
- |
- aura::Window* window_; |
- bool is_paint_scheduled_; |
- |
- DISALLOW_COPY_AND_ASSIGN(WindowRepaintChecker); |
-}; |
- |
-} // namespace |
- |
-class SoloWindowTrackerTest : public test::AshTestBase { |
- public: |
- SoloWindowTrackerTest() { |
- } |
- virtual ~SoloWindowTrackerTest() { |
- } |
- |
- // Helpers methods to create test windows in the primary root window. |
- aura::Window* CreateWindowInPrimary() { |
- aura::Window* window = new aura::Window(NULL); |
- window->SetType(ui::wm::WINDOW_TYPE_NORMAL); |
- window->Init(ui::LAYER_TEXTURED); |
- window->SetBounds(gfx::Rect(100, 100)); |
- ParentWindowInPrimaryRootWindow(window); |
- return window; |
- } |
- aura::Window* CreateAlwaysOnTopWindowInPrimary() { |
- aura::Window* window = new aura::Window(NULL); |
- window->SetType(ui::wm::WINDOW_TYPE_NORMAL); |
- window->Init(ui::LAYER_TEXTURED); |
- window->SetBounds(gfx::Rect(100, 100)); |
- window->SetProperty(aura::client::kAlwaysOnTopKey, true); |
- ParentWindowInPrimaryRootWindow(window); |
- return window; |
- } |
- aura::Window* CreatePanelWindowInPrimary() { |
- aura::Window* window = new aura::Window(NULL); |
- window->SetType(ui::wm::WINDOW_TYPE_PANEL); |
- window->Init(ui::LAYER_TEXTURED); |
- window->SetBounds(gfx::Rect(100, 100)); |
- ParentWindowInPrimaryRootWindow(window); |
- return window; |
- } |
- |
- // Drag |window| to the dock. |
- void DockWindow(aura::Window* window) { |
- // Because the tests use windows without delegates, |
- // aura::test::EventGenerator cannot be used. |
- gfx::Point drag_to = |
- ash::ScreenAsh::GetDisplayBoundsInParent(window).top_right(); |
- scoped_ptr<WindowResizer> resizer(CreateWindowResizer( |
- window, |
- window->bounds().origin(), |
- HTCAPTION, |
- aura::client::WINDOW_MOVE_SOURCE_MOUSE)); |
- resizer->Drag(drag_to, 0); |
- resizer->CompleteDrag(); |
- EXPECT_EQ(internal::kShellWindowId_DockedContainer, |
- window->parent()->id()); |
- } |
- |
- // Drag |window| out of the dock. |
- void UndockWindow(aura::Window* window) { |
- gfx::Point drag_to = |
- ash::ScreenAsh::GetDisplayWorkAreaBoundsInParent(window).top_right() - |
- gfx::Vector2d(10, 0); |
- scoped_ptr<WindowResizer> resizer(CreateWindowResizer( |
- window, |
- window->bounds().origin(), |
- HTCAPTION, |
- aura::client::WINDOW_MOVE_SOURCE_MOUSE)); |
- resizer->Drag(drag_to, 0); |
- resizer->CompleteDrag(); |
- EXPECT_NE(internal::kShellWindowId_DockedContainer, |
- window->parent()->id()); |
- } |
- |
- // Returns the primary display. |
- gfx::Display GetPrimaryDisplay() { |
- return ash::Shell::GetInstance()->GetScreen()->GetPrimaryDisplay(); |
- } |
- |
- // Returns the secondary display. |
- gfx::Display GetSecondaryDisplay() { |
- return ScreenAsh::GetSecondaryDisplay(); |
- } |
- |
- // Returns the window which uses the solo header, if any, on the primary |
- // display. |
- aura::Window* GetWindowWithSoloHeaderInPrimary() { |
- return GetWindowWithSoloHeader(Shell::GetPrimaryRootWindow()); |
- } |
- |
- // Returns the window which uses the solo header, if any, in |root|. |
- aura::Window* GetWindowWithSoloHeader(aura::Window* root) { |
- SoloWindowTracker* solo_window_tracker = |
- internal::GetRootWindowController(root)->solo_window_tracker(); |
- return solo_window_tracker ? |
- solo_window_tracker->GetWindowWithSoloHeader() : NULL; |
- } |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(SoloWindowTrackerTest); |
-}; |
- |
-TEST_F(SoloWindowTrackerTest, Basic) { |
- scoped_ptr<aura::Window> w1(CreateWindowInPrimary()); |
- w1->Show(); |
- |
- // We only have one window, so it should use a solo header. |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Create a second window. |
- scoped_ptr<aura::Window> w2(CreateWindowInPrimary()); |
- w2->Show(); |
- |
- // Now there are two windows, so we should not use solo headers. |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- |
- // Hide one window. Solo should be enabled. |
- w2->Hide(); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Show that window. Solo should be disabled. |
- w2->Show(); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- |
- // Minimize the first window. Solo should be enabled. |
- wm::GetWindowState(w1.get())->Minimize(); |
- EXPECT_EQ(w2.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Close the minimized window. |
- w1.reset(); |
- EXPECT_EQ(w2.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Open an always-on-top window (which lives in a different container). |
- scoped_ptr<aura::Window> w3(CreateAlwaysOnTopWindowInPrimary()); |
- w3->Show(); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- |
- // Close the always-on-top window. |
- w3.reset(); |
- EXPECT_EQ(w2.get(), GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-// Test that docked windows never use the solo header and that the presence of a |
-// docked window prevents all other windows from the using the solo window |
-// header. |
-TEST_F(SoloWindowTrackerTest, DockedWindow) { |
- if (!switches::UseDockedWindows() || !SupportsHostWindowResize()) |
- return; |
- |
- scoped_ptr<aura::Window> w1(CreateWindowInPrimary()); |
- w1->Show(); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- DockWindow(w1.get()); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- |
- UndockWindow(w1.get()); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- scoped_ptr<aura::Window> w2(CreateWindowInPrimary()); |
- w2->Show(); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- |
- DockWindow(w2.get()); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- |
- wm::GetWindowState(w2.get())->Minimize(); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-// Panels should not "count" for computing solo window headers, and the panel |
-// itself should never use the solo header. |
-TEST_F(SoloWindowTrackerTest, Panel) { |
- scoped_ptr<aura::Window> w1(CreateWindowInPrimary()); |
- w1->Show(); |
- |
- // We only have one window, so it should use a solo header. |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Create a panel window. |
- scoped_ptr<aura::Window> w2(CreatePanelWindowInPrimary()); |
- w2->Show(); |
- |
- // Despite two windows, the first window should still be considered "solo" |
- // because panels aren't included in the computation. |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Even after closing the first window, the panel is still not considered |
- // solo. |
- w1.reset(); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-// Modal dialogs should not use solo headers. |
-TEST_F(SoloWindowTrackerTest, Modal) { |
- scoped_ptr<aura::Window> w1(CreateWindowInPrimary()); |
- w1->Show(); |
- |
- // We only have one window, so it should use a solo header. |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Create a fake modal window. |
- scoped_ptr<aura::Window> w2(CreateWindowInPrimary()); |
- w2->SetProperty(aura::client::kModalKey, ui::MODAL_TYPE_WINDOW); |
- w2->Show(); |
- |
- // Despite two windows, the first window should still be considered "solo" |
- // because modal windows aren't included in the computation. |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-// Constrained windows should not use solo headers. |
-TEST_F(SoloWindowTrackerTest, Constrained) { |
- scoped_ptr<aura::Window> w1(CreateWindowInPrimary()); |
- w1->Show(); |
- |
- // We only have one window, so it should use a solo header. |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Create a fake constrained window. |
- scoped_ptr<aura::Window> w2(CreateWindowInPrimary()); |
- w2->SetProperty(aura::client::kConstrainedWindowKey, true); |
- w2->Show(); |
- |
- // Despite two windows, the first window should still be considered "solo" |
- // because constrained windows aren't included in the computation. |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-// Non-drawing windows should not affect the solo computation. |
-TEST_F(SoloWindowTrackerTest, NotDrawn) { |
- aura::Window* w = CreateWindowInPrimary(); |
- w->Show(); |
- |
- // We only have one window, so it should use a solo header. |
- EXPECT_EQ(w, GetWindowWithSoloHeaderInPrimary()); |
- |
- // Create non-drawing window similar to DragDropTracker. |
- aura::Window* not_drawn = new aura::Window(NULL); |
- not_drawn->SetType(ui::wm::WINDOW_TYPE_NORMAL); |
- not_drawn->Init(ui::LAYER_NOT_DRAWN); |
- ParentWindowInPrimaryRootWindow(not_drawn); |
- not_drawn->Show(); |
- |
- // Despite two windows, the first window should still be considered "solo" |
- // because non-drawing windows aren't included in the computation. |
- EXPECT_EQ(w, GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-TEST_F(SoloWindowTrackerTest, MultiDisplay) { |
- if (!SupportsMultipleDisplays()) |
- return; |
- |
- UpdateDisplay("1000x600,600x400"); |
- |
- scoped_ptr<aura::Window> w1(CreateWindowInPrimary()); |
- w1->SetBoundsInScreen(gfx::Rect(0, 0, 100, 100), GetPrimaryDisplay()); |
- w1->Show(); |
- WindowRepaintChecker checker1(w1.get()); |
- scoped_ptr<aura::Window> w2(CreateWindowInPrimary()); |
- w2->SetBoundsInScreen(gfx::Rect(0, 0, 100, 100), GetPrimaryDisplay()); |
- w2->Show(); |
- WindowRepaintChecker checker2(w2.get()); |
- |
- // Now there are two windows in the same display, so we should not use solo |
- // headers. |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_TRUE(checker1.IsPaintScheduledAndReset()); |
- |
- // Moves the second window to the secondary display. Both w1/w2 should be |
- // solo. |
- w2->SetBoundsInScreen(gfx::Rect(1200, 0, 100, 100), |
- ScreenAsh::GetSecondaryDisplay()); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_EQ(w2.get(), GetWindowWithSoloHeader(w2->GetRootWindow())); |
- EXPECT_TRUE(checker1.IsPaintScheduledAndReset()); |
- EXPECT_TRUE(checker2.IsPaintScheduledAndReset()); |
- |
- // Open two more windows in the primary display. |
- scoped_ptr<aura::Window> w3(CreateWindowInPrimary()); |
- w3->SetBoundsInScreen(gfx::Rect(0, 0, 100, 100), GetPrimaryDisplay()); |
- w3->Show(); |
- scoped_ptr<aura::Window> w4(CreateWindowInPrimary()); |
- w4->SetBoundsInScreen(gfx::Rect(0, 0, 100, 100), GetPrimaryDisplay()); |
- w4->Show(); |
- |
- // Because the primary display has three windows w1, w3, and w4, they |
- // shouldn't be solo. w2 should be solo. |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_EQ(w2.get(), GetWindowWithSoloHeader(w2->GetRootWindow())); |
- EXPECT_TRUE(checker1.IsPaintScheduledAndReset()); |
- |
- // Move w4 to the secondary display. Now w2 shouldn't be solo anymore. |
- w4->SetBoundsInScreen(gfx::Rect(1200, 0, 100, 100), GetSecondaryDisplay()); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeader(w2->GetRootWindow())); |
- EXPECT_TRUE(checker2.IsPaintScheduledAndReset()); |
- |
- // Moves w3 to the secondary display too. Now w1 should be solo again. |
- w3->SetBoundsInScreen(gfx::Rect(1200, 0, 100, 100), GetSecondaryDisplay()); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeader(w2->GetRootWindow())); |
- EXPECT_TRUE(checker1.IsPaintScheduledAndReset()); |
- |
- // Change w3's state to maximize. Doesn't affect w1. |
- wm::GetWindowState(w3.get())->Maximize(); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeader(w2->GetRootWindow())); |
- |
- // Close w3 and w4. |
- w3.reset(); |
- w4.reset(); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_EQ(w2.get(), GetWindowWithSoloHeader(w2->GetRootWindow())); |
- EXPECT_TRUE(checker2.IsPaintScheduledAndReset()); |
- |
- // Move w2 back to the primary display. |
- w2->SetBoundsInScreen(gfx::Rect(0, 0, 100, 100), GetPrimaryDisplay()); |
- EXPECT_EQ(w1->GetRootWindow(), w2->GetRootWindow()); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_TRUE(checker1.IsPaintScheduledAndReset()); |
- EXPECT_TRUE(checker2.IsPaintScheduledAndReset()); |
- |
- // Close w2. |
- w2.reset(); |
- EXPECT_EQ(w1.get(), GetWindowWithSoloHeaderInPrimary()); |
- EXPECT_TRUE(checker1.IsPaintScheduledAndReset()); |
-} |
- |
-TEST_F(SoloWindowTrackerTest, ChildWindowVisibility) { |
- aura::Window* w = CreateWindowInPrimary(); |
- w->Show(); |
- |
- // We only have one window, so it should use a solo header. |
- EXPECT_EQ(w, GetWindowWithSoloHeaderInPrimary()); |
- |
- // Create a child window. This should not affect the solo-ness of |w1|. |
- aura::Window* child = new aura::Window(NULL); |
- child->SetType(ui::wm::WINDOW_TYPE_CONTROL); |
- child->Init(ui::LAYER_TEXTURED); |
- child->SetBounds(gfx::Rect(100, 100)); |
- w->AddChild(child); |
- child->Show(); |
- EXPECT_EQ(w, GetWindowWithSoloHeaderInPrimary()); |
- |
- // Changing the visibility of |child| should not affect the solo-ness of |w1|. |
- child->Hide(); |
- EXPECT_EQ(w, GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-TEST_F(SoloWindowTrackerTest, CreateAndDeleteSingleWindow) { |
- // Ensure that creating/deleting a window works well and doesn't cause |
- // crashes. See crbug.com/155634 |
- scoped_ptr<aura::Window> w(CreateWindowInPrimary()); |
- w->Show(); |
- |
- // We only have one window, so it should use a solo header. |
- EXPECT_EQ(w.get(), GetWindowWithSoloHeaderInPrimary()); |
- |
- // Close the window. |
- w.reset(); |
- EXPECT_EQ(NULL, GetWindowWithSoloHeaderInPrimary()); |
- |
- // Recreate another window again. |
- w.reset(CreateWindowInPrimary()); |
- w->Show(); |
- EXPECT_EQ(w.get(), GetWindowWithSoloHeaderInPrimary()); |
-} |
- |
-} // namespace ash |