| // 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/first_run/first_run_helper.h" |
| |
| #include "ash/first_run/desktop_cleaner.h" |
| #include "ash/shell.h" |
| #include "ash/shell_window_ids.h" |
| #include "ash/test/ash_test_base.h" |
| #include "ui/events/event_handler.h" |
| #include "ui/events/test/event_generator.h" |
| #include "ui/views/widget/widget.h" |
| #include "ui/views/window/dialog_delegate.h" |
| |
| namespace ash { |
| namespace test { |
| |
| namespace { |
| |
| class TestModalDialogDelegate : public views::DialogDelegateView { |
| public: |
| TestModalDialogDelegate() {} |
| ~TestModalDialogDelegate() override {} |
| |
| // Overridden from views::WidgetDelegate: |
| ui::ModalType GetModalType() const override { return ui::MODAL_TYPE_SYSTEM; } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(TestModalDialogDelegate); |
| }; |
| |
| class CountingEventHandler : public ui::EventHandler { |
| public: |
| // Handler resets |*mouse_events_registered_| during construction and updates |
| // it after each registered event. |
| explicit CountingEventHandler(int* mouse_events_registered) |
| : mouse_events_registered_(mouse_events_registered) { |
| *mouse_events_registered = 0; |
| } |
| |
| ~CountingEventHandler() override {} |
| |
| private: |
| // ui::EventHandler overrides. |
| void OnMouseEvent(ui::MouseEvent* event) override { |
| ++*mouse_events_registered_; |
| } |
| |
| int* mouse_events_registered_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CountingEventHandler); |
| }; |
| |
| } // namespace |
| |
| class FirstRunHelperTest : public AshTestBase, |
| public FirstRunHelper::Observer { |
| public: |
| FirstRunHelperTest() : cancelled_times_(0) {} |
| |
| ~FirstRunHelperTest() override {} |
| |
| void SetUp() override { |
| AshTestBase::SetUp(); |
| CheckContainersAreVisible(); |
| helper_.reset(ash::Shell::GetInstance()->CreateFirstRunHelper()); |
| helper_->AddObserver(this); |
| helper_->GetOverlayWidget()->Show(); |
| } |
| |
| void TearDown() override { |
| EXPECT_TRUE(helper_.get()); |
| helper_.reset(); |
| CheckContainersAreVisible(); |
| AshTestBase::TearDown(); |
| } |
| |
| void CheckContainersAreVisible() const { |
| aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow(); |
| std::vector<int> containers_to_check = |
| DesktopCleaner::GetContainersToHideForTest(); |
| for (size_t i = 0; i < containers_to_check.size(); ++i) { |
| aura::Window* container = |
| Shell::GetContainer(root_window, containers_to_check[i]); |
| EXPECT_TRUE(container->IsVisible()); |
| } |
| } |
| |
| void CheckContainersAreHidden() const { |
| aura::Window* root_window = Shell::GetInstance()->GetPrimaryRootWindow(); |
| std::vector<int> containers_to_check = |
| DesktopCleaner::GetContainersToHideForTest(); |
| for (size_t i = 0; i < containers_to_check.size(); ++i) { |
| aura::Window* container = |
| Shell::GetContainer(root_window, containers_to_check[i]); |
| EXPECT_TRUE(!container->IsVisible()); |
| } |
| } |
| |
| FirstRunHelper* helper() { return helper_.get(); } |
| |
| int cancelled_times() const { return cancelled_times_; } |
| |
| private: |
| // FirstRunHelper::Observer overrides. |
| void OnCancelled() override { ++cancelled_times_; } |
| |
| scoped_ptr<FirstRunHelper> helper_; |
| int cancelled_times_; |
| |
| DISALLOW_COPY_AND_ASSIGN(FirstRunHelperTest); |
| }; |
| |
| // This test creates helper, checks that containers are hidden and then |
| // destructs helper. |
| TEST_F(FirstRunHelperTest, ContainersAreHidden) { |
| CheckContainersAreHidden(); |
| } |
| |
| // Tests that helper correctly handles Escape key press. |
| TEST_F(FirstRunHelperTest, Cancel) { |
| GetEventGenerator().PressKey(ui::VKEY_ESCAPE, 0); |
| EXPECT_EQ(cancelled_times(), 1); |
| } |
| |
| // Tests that modal window doesn't block events for overlay window. |
| TEST_F(FirstRunHelperTest, ModalWindowDoesNotBlock) { |
| views::Widget* modal_dialog = views::DialogDelegate::CreateDialogWidget( |
| new TestModalDialogDelegate(), CurrentContext(), NULL); |
| modal_dialog->Show(); |
| // TODO(dzhioev): modal window should not steal focus from overlay window. |
| aura::Window* overlay_window = helper()->GetOverlayWidget()->GetNativeView(); |
| overlay_window->Focus(); |
| EXPECT_TRUE(overlay_window->HasFocus()); |
| int mouse_events; |
| CountingEventHandler handler(&mouse_events); |
| overlay_window->AddPreTargetHandler(&handler); |
| GetEventGenerator().PressLeftButton(); |
| GetEventGenerator().ReleaseLeftButton(); |
| EXPECT_EQ(mouse_events, 2); |
| overlay_window->RemovePreTargetHandler(&handler); |
| } |
| |
| } // namespace test |
| } // namespace ash |