1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ash/first_run/first_run_helper.h" 6 7 #include "ash/first_run/desktop_cleaner.h" 8 #include "ash/shell.h" 9 #include "ash/shell_window_ids.h" 10 #include "ash/test/ash_test_base.h" 11 #include "ui/aura/test/event_generator.h" 12 #include "ui/events/event_handler.h" 13 #include "ui/views/window/dialog_delegate.h" 14 15 namespace ash { 16 namespace test { 17 18 namespace { 19 20 class TestModalDialogDelegate : public views::DialogDelegateView { 21 public: 22 TestModalDialogDelegate() {} 23 virtual ~TestModalDialogDelegate() {} 24 25 // Overridden from views::WidgetDelegate: 26 virtual ui::ModalType GetModalType() const OVERRIDE { 27 return ui::MODAL_TYPE_SYSTEM; 28 } 29 30 private: 31 DISALLOW_COPY_AND_ASSIGN(TestModalDialogDelegate); 32 }; 33 34 class CountingEventHandler : public ui::EventHandler { 35 public: 36 // Handler resets |*mouse_events_registered_| during construction and updates 37 // it after each registered event. 38 explicit CountingEventHandler(int* mouse_events_registered) 39 : mouse_events_registered_(mouse_events_registered) { 40 *mouse_events_registered = 0; 41 } 42 43 virtual ~CountingEventHandler() {} 44 45 private: 46 // ui::EventHandler overrides. 47 virtual void OnMouseEvent(ui::MouseEvent* event) OVERRIDE { 48 ++*mouse_events_registered_; 49 } 50 51 int* mouse_events_registered_; 52 53 DISALLOW_COPY_AND_ASSIGN(CountingEventHandler); 54 }; 55 56 } // namespace 57 58 class FirstRunHelperTest : public AshTestBase, 59 public FirstRunHelper::Observer { 60 public: 61 FirstRunHelperTest() : cancelled_times_(0) {} 62 63 virtual ~FirstRunHelperTest() {} 64 65 virtual void SetUp() OVERRIDE { 66 AshTestBase::SetUp(); 67 CheckContainersAreVisible(); 68 helper_.reset(ash::Shell::GetInstance()->CreateFirstRunHelper()); 69 helper_->AddObserver(this); 70 helper_->GetOverlayWidget()->Show(); 71 } 72 73 virtual void TearDown() OVERRIDE { 74 EXPECT_TRUE(helper_.get()); 75 helper_.reset(); 76 CheckContainersAreVisible(); 77 AshTestBase::TearDown(); 78 } 79 80 void CheckContainersAreVisible() const { 81 aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow(); 82 std::vector<int> containers_to_check = 83 internal::DesktopCleaner::GetContainersToHideForTest(); 84 for (size_t i = 0; i < containers_to_check.size(); ++i) { 85 aura::Window* container = 86 Shell::GetContainer(root_window, containers_to_check[i]); 87 EXPECT_TRUE(container->IsVisible()); 88 } 89 } 90 91 void CheckContainersAreHidden() const { 92 aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow(); 93 std::vector<int> containers_to_check = 94 internal::DesktopCleaner::GetContainersToHideForTest(); 95 for (size_t i = 0; i < containers_to_check.size(); ++i) { 96 aura::Window* container = 97 Shell::GetContainer(root_window, containers_to_check[i]); 98 EXPECT_TRUE(!container->IsVisible()); 99 } 100 } 101 102 FirstRunHelper* helper() { return helper_.get(); } 103 104 int cancelled_times() const { return cancelled_times_; } 105 106 private: 107 // FirstRunHelper::Observer overrides. 108 virtual void OnCancelled() OVERRIDE { 109 ++cancelled_times_; 110 } 111 112 scoped_ptr<FirstRunHelper> helper_; 113 int cancelled_times_; 114 115 DISALLOW_COPY_AND_ASSIGN(FirstRunHelperTest); 116 }; 117 118 // This test creates helper, checks that containers are hidden and then 119 // destructs helper. 120 TEST_F(FirstRunHelperTest, ContainersAreHidden) { 121 CheckContainersAreHidden(); 122 } 123 124 // Tests that helper correctly handles Escape key press. 125 TEST_F(FirstRunHelperTest, Cancel) { 126 GetEventGenerator().PressKey(ui::VKEY_ESCAPE, 0); 127 EXPECT_EQ(cancelled_times(), 1); 128 } 129 130 // Tests that modal window doesn't block events for overlay window. 131 TEST_F(FirstRunHelperTest, ModalWindowDoesNotBlock) { 132 views::Widget* modal_dialog = views::DialogDelegate::CreateDialogWidget( 133 new TestModalDialogDelegate(), CurrentContext(), NULL); 134 modal_dialog->Show(); 135 // TODO(dzhioev): modal window should not steal focus from overlay window. 136 aura::Window* overlay_window = helper()->GetOverlayWidget()->GetNativeView(); 137 overlay_window->Focus(); 138 EXPECT_TRUE(overlay_window->HasFocus()); 139 int mouse_events; 140 overlay_window->SetEventFilter(new CountingEventHandler(&mouse_events)); 141 GetEventGenerator().PressLeftButton(); 142 GetEventGenerator().ReleaseLeftButton(); 143 EXPECT_EQ(mouse_events, 2); 144 } 145 146 } // namespace test 147 } // namespace ash 148