| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "services/ui/ws/window_manager_state.h" | 5 #include "services/ui/ws/window_manager_state.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/command_line.h" |
| 9 #include "base/macros.h" | 10 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 11 #include "base/memory/ptr_util.h" |
| 11 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 12 #include "base/test/test_simple_task_runner.h" | 13 #include "base/test/test_simple_task_runner.h" |
| 13 #include "base/threading/thread_task_runner_handle.h" | 14 #include "base/threading/thread_task_runner_handle.h" |
| 14 #include "services/service_manager/public/interfaces/connector.mojom.h" | 15 #include "services/service_manager/public/interfaces/connector.mojom.h" |
| 15 #include "services/ui/common/accelerator_util.h" | 16 #include "services/ui/common/accelerator_util.h" |
| 16 #include "services/ui/ws/accelerator.h" | 17 #include "services/ui/ws/accelerator.h" |
| 17 #include "services/ui/ws/display.h" | 18 #include "services/ui/ws/display.h" |
| 18 #include "services/ui/ws/display_manager.h" | 19 #include "services/ui/ws/display_manager.h" |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 } | 94 } |
| 94 | 95 |
| 95 void DestroyWindowTree() { | 96 void DestroyWindowTree() { |
| 96 window_event_targeting_helper_.window_server()->DestroyTree(window_tree_); | 97 window_event_targeting_helper_.window_server()->DestroyTree(window_tree_); |
| 97 window_tree_ = nullptr; | 98 window_tree_ = nullptr; |
| 98 } | 99 } |
| 99 | 100 |
| 100 // testing::Test: | 101 // testing::Test: |
| 101 void SetUp() override; | 102 void SetUp() override; |
| 102 | 103 |
| 104 protected: |
| 105 // Handles WindowStateManager ack timeouts. |
| 106 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 107 |
| 103 private: | 108 private: |
| 104 WindowEventTargetingHelper window_event_targeting_helper_; | 109 WindowEventTargetingHelper window_event_targeting_helper_; |
| 105 | 110 |
| 106 WindowManagerState* window_manager_state_; | 111 WindowManagerState* window_manager_state_; |
| 107 | 112 |
| 108 // Handles WindowStateManager ack timeouts. | |
| 109 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | |
| 110 TestWindowManager window_manager_; | 113 TestWindowManager window_manager_; |
| 111 ServerWindow* window_ = nullptr; | 114 ServerWindow* window_ = nullptr; |
| 112 WindowTree* window_tree_ = nullptr; | 115 WindowTree* window_tree_ = nullptr; |
| 113 TestWindowTreeClient* window_tree_client_ = nullptr; | 116 TestWindowTreeClient* window_tree_client_ = nullptr; |
| 114 | 117 |
| 115 DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest); | 118 DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest); |
| 116 }; | 119 }; |
| 117 | 120 |
| 118 WindowManagerStateTest::WindowManagerStateTest() | 121 WindowManagerStateTest::WindowManagerStateTest() |
| 119 : task_runner_(new base::TestSimpleTaskRunner) {} | 122 : task_runner_(new base::TestSimpleTaskRunner) {} |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 window_tree_client_->tracker()->changes()->clear(); | 174 window_tree_client_->tracker()->changes()->clear(); |
| 172 } | 175 } |
| 173 | 176 |
| 174 void SetCanFocusUp(ServerWindow* window) { | 177 void SetCanFocusUp(ServerWindow* window) { |
| 175 while (window) { | 178 while (window) { |
| 176 window->set_can_focus(true); | 179 window->set_can_focus(true); |
| 177 window = window->parent(); | 180 window = window->parent(); |
| 178 } | 181 } |
| 179 } | 182 } |
| 180 | 183 |
| 184 class WindowManagerStateTestAsync : public WindowManagerStateTest { |
| 185 public: |
| 186 WindowManagerStateTestAsync() {} |
| 187 ~WindowManagerStateTestAsync() override {} |
| 188 |
| 189 // WindowManagerStateTest: |
| 190 void SetUp() override { |
| 191 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 192 "enable-async-event-targeting"); |
| 193 WindowManagerStateTest::SetUp(); |
| 194 } |
| 195 |
| 196 private: |
| 197 DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTestAsync); |
| 198 }; |
| 199 |
| 181 // Tests that when an event is dispatched with no accelerator, that post target | 200 // Tests that when an event is dispatched with no accelerator, that post target |
| 182 // accelerator is not triggered. | 201 // accelerator is not triggered. |
| 183 TEST_F(WindowManagerStateTest, NullAccelerator) { | 202 TEST_F(WindowManagerStateTest, NullAccelerator) { |
| 184 WindowManagerState* state = window_manager_state(); | 203 WindowManagerState* state = window_manager_state(); |
| 185 EXPECT_TRUE(state); | 204 EXPECT_TRUE(state); |
| 186 | 205 |
| 187 ServerWindow* target = window(); | 206 ServerWindow* target = window(); |
| 188 const Display* display = window_tree()->GetDisplay(target); | 207 const Display* display = window_tree()->GetDisplay(target); |
| 189 DCHECK(display); | 208 DCHECK(display); |
| 190 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 209 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 ui::PointerEvent move( | 711 ui::PointerEvent move( |
| 693 ui::ET_POINTER_MOVED, gfx::Point(25, 25), gfx::Point(25, 25), 0, 0, | 712 ui::ET_POINTER_MOVED, gfx::Point(25, 25), gfx::Point(25, 25), 0, 0, |
| 694 ui::PointerDetails(EventPointerType::POINTER_TYPE_MOUSE, 0), | 713 ui::PointerDetails(EventPointerType::POINTER_TYPE_MOUSE, 0), |
| 695 base::TimeTicks()); | 714 base::TimeTicks()); |
| 696 window_manager_state()->ProcessEvent(move, 0); | 715 window_manager_state()->ProcessEvent(move, 0); |
| 697 // The event isn't over a valid target, which should trigger resetting the | 716 // The event isn't over a valid target, which should trigger resetting the |
| 698 // cursor to POINTER. | 717 // cursor to POINTER. |
| 699 EXPECT_EQ(ui::CursorType::kPointer, cursor_type()); | 718 EXPECT_EQ(ui::CursorType::kPointer, cursor_type()); |
| 700 } | 719 } |
| 701 | 720 |
| 721 TEST_F(WindowManagerStateTestAsync, CursorResetOverNoTargetAsync) { |
| 722 ASSERT_EQ(1u, window_server()->display_manager()->displays().size()); |
| 723 const ClientWindowId child_window_id(11); |
| 724 window_tree()->NewWindow(child_window_id, ServerWindow::Properties()); |
| 725 ServerWindow* child_window = |
| 726 window_tree()->GetWindowByClientId(child_window_id); |
| 727 window_tree()->AddWindow(FirstRootId(window_tree()), child_window_id); |
| 728 // Setup steps already do hit-test for mouse cursor update so this should go |
| 729 // to the queue in EventDispatcher. |
| 730 EXPECT_TRUE(window_manager_state() |
| 731 ->event_dispatcher() |
| 732 ->event_targeter() |
| 733 ->IsHitTestInFlight()); |
| 734 child_window->SetVisible(true); |
| 735 child_window->SetBounds(gfx::Rect(0, 0, 20, 20)); |
| 736 child_window->parent()->SetCursor(ui::CursorData(ui::CursorType::kCopy)); |
| 737 // Move the mouse outside the bounds of the child, so that the mouse is not |
| 738 // over any valid windows. Cursor should change to POINTER. |
| 739 ui::PointerEvent move( |
| 740 ui::ET_POINTER_MOVED, gfx::Point(25, 25), gfx::Point(25, 25), 0, 0, |
| 741 ui::PointerDetails(EventPointerType::POINTER_TYPE_MOUSE, 0), |
| 742 base::TimeTicks()); |
| 743 WindowManagerStateTestApi test_api(window_manager_state()); |
| 744 EXPECT_TRUE(test_api.event_queue_empty()); |
| 745 window_manager_state()->ProcessEvent(move, 0); |
| 746 // There's no event dispatching in flight but there's hit-test in flight in |
| 747 // EventDispatcher so we still put event processing request into the queue |
| 748 // in WindowManagerState. |
| 749 EXPECT_FALSE(test_api.tree_awaiting_input_ack()); |
| 750 EXPECT_TRUE(window_manager_state() |
| 751 ->event_dispatcher() |
| 752 ->event_targeter() |
| 753 ->IsHitTestInFlight()); |
| 754 EXPECT_FALSE(test_api.event_queue_empty()); |
| 755 task_runner_->RunUntilIdle(); |
| 756 EXPECT_TRUE(test_api.event_queue_empty()); |
| 757 // The event isn't over a valid target, which should trigger resetting the |
| 758 // cursor to POINTER. |
| 759 EXPECT_EQ(ui::CursorType::kPointer, cursor_type()); |
| 760 } |
| 761 |
| 702 } // namespace test | 762 } // namespace test |
| 703 } // namespace ws | 763 } // namespace ws |
| 704 } // namespace ui | 764 } // namespace ui |
| OLD | NEW |