summaryrefslogtreecommitdiffstats
path: root/chromium/ash/wm/system_modal_container_layout_manager_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ash/wm/system_modal_container_layout_manager_unittest.cc')
-rw-r--r--chromium/ash/wm/system_modal_container_layout_manager_unittest.cc495
1 files changed, 0 insertions, 495 deletions
diff --git a/chromium/ash/wm/system_modal_container_layout_manager_unittest.cc b/chromium/ash/wm/system_modal_container_layout_manager_unittest.cc
deleted file mode 100644
index 6ae336926c1..00000000000
--- a/chromium/ash/wm/system_modal_container_layout_manager_unittest.cc
+++ /dev/null
@@ -1,495 +0,0 @@
-// 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/system_modal_container_layout_manager.h"
-
-#include "ash/root_window_controller.h"
-#include "ash/session_state_delegate.h"
-#include "ash/shell.h"
-#include "ash/shell_window_ids.h"
-#include "ash/test/ash_test_base.h"
-#include "ash/wm/window_util.h"
-#include "base/compiler_specific.h"
-#include "base/run_loop.h"
-#include "ui/aura/root_window.h"
-#include "ui/aura/test/event_generator.h"
-#include "ui/aura/window.h"
-#include "ui/compositor/layer.h"
-#include "ui/gfx/screen.h"
-#include "ui/views/test/capture_tracking_view.h"
-#include "ui/views/widget/widget.h"
-#include "ui/views/widget/widget_delegate.h"
-
-namespace ash {
-namespace test {
-
-namespace {
-
-aura::Window* GetModalContainer() {
- return Shell::GetPrimaryRootWindowController()->GetContainer(
- ash::internal::kShellWindowId_SystemModalContainer);
-}
-
-bool AllRootWindowsHaveModalBackgroundsForContainer(int container_id) {
- std::vector<aura::Window*> containers =
- Shell::GetContainersFromAllRootWindows(container_id, NULL);
- bool has_modal_screen = !containers.empty();
- for (std::vector<aura::Window*>::iterator iter = containers.begin();
- iter != containers.end(); ++iter) {
- has_modal_screen &=
- static_cast<internal::SystemModalContainerLayoutManager*>(
- (*iter)->layout_manager())->has_modal_background();
- }
- return has_modal_screen;
-}
-
-bool AllRootWindowsHaveLockedModalBackgrounds() {
- return AllRootWindowsHaveModalBackgroundsForContainer(
- internal::kShellWindowId_LockSystemModalContainer);
-}
-
-bool AllRootWindowsHaveModalBackgrounds() {
- return AllRootWindowsHaveModalBackgroundsForContainer(
- internal::kShellWindowId_SystemModalContainer);
-}
-
-class TestWindow : public views::WidgetDelegateView {
- public:
- explicit TestWindow(bool modal) : modal_(modal) {}
- virtual ~TestWindow() {}
-
- // The window needs be closed from widget in order for
- // aura::client::kModalKey property to be reset.
- static void CloseTestWindow(aura::Window* window) {
- views::Widget::GetWidgetForNativeWindow(window)->Close();
- }
-
- // Overridden from views::View:
- virtual gfx::Size GetPreferredSize() OVERRIDE {
- return gfx::Size(50, 50);
- }
-
- // Overridden from views::WidgetDelegate:
- virtual views::View* GetContentsView() OVERRIDE {
- return this;
- }
- virtual ui::ModalType GetModalType() const OVERRIDE {
- return modal_ ? ui::MODAL_TYPE_SYSTEM : ui::MODAL_TYPE_NONE;
- }
-
- private:
- bool modal_;
-
- DISALLOW_COPY_AND_ASSIGN(TestWindow);
-};
-
-class EventTestWindow : public TestWindow {
- public:
- explicit EventTestWindow(bool modal) : TestWindow(modal),
- mouse_presses_(0) {}
- virtual ~EventTestWindow() {}
-
- aura::Window* OpenTestWindowWithContext(aura::Window* context) {
- views::Widget* widget =
- views::Widget::CreateWindowWithContext(this, context);
- widget->Show();
- return widget->GetNativeView();
- }
-
- aura::Window* OpenTestWindowWithParent(aura::Window* parent) {
- DCHECK(parent);
- views::Widget* widget =
- views::Widget::CreateWindowWithParent(this, parent);
- widget->Show();
- return widget->GetNativeView();
- }
-
- // Overridden from views::View:
- virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE {
- mouse_presses_++;
- return false;
- }
-
- int mouse_presses() const { return mouse_presses_; }
- private:
- int mouse_presses_;
-
- DISALLOW_COPY_AND_ASSIGN(EventTestWindow);
-};
-
-class TransientWindowObserver : public aura::WindowObserver {
- public:
- TransientWindowObserver() : destroyed_(false) {}
- virtual ~TransientWindowObserver() {}
-
- bool destroyed() const { return destroyed_; }
-
- // Overridden from aura::WindowObserver:
- virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {
- destroyed_ = true;
- }
-
- private:
- bool destroyed_;
-
- DISALLOW_COPY_AND_ASSIGN(TransientWindowObserver);
-};
-
-} // namespace
-
-class SystemModalContainerLayoutManagerTest : public AshTestBase {
- public:
- aura::Window* OpenToplevelTestWindow(bool modal) {
- views::Widget* widget = views::Widget::CreateWindowWithContext(
- new TestWindow(modal), CurrentContext());
- widget->Show();
- return widget->GetNativeView();
- }
-
- aura::Window* OpenTestWindowWithParent(aura::Window* parent, bool modal) {
- views::Widget* widget =
- views::Widget::CreateWindowWithParent(new TestWindow(modal), parent);
- widget->Show();
- return widget->GetNativeView();
- }
-};
-
-TEST_F(SystemModalContainerLayoutManagerTest, NonModalTransient) {
- scoped_ptr<aura::Window> parent(OpenToplevelTestWindow(false));
- aura::Window* transient = OpenTestWindowWithParent(parent.get(), false);
- TransientWindowObserver destruction_observer;
- transient->AddObserver(&destruction_observer);
-
- EXPECT_EQ(parent.get(), transient->transient_parent());
- EXPECT_EQ(parent->parent(), transient->parent());
-
- // The transient should be destroyed with its parent.
- parent.reset();
- EXPECT_TRUE(destruction_observer.destroyed());
-}
-
-TEST_F(SystemModalContainerLayoutManagerTest, ModalTransient) {
- scoped_ptr<aura::Window> parent(OpenToplevelTestWindow(false));
- // parent should be active.
- EXPECT_TRUE(wm::IsActiveWindow(parent.get()));
- aura::Window* t1 = OpenTestWindowWithParent(parent.get(), true);
-
- TransientWindowObserver do1;
- t1->AddObserver(&do1);
-
- EXPECT_EQ(parent.get(), t1->transient_parent());
- EXPECT_EQ(GetModalContainer(), t1->parent());
-
- // t1 should now be active.
- EXPECT_TRUE(wm::IsActiveWindow(t1));
-
- // Attempting to click the parent should result in no activation change.
- aura::test::EventGenerator e1(Shell::GetPrimaryRootWindow(), parent.get());
- e1.ClickLeftButton();
- EXPECT_TRUE(wm::IsActiveWindow(t1));
-
- // Now open another modal transient parented to the original modal transient.
- aura::Window* t2 = OpenTestWindowWithParent(t1, true);
- TransientWindowObserver do2;
- t2->AddObserver(&do2);
-
- EXPECT_TRUE(wm::IsActiveWindow(t2));
-
- EXPECT_EQ(t1, t2->transient_parent());
- EXPECT_EQ(GetModalContainer(), t2->parent());
-
- // t2 should still be active, even after clicking on t1.
- aura::test::EventGenerator e2(Shell::GetPrimaryRootWindow(), t1);
- e2.ClickLeftButton();
- EXPECT_TRUE(wm::IsActiveWindow(t2));
-
- // Both transients should be destroyed with parent.
- parent.reset();
- EXPECT_TRUE(do1.destroyed());
- EXPECT_TRUE(do2.destroyed());
-}
-
-TEST_F(SystemModalContainerLayoutManagerTest, ModalNonTransient) {
- scoped_ptr<aura::Window> t1(OpenToplevelTestWindow(true));
- // parent should be active.
- EXPECT_TRUE(wm::IsActiveWindow(t1.get()));
- TransientWindowObserver do1;
- t1->AddObserver(&do1);
-
- EXPECT_EQ(NULL, t1->transient_parent());
- EXPECT_EQ(GetModalContainer(), t1->parent());
-
- // t1 should now be active.
- EXPECT_TRUE(wm::IsActiveWindow(t1.get()));
-
- // Attempting to click the parent should result in no activation change.
- aura::test::EventGenerator e1(Shell::GetPrimaryRootWindow(),
- Shell::GetPrimaryRootWindow());
- e1.ClickLeftButton();
- EXPECT_TRUE(wm::IsActiveWindow(t1.get()));
-
- // Now open another modal transient parented to the original modal transient.
- aura::Window* t2 = OpenTestWindowWithParent(t1.get(), true);
- TransientWindowObserver do2;
- t2->AddObserver(&do2);
-
- EXPECT_TRUE(wm::IsActiveWindow(t2));
-
- EXPECT_EQ(t1, t2->transient_parent());
- EXPECT_EQ(GetModalContainer(), t2->parent());
-
- // t2 should still be active, even after clicking on t1.
- aura::test::EventGenerator e2(Shell::GetPrimaryRootWindow(), t1.get());
- e2.ClickLeftButton();
- EXPECT_TRUE(wm::IsActiveWindow(t2));
-
- // Both transients should be destroyed with parent.
- t1.reset();
- EXPECT_TRUE(do1.destroyed());
- EXPECT_TRUE(do2.destroyed());
-}
-
-// Tests that we can activate an unrelated window after a modal window is closed
-// for a window.
-TEST_F(SystemModalContainerLayoutManagerTest, CanActivateAfterEndModalSession) {
- scoped_ptr<aura::Window> unrelated(OpenToplevelTestWindow(false));
- unrelated->SetBounds(gfx::Rect(100, 100, 50, 50));
- scoped_ptr<aura::Window> parent(OpenToplevelTestWindow(false));
- // parent should be active.
- EXPECT_TRUE(wm::IsActiveWindow(parent.get()));
-
- scoped_ptr<aura::Window> transient(
- OpenTestWindowWithParent(parent.get(), true));
- // t1 should now be active.
- EXPECT_TRUE(wm::IsActiveWindow(transient.get()));
-
- // Attempting to click the parent should result in no activation change.
- aura::test::EventGenerator e1(Shell::GetPrimaryRootWindow(), parent.get());
- e1.ClickLeftButton();
- EXPECT_TRUE(wm::IsActiveWindow(transient.get()));
-
- // Now close the transient.
- transient->Hide();
- TestWindow::CloseTestWindow(transient.release());
-
- base::RunLoop().RunUntilIdle();
-
- // parent should now be active again.
- EXPECT_TRUE(wm::IsActiveWindow(parent.get()));
-
- // Attempting to click unrelated should activate it.
- aura::test::EventGenerator e2(Shell::GetPrimaryRootWindow(), unrelated.get());
- e2.ClickLeftButton();
- EXPECT_TRUE(wm::IsActiveWindow(unrelated.get()));
-}
-
-TEST_F(SystemModalContainerLayoutManagerTest, EventFocusContainers) {
- // Create a normal window and attempt to receive a click event.
- EventTestWindow* main_delegate = new EventTestWindow(false);
- scoped_ptr<aura::Window> main(
- main_delegate->OpenTestWindowWithContext(CurrentContext()));
- EXPECT_TRUE(wm::IsActiveWindow(main.get()));
- aura::test::EventGenerator e1(Shell::GetPrimaryRootWindow(), main.get());
- e1.ClickLeftButton();
- EXPECT_EQ(1, main_delegate->mouse_presses());
-
- // Create a modal window for the main window and verify that the main window
- // no longer receives mouse events.
- EventTestWindow* transient_delegate = new EventTestWindow(true);
- aura::Window* transient =
- transient_delegate->OpenTestWindowWithParent(main.get());
- EXPECT_TRUE(wm::IsActiveWindow(transient));
- e1.ClickLeftButton();
- EXPECT_EQ(1, transient_delegate->mouse_presses());
-
- for (int block_reason = FIRST_BLOCK_REASON;
- block_reason < NUMBER_OF_BLOCK_REASONS;
- ++block_reason) {
- // Create a window in the lock screen container and ensure that it receives
- // the mouse event instead of the modal window (crbug.com/110920).
- BlockUserSession(static_cast<UserSessionBlockReason>(block_reason));
- EventTestWindow* lock_delegate = new EventTestWindow(false);
- scoped_ptr<aura::Window> lock(lock_delegate->OpenTestWindowWithParent(
- Shell::GetPrimaryRootWindowController()->GetContainer(
- ash::internal::kShellWindowId_LockScreenContainer)));
- EXPECT_TRUE(wm::IsActiveWindow(lock.get()));
- e1.ClickLeftButton();
- EXPECT_EQ(1, lock_delegate->mouse_presses());
-
- // Make sure that a modal container created by the lock screen can still
- // receive mouse events.
- EventTestWindow* lock_modal_delegate = new EventTestWindow(true);
- aura::Window* lock_modal =
- lock_modal_delegate->OpenTestWindowWithParent(lock.get());
- EXPECT_TRUE(wm::IsActiveWindow(lock_modal));
- e1.ClickLeftButton();
- // Verify that none of the other containers received any more mouse presses.
- EXPECT_EQ(1, lock_modal_delegate->mouse_presses());
- EXPECT_EQ(1, lock_delegate->mouse_presses());
- EXPECT_EQ(1, main_delegate->mouse_presses());
- EXPECT_EQ(1, transient_delegate->mouse_presses());
- UnblockUserSession();
- }
-}
-
-// Makes sure we don't crash if a modal window is shown while the parent window
-// is hidden.
-TEST_F(SystemModalContainerLayoutManagerTest, ShowModalWhileHidden) {
- // Hide the lock screen.
- Shell::GetPrimaryRootWindowController()->GetContainer(
- internal::kShellWindowId_SystemModalContainer)->layer()->SetOpacity(0);
-
- // Create a modal window.
- scoped_ptr<aura::Window> parent(OpenToplevelTestWindow(false));
- scoped_ptr<aura::Window> modal_window(
- OpenTestWindowWithParent(parent.get(), true));
- parent->Show();
- modal_window->Show();
-}
-
-// Verifies we generate a capture lost when showing a modal window.
-TEST_F(SystemModalContainerLayoutManagerTest, ChangeCapture) {
- views::Widget* widget = views::Widget::CreateWindowWithContext(
- new TestWindow(false), CurrentContext());
- scoped_ptr<aura::Window> widget_window(widget->GetNativeView());
- views::test::CaptureTrackingView* view = new views::test::CaptureTrackingView;
- widget->GetContentsView()->AddChildView(view);
- view->SetBoundsRect(widget->GetContentsView()->bounds());
- widget->Show();
-
- gfx::Point center(view->width() / 2, view->height() / 2);
- views::View::ConvertPointToScreen(view, &center);
- aura::test::EventGenerator generator(Shell::GetPrimaryRootWindow(), center);
- generator.PressLeftButton();
- EXPECT_TRUE(view->got_press());
- scoped_ptr<aura::Window> modal_window(
- OpenTestWindowWithParent(widget->GetNativeView(), true));
- modal_window->Show();
- EXPECT_TRUE(view->got_capture_lost());
-}
-
-// Verifies that the window gets moved into the visible screen area upon screen
-// resize.
-TEST_F(SystemModalContainerLayoutManagerTest, KeepVisible) {
- GetModalContainer()->SetBounds(gfx::Rect(0, 0, 1024, 768));
- scoped_ptr<aura::Window> main(OpenTestWindowWithParent(GetModalContainer(),
- true));
- main->SetBounds(gfx::Rect(924, 668, 100, 100));
- // We set now the bounds of the root window to something new which will
- // Then trigger the repos operation.
- GetModalContainer()->SetBounds(gfx::Rect(0, 0, 800, 600));
-
- gfx::Rect bounds = main->bounds();
- EXPECT_EQ(bounds, gfx::Rect(700, 500, 100, 100));
-}
-
-TEST_F(SystemModalContainerLayoutManagerTest, ShowNormalBackgroundOrLocked) {
- scoped_ptr<aura::Window> parent(OpenToplevelTestWindow(false));
- scoped_ptr<aura::Window> modal_window(
- OpenTestWindowWithParent(parent.get(), true));
- parent->Show();
- modal_window->Show();
-
- // Normal system modal window. Shows normal system modal background and not
- // locked.
- EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_FALSE(AllRootWindowsHaveLockedModalBackgrounds());
-
- TestWindow::CloseTestWindow(modal_window.release());
- EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_FALSE(AllRootWindowsHaveLockedModalBackgrounds());
-
- for (int block_reason = FIRST_BLOCK_REASON;
- block_reason < NUMBER_OF_BLOCK_REASONS;
- ++block_reason) {
- // Normal system modal window while blocked. Shows blocked system modal
- // background.
- BlockUserSession(static_cast<UserSessionBlockReason>(block_reason));
- scoped_ptr<aura::Window> lock_parent(OpenTestWindowWithParent(
- Shell::GetPrimaryRootWindowController()->GetContainer(
- ash::internal::kShellWindowId_LockScreenContainer),
- false));
- scoped_ptr<aura::Window> lock_modal_window(OpenTestWindowWithParent(
- lock_parent.get(), true));
- lock_parent->Show();
- lock_modal_window->Show();
- EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_TRUE(AllRootWindowsHaveLockedModalBackgrounds());
- TestWindow::CloseTestWindow(lock_modal_window.release());
-
- // Normal system modal window while blocked, but it belongs to the normal
- // window. Shouldn't show blocked system modal background, but normal.
- scoped_ptr<aura::Window> modal_window(
- OpenTestWindowWithParent(parent.get(), true));
- modal_window->Show();
- EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_FALSE(AllRootWindowsHaveLockedModalBackgrounds());
- TestWindow::CloseTestWindow(modal_window.release());
- UnblockUserSession();
- // Here we should check the behavior of the locked system modal dialog when
- // unlocked, but such case isn't handled very well right now.
- // See crbug.com/157660
- // TODO(mukai): add the test case when the bug is fixed.
- }
-}
-
-TEST_F(SystemModalContainerLayoutManagerTest, MultiDisplays) {
- if (!SupportsMultipleDisplays())
- return;
-
- UpdateDisplay("500x500,500x500");
-
- scoped_ptr<aura::Window> normal(OpenToplevelTestWindow(false));
- normal->SetBounds(gfx::Rect(100, 100, 50, 50));
-
- aura::Window::Windows root_windows = Shell::GetAllRootWindows();
- EXPECT_EQ(2U, root_windows.size());
- aura::Window* container1 = Shell::GetContainer(
- root_windows[0], ash::internal::kShellWindowId_SystemModalContainer);
- aura::Window* container2 = Shell::GetContainer(
- root_windows[1], ash::internal::kShellWindowId_SystemModalContainer);
-
- scoped_ptr<aura::Window> modal1(
- OpenTestWindowWithParent(container1, true));
- EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_TRUE(wm::IsActiveWindow(modal1.get()));
-
- scoped_ptr<aura::Window> modal11(
- OpenTestWindowWithParent(container1, true));
- EXPECT_TRUE(wm::IsActiveWindow(modal11.get()));
-
- scoped_ptr<aura::Window> modal2(
- OpenTestWindowWithParent(container2, true));
- EXPECT_TRUE(wm::IsActiveWindow(modal2.get()));
-
- // Sanity check if they're on the correct containers.
- EXPECT_EQ(container1, modal1->parent());
- EXPECT_EQ(container1, modal11->parent());
- EXPECT_EQ(container2, modal2->parent());
-
- TestWindow::CloseTestWindow(modal2.release());
- EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_TRUE(wm::IsActiveWindow(modal11.get()));
-
- TestWindow::CloseTestWindow(modal11.release());
- EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_TRUE(wm::IsActiveWindow(modal1.get()));
-
- UpdateDisplay("500x500");
- EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_TRUE(wm::IsActiveWindow(modal1.get()));
-
- UpdateDisplay("500x500,600x600");
- EXPECT_TRUE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_TRUE(wm::IsActiveWindow(modal1.get()));
-
- // No more modal screen.
- modal1->Hide();
- TestWindow::CloseTestWindow(modal1.release());
- EXPECT_FALSE(AllRootWindowsHaveModalBackgrounds());
- EXPECT_TRUE(wm::IsActiveWindow(normal.get()));
-}
-
-} // namespace test
-} // namespace ash