| 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 "components/mus/ws/window_manager_state.h" | 5 #include "components/mus/ws/window_manager_state.h" |
| 6 | 6 |
| 7 #include "base/macros.h" | 7 #include "base/macros.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
| (...skipping 20 matching lines...) Expand all Loading... |
| 31 namespace ws { | 31 namespace ws { |
| 32 namespace test { | 32 namespace test { |
| 33 | 33 |
| 34 class WindowManagerStateTest : public testing::Test { | 34 class WindowManagerStateTest : public testing::Test { |
| 35 public: | 35 public: |
| 36 WindowManagerStateTest(); | 36 WindowManagerStateTest(); |
| 37 ~WindowManagerStateTest() override {} | 37 ~WindowManagerStateTest() override {} |
| 38 | 38 |
| 39 scoped_ptr<Accelerator> CreateAccelerator(); | 39 scoped_ptr<Accelerator> CreateAccelerator(); |
| 40 | 40 |
| 41 // Creates a child |server_window| with associataed |window_tree| and | 41 // Creates a child |server_window| with associated |window_tree| and |
| 42 // |test_client|. The window is setup for processing input. | 42 // |test_client|. The window is setup for processing input. |
| 43 void CreateSecondaryTree(TestWindowTreeClient** test_client, | 43 void CreateSecondaryTree(TestWindowTreeClient** test_client, |
| 44 WindowTree** window_tree, | 44 WindowTree** window_tree, |
| 45 ServerWindow** server_window); | 45 ServerWindow** server_window); |
| 46 | 46 |
| 47 void DispatchInputEventToWindow(ServerWindow* target, | 47 void DispatchInputEventToWindow(ServerWindow* target, |
| 48 bool in_nonclient_area, | 48 bool in_nonclient_area, |
| 49 const ui::Event& event, | 49 const ui::Event& event, |
| 50 Accelerator* accelerator); | 50 Accelerator* accelerator); |
| 51 void OnEventAckTimeout(); | 51 void OnEventAckTimeout(); |
| 52 | 52 |
| 53 WindowTree* tree() { return tree_; } | 53 WindowTree* tree() { return tree_; } |
| 54 ServerWindow* window() { return window_; } | 54 WindowServer* window_server() { return window_server_.get(); } |
| 55 ServerWindow* target_window() { return target_window_; } |
| 56 TestWindowTreeClient* target_window_client() { return target_window_client_; } |
| 55 TestWindowManager* window_manager() { return &window_manager_; } | 57 TestWindowManager* window_manager() { return &window_manager_; } |
| 56 TestWindowTreeClient* wm_client() { return wm_client_; } | 58 TestWindowTreeClient* wm_client() { return wm_client_; } |
| 57 WindowManagerState* window_manager_state() { return window_manager_state_; } | 59 WindowManagerState* window_manager_state() { return window_manager_state_; } |
| 58 | 60 |
| 59 // testing::Test: | 61 // testing::Test: |
| 60 void SetUp() override; | 62 void SetUp() override; |
| 61 | 63 |
| 62 private: | 64 private: |
| 63 int32_t cursor_id_; | 65 int32_t cursor_id_; |
| 64 | 66 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 75 // TestWindowTreeClient that is used for the WM connection. Owned by | 77 // TestWindowTreeClient that is used for the WM connection. Owned by |
| 76 // |window_server_delegate_| | 78 // |window_server_delegate_| |
| 77 TestWindowTreeClient* wm_client_; | 79 TestWindowTreeClient* wm_client_; |
| 78 | 80 |
| 79 TestWindowServerDelegate window_server_delegate_; | 81 TestWindowServerDelegate window_server_delegate_; |
| 80 scoped_ptr<WindowServer> window_server_; | 82 scoped_ptr<WindowServer> window_server_; |
| 81 // Handles WindowStateManager ack timeouts. | 83 // Handles WindowStateManager ack timeouts. |
| 82 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; | 84 scoped_refptr<base::TestSimpleTaskRunner> task_runner_; |
| 83 TestPlatformDisplayFactory platform_display_factory_; | 85 TestPlatformDisplayFactory platform_display_factory_; |
| 84 TestWindowManager window_manager_; | 86 TestWindowManager window_manager_; |
| 85 ServerWindow* window_; | 87 // Test window created as a child of the window manager window. |
| 88 ServerWindow* target_window_; |
| 89 // TestWindowTreeClient for |target_window_|. |
| 90 TestWindowTreeClient* target_window_client_; |
| 86 // Needed to Bind to |wm_client_| | 91 // Needed to Bind to |wm_client_| |
| 87 base::MessageLoop message_loop_; | 92 base::MessageLoop message_loop_; |
| 93 // Needed for hit testing. |
| 94 scoped_refptr<SurfacesState> surfaces_state_; |
| 88 | 95 |
| 89 DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest); | 96 DISALLOW_COPY_AND_ASSIGN(WindowManagerStateTest); |
| 90 }; | 97 }; |
| 91 | 98 |
| 92 WindowManagerStateTest::WindowManagerStateTest() | 99 WindowManagerStateTest::WindowManagerStateTest() |
| 93 : cursor_id_(0), | 100 : cursor_id_(0), |
| 94 task_runner_(new base::TestSimpleTaskRunner), | 101 task_runner_(new base::TestSimpleTaskRunner), |
| 95 platform_display_factory_(&cursor_id_) {} | 102 platform_display_factory_(&cursor_id_), |
| 103 surfaces_state_(new SurfacesState()) {} |
| 96 | 104 |
| 97 scoped_ptr<Accelerator> WindowManagerStateTest::CreateAccelerator() { | 105 scoped_ptr<Accelerator> WindowManagerStateTest::CreateAccelerator() { |
| 98 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( | 106 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( |
| 99 mus::mojom::KeyboardCode::W, mus::mojom::kEventFlagControlDown); | 107 mus::mojom::KeyboardCode::W, mus::mojom::kEventFlagControlDown); |
| 100 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET; | 108 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET; |
| 101 uint32_t accelerator_id = 1; | 109 uint32_t accelerator_id = 1; |
| 102 scoped_ptr<Accelerator> accelerator( | 110 scoped_ptr<Accelerator> accelerator( |
| 103 new Accelerator(accelerator_id, *matcher)); | 111 new Accelerator(accelerator_id, *matcher)); |
| 104 return accelerator; | 112 return accelerator; |
| 105 } | 113 } |
| 106 | 114 |
| 107 void WindowManagerStateTest::CreateSecondaryTree( | 115 void WindowManagerStateTest::CreateSecondaryTree( |
| 108 TestWindowTreeClient** test_client, | 116 TestWindowTreeClient** test_client, |
| 109 WindowTree** window_tree, | 117 WindowTree** window_tree, |
| 110 ServerWindow** server_window) { | 118 ServerWindow** server_window) { |
| 111 WindowTree* tree1 = window_server_->GetTreeWithRoot(window_); | 119 WindowTree* tree1 = window_server_->GetTreeWithRoot(target_window_); |
| 112 ASSERT_TRUE(tree1 != nullptr); | 120 ASSERT_TRUE(tree1 != nullptr); |
| 113 ASSERT_NE(tree1, tree()); | 121 ASSERT_NE(tree1, tree()); |
| 114 | 122 |
| 115 const ClientWindowId child1_id( | 123 const ClientWindowId child1_id( |
| 116 WindowIdToTransportId(WindowId(tree1->id(), 1))); | 124 WindowIdToTransportId(WindowId(tree1->id(), 1))); |
| 117 EXPECT_TRUE(tree1->NewWindow(child1_id, ServerWindow::Properties())); | 125 EXPECT_TRUE(tree1->NewWindow(child1_id, ServerWindow::Properties())); |
| 118 ServerWindow* child1 = tree1->GetWindowByClientId(child1_id); | 126 ServerWindow* child1 = tree1->GetWindowByClientId(child1_id); |
| 119 ASSERT_TRUE(child1); | 127 ASSERT_TRUE(child1); |
| 120 ClientWindowId window_id; | 128 ClientWindowId window_id; |
| 121 tree1->IsWindowKnown(window_, &window_id); | 129 tree1->IsWindowKnown(target_window_, &window_id); |
| 122 EXPECT_TRUE(tree1->AddWindow(window_id, child1_id)); | 130 EXPECT_TRUE(tree1->AddWindow(window_id, child1_id)); |
| 123 tree1->GetDisplay(window_)->AddActivationParent(window_); | 131 tree1->GetDisplay(target_window_)->AddActivationParent(target_window_); |
| 124 | 132 |
| 125 child1->SetVisible(true); | 133 child1->SetVisible(true); |
| 126 child1->SetBounds(gfx::Rect(20, 20, 20, 20)); | 134 child1->SetBounds(gfx::Rect(20, 20, 20, 20)); |
| 127 | 135 |
| 128 TestWindowTreeClient* embed_connection = | 136 TestWindowTreeClient* embed_connection = |
| 129 window_server_delegate_.last_client(); | 137 window_server_delegate_.last_client(); |
| 130 embed_connection->tracker()->changes()->clear(); | 138 embed_connection->tracker()->changes()->clear(); |
| 131 wm_client()->tracker()->changes()->clear(); | 139 wm_client()->tracker()->changes()->clear(); |
| 132 | 140 |
| 133 *test_client = embed_connection; | 141 *test_client = embed_connection; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 147 | 155 |
| 148 void WindowManagerStateTest::OnEventAckTimeout() { | 156 void WindowManagerStateTest::OnEventAckTimeout() { |
| 149 WindowManagerStateTestApi test_api(window_manager_state_); | 157 WindowManagerStateTestApi test_api(window_manager_state_); |
| 150 test_api.OnEventAckTimeout(); | 158 test_api.OnEventAckTimeout(); |
| 151 } | 159 } |
| 152 | 160 |
| 153 void WindowManagerStateTest::SetUp() { | 161 void WindowManagerStateTest::SetUp() { |
| 154 message_loop_.SetTaskRunner(task_runner_); | 162 message_loop_.SetTaskRunner(task_runner_); |
| 155 | 163 |
| 156 PlatformDisplay::set_factory_for_testing(&platform_display_factory_); | 164 PlatformDisplay::set_factory_for_testing(&platform_display_factory_); |
| 157 window_server_.reset(new WindowServer(&window_server_delegate_, | 165 window_server_.reset( |
| 158 scoped_refptr<SurfacesState>())); | 166 new WindowServer(&window_server_delegate_, surfaces_state_)); |
| 159 | 167 |
| 160 PlatformDisplayInitParams display_init_params; | 168 PlatformDisplayInitParams display_init_params; |
| 169 display_init_params.surfaces_state = surfaces_state_; |
| 161 display_ = new Display(window_server_.get(), display_init_params); | 170 display_ = new Display(window_server_.get(), display_init_params); |
| 162 display_binding_ = new TestDisplayBinding(display_, window_server_.get()); | 171 display_binding_ = new TestDisplayBinding(display_, window_server_.get()); |
| 163 display_->Init(make_scoped_ptr(display_binding_)); | 172 display_->Init(make_scoped_ptr(display_binding_)); |
| 164 | 173 |
| 165 wm_client_ = window_server_delegate_.last_client(); | 174 wm_client_ = window_server_delegate_.last_client(); |
| 166 window_manager_state_ = display_->GetActiveWindowManagerState(); | 175 window_manager_state_ = display_->GetActiveWindowManagerState(); |
| 167 | 176 |
| 168 tree_ = window_server_->GetTreeWithId(1); | 177 tree_ = window_server_->GetTreeWithId(1); |
| 169 const ClientWindowId embed_window_id(WindowIdToTransportId(WindowId(1, 1))); | 178 const ClientWindowId embed_window_id(WindowIdToTransportId(WindowId(1, 1))); |
| 170 EXPECT_TRUE(tree_->NewWindow(embed_window_id, ServerWindow::Properties())); | 179 EXPECT_TRUE(tree_->NewWindow(embed_window_id, ServerWindow::Properties())); |
| 171 ClientWindowId root_id; | 180 ClientWindowId root_id; |
| 172 if (tree_->roots().size() == 1u) { | 181 if (tree_->roots().size() == 1u) { |
| 173 // If window isn't known we'll return 0, which should then error out. | 182 // If window isn't known we'll return 0, which should then error out. |
| 174 tree_->IsWindowKnown(*(tree_->roots().begin()), &root_id); | 183 tree_->IsWindowKnown(*(tree_->roots().begin()), &root_id); |
| 175 } | 184 } |
| 176 | 185 |
| 177 EXPECT_TRUE(tree_->SetWindowVisibility(embed_window_id, true)); | 186 EXPECT_TRUE(tree_->SetWindowVisibility(embed_window_id, true)); |
| 178 EXPECT_TRUE(tree_->AddWindow(root_id, embed_window_id)); | 187 EXPECT_TRUE(tree_->AddWindow(root_id, embed_window_id)); |
| 179 display_->root_window()->SetBounds(gfx::Rect(0, 0, 100, 100)); | 188 display_->root_window()->SetBounds(gfx::Rect(0, 0, 1024, 768)); |
| 180 mojom::WindowTreeClientPtr client; | 189 mojom::WindowTreeClientPtr client; |
| 181 mojom::WindowTreeClientRequest client_request = GetProxy(&client); | 190 mojom::WindowTreeClientRequest client_request = GetProxy(&client); |
| 182 wm_client_->Bind(std::move(client_request)); | 191 wm_client_->Bind(std::move(client_request)); |
| 183 tree_->Embed(embed_window_id, std::move(client)); | 192 tree_->Embed(embed_window_id, std::move(client)); |
| 184 window_ = tree_->GetWindowByClientId(embed_window_id); | 193 target_window_ = tree_->GetWindowByClientId(embed_window_id); |
| 185 window_->SetBounds(gfx::Rect(0, 0, 50, 50)); | 194 target_window_->SetBounds(gfx::Rect(10, 10, 50, 50)); |
| 195 EnableHitTest(target_window_); |
| 196 target_window_client_ = window_server_delegate_.last_client(); |
| 197 target_window_client_->tracker()->changes()->clear(); |
| 186 | 198 |
| 187 WindowTreeTestApi(tree_).set_window_manager_internal(&window_manager_); | 199 WindowTreeTestApi(tree_).set_window_manager_internal(&window_manager_); |
| 188 wm_client_->tracker()->changes()->clear(); | 200 wm_client_->tracker()->changes()->clear(); |
| 189 } | 201 } |
| 190 | 202 |
| 191 // Tests that when an event is dispatched with no accelerator, that post target | 203 // Tests that when an event is dispatched with no accelerator, that post target |
| 192 // accelerator is not triggered. | 204 // accelerator is not triggered. |
| 193 TEST_F(WindowManagerStateTest, NullAccelerator) { | 205 TEST_F(WindowManagerStateTest, NullAccelerator) { |
| 194 WindowManagerState* state = window_manager_state(); | 206 WindowManagerState* state = window_manager_state(); |
| 195 EXPECT_TRUE(state); | 207 EXPECT_TRUE(state); |
| 196 | 208 |
| 197 ServerWindow* target = window(); | 209 ServerWindow* target = target_window(); |
| 198 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 210 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 199 DispatchInputEventToWindow(target, true, key, nullptr); | 211 DispatchInputEventToWindow(target, true, key, nullptr); |
| 200 WindowTree* target_tree = tree(); | 212 WindowTree* target_tree = tree(); |
| 201 TestChangeTracker* tracker = wm_client()->tracker(); | 213 TestChangeTracker* tracker = wm_client()->tracker(); |
| 202 EXPECT_EQ(1u, tracker->changes()->size()); | 214 EXPECT_EQ(1u, tracker->changes()->size()); |
| 203 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 215 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 204 ChangesToDescription1(*tracker->changes())[0]); | 216 ChangesToDescription1(*tracker->changes())[0]); |
| 205 | 217 |
| 206 state->OnEventAck(target_tree, false); | 218 state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED); |
| 207 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 219 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 208 } | 220 } |
| 209 | 221 |
| 210 // Tests that when a post target accelerator is provided on an event, that it is | 222 // Tests that when a post target accelerator is provided on an event, that it is |
| 211 // called on ack. | 223 // called on ack. |
| 212 TEST_F(WindowManagerStateTest, PostTargetAccelerator) { | 224 TEST_F(WindowManagerStateTest, PostTargetAccelerator) { |
| 213 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 225 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 214 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); | 226 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 215 | 227 |
| 216 ServerWindow* target = window(); | 228 ServerWindow* target = target_window(); |
| 217 DispatchInputEventToWindow(target, true, key, accelerator.get()); | 229 DispatchInputEventToWindow(target, true, key, accelerator.get()); |
| 218 TestChangeTracker* tracker = wm_client()->tracker(); | 230 TestChangeTracker* tracker = wm_client()->tracker(); |
| 219 EXPECT_EQ(1u, tracker->changes()->size()); | 231 EXPECT_EQ(1u, tracker->changes()->size()); |
| 220 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 232 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 221 ChangesToDescription1(*tracker->changes())[0]); | 233 ChangesToDescription1(*tracker->changes())[0]); |
| 222 | 234 |
| 223 window_manager_state()->OnEventAck(tree(), false); | 235 window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED); |
| 224 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 236 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 225 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); | 237 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
| 226 } | 238 } |
| 227 | 239 |
| 228 // Tests that when a client handles an event that post target accelerators are | 240 // Tests that when a client handles an event that post target accelerators are |
| 229 // not called. | 241 // not called. |
| 230 TEST_F(WindowManagerStateTest, ClientHandlesEvent) { | 242 TEST_F(WindowManagerStateTest, ClientHandlesEvent) { |
| 231 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 243 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 232 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); | 244 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 233 | 245 |
| 234 ServerWindow* target = window(); | 246 ServerWindow* target = target_window(); |
| 235 DispatchInputEventToWindow(target, true, key, accelerator.get()); | 247 DispatchInputEventToWindow(target, true, key, accelerator.get()); |
| 236 TestChangeTracker* tracker = wm_client()->tracker(); | 248 TestChangeTracker* tracker = wm_client()->tracker(); |
| 237 EXPECT_EQ(1u, tracker->changes()->size()); | 249 EXPECT_EQ(1u, tracker->changes()->size()); |
| 238 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 250 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 239 ChangesToDescription1(*tracker->changes())[0]); | 251 ChangesToDescription1(*tracker->changes())[0]); |
| 240 | 252 |
| 241 window_manager_state()->OnEventAck(tree(), true); | 253 window_manager_state()->OnEventAck(tree(), mojom::EventResult::HANDLED); |
| 242 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 254 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 243 } | 255 } |
| 244 | 256 |
| 245 // Tests that when an accelerator is deleted before an ack, that it is not | 257 // Tests that when an accelerator is deleted before an ack, that it is not |
| 246 // called. | 258 // called. |
| 247 TEST_F(WindowManagerStateTest, AcceleratorDeleted) { | 259 TEST_F(WindowManagerStateTest, AcceleratorDeleted) { |
| 248 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 260 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 249 scoped_ptr<Accelerator> accelerator(CreateAccelerator()); | 261 scoped_ptr<Accelerator> accelerator(CreateAccelerator()); |
| 250 | 262 |
| 251 ServerWindow* target = window(); | 263 ServerWindow* target = target_window(); |
| 252 DispatchInputEventToWindow(target, true, key, accelerator.get()); | 264 DispatchInputEventToWindow(target, true, key, accelerator.get()); |
| 253 TestChangeTracker* tracker = wm_client()->tracker(); | 265 TestChangeTracker* tracker = wm_client()->tracker(); |
| 254 EXPECT_EQ(1u, tracker->changes()->size()); | 266 EXPECT_EQ(1u, tracker->changes()->size()); |
| 255 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 267 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 256 ChangesToDescription1(*tracker->changes())[0]); | 268 ChangesToDescription1(*tracker->changes())[0]); |
| 257 | 269 |
| 258 accelerator.reset(); | 270 accelerator.reset(); |
| 259 window_manager_state()->OnEventAck(tree(), false); | 271 window_manager_state()->OnEventAck(tree(), mojom::EventResult::UNHANDLED); |
| 260 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 272 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 261 } | 273 } |
| 262 | 274 |
| 263 // Tests that a events arriving before an ack don't notify the tree until the | 275 // Tests that a events arriving before an ack don't notify the tree until the |
| 264 // ack arrives, and that the correct accelerator is called. | 276 // ack arrives, and that the correct accelerator is called. |
| 265 TEST_F(WindowManagerStateTest, EnqueuedAccelerators) { | 277 TEST_F(WindowManagerStateTest, EnqueuedAccelerators) { |
| 266 WindowManagerState* state = window_manager_state(); | 278 WindowManagerState* state = window_manager_state(); |
| 267 | 279 |
| 268 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 280 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 269 scoped_ptr<Accelerator> accelerator(CreateAccelerator()); | 281 scoped_ptr<Accelerator> accelerator(CreateAccelerator()); |
| 270 | 282 |
| 271 ServerWindow* target = window(); | 283 ServerWindow* target = target_window(); |
| 272 DispatchInputEventToWindow(target, true, key, accelerator.get()); | 284 DispatchInputEventToWindow(target, true, key, accelerator.get()); |
| 273 TestChangeTracker* tracker = wm_client()->tracker(); | 285 TestChangeTracker* tracker = wm_client()->tracker(); |
| 274 EXPECT_EQ(1u, tracker->changes()->size()); | 286 EXPECT_EQ(1u, tracker->changes()->size()); |
| 275 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 287 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 276 ChangesToDescription1(*tracker->changes())[0]); | 288 ChangesToDescription1(*tracker->changes())[0]); |
| 277 | 289 |
| 278 tracker->changes()->clear(); | 290 tracker->changes()->clear(); |
| 279 ui::KeyEvent key2(ui::ET_KEY_PRESSED, ui::VKEY_Y, ui::EF_CONTROL_DOWN); | 291 ui::KeyEvent key2(ui::ET_KEY_PRESSED, ui::VKEY_Y, ui::EF_CONTROL_DOWN); |
| 280 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( | 292 mojom::EventMatcherPtr matcher = mus::CreateKeyMatcher( |
| 281 mus::mojom::KeyboardCode::Y, mus::mojom::kEventFlagControlDown); | 293 mus::mojom::KeyboardCode::Y, mus::mojom::kEventFlagControlDown); |
| 282 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET; | 294 matcher->accelerator_phase = mojom::AcceleratorPhase::POST_TARGET; |
| 283 uint32_t accelerator_id = 2; | 295 uint32_t accelerator_id = 2; |
| 284 scoped_ptr<Accelerator> accelerator2( | 296 scoped_ptr<Accelerator> accelerator2( |
| 285 new Accelerator(accelerator_id, *matcher)); | 297 new Accelerator(accelerator_id, *matcher)); |
| 286 DispatchInputEventToWindow(target, true, key2, accelerator2.get()); | 298 DispatchInputEventToWindow(target, true, key2, accelerator2.get()); |
| 287 EXPECT_TRUE(tracker->changes()->empty()); | 299 EXPECT_TRUE(tracker->changes()->empty()); |
| 288 | 300 |
| 289 WindowTree* target_tree = tree(); | 301 WindowTree* target_tree = tree(); |
| 290 WindowTreeTestApi(target_tree).ClearAck(); | 302 WindowTreeTestApi(target_tree).ClearAck(); |
| 291 state->OnEventAck(target_tree, false); | 303 state->OnEventAck(target_tree, mojom::EventResult::UNHANDLED); |
| 292 EXPECT_EQ(1u, tracker->changes()->size()); | 304 EXPECT_EQ(1u, tracker->changes()->size()); |
| 293 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 305 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 294 ChangesToDescription1(*tracker->changes())[0]); | 306 ChangesToDescription1(*tracker->changes())[0]); |
| 295 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 307 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 296 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); | 308 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
| 297 } | 309 } |
| 298 | 310 |
| 299 // Tests that the accelerator is not sent when the tree is dying. | 311 // Tests that the accelerator is not sent when the tree is dying. |
| 300 TEST_F(WindowManagerStateTest, DeleteTree) { | 312 TEST_F(WindowManagerStateTest, DeleteTree) { |
| 301 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 313 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 302 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); | 314 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 303 | 315 |
| 304 ServerWindow* target = window(); | 316 ServerWindow* target = target_window(); |
| 305 DispatchInputEventToWindow(target, true, key, accelerator.get()); | 317 DispatchInputEventToWindow(target, true, key, accelerator.get()); |
| 306 TestChangeTracker* tracker = wm_client()->tracker(); | 318 TestChangeTracker* tracker = wm_client()->tracker(); |
| 307 EXPECT_EQ(1u, tracker->changes()->size()); | 319 EXPECT_EQ(1u, tracker->changes()->size()); |
| 308 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 320 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 309 ChangesToDescription1(*tracker->changes())[0]); | 321 ChangesToDescription1(*tracker->changes())[0]); |
| 310 | 322 |
| 311 window_manager_state()->OnWillDestroyTree(tree()); | 323 window_manager_state()->OnWillDestroyTree(tree()); |
| 312 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 324 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 313 } | 325 } |
| 314 | 326 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 334 | 346 |
| 335 window_manager_state()->OnWillDestroyTree(target_tree); | 347 window_manager_state()->OnWillDestroyTree(target_tree); |
| 336 EXPECT_FALSE(target_window_manager.on_accelerator_called()); | 348 EXPECT_FALSE(target_window_manager.on_accelerator_called()); |
| 337 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 349 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 338 } | 350 } |
| 339 | 351 |
| 340 // Tests that when an ack times out that the accelerator is notified. | 352 // Tests that when an ack times out that the accelerator is notified. |
| 341 TEST_F(WindowManagerStateTest, AckTimeout) { | 353 TEST_F(WindowManagerStateTest, AckTimeout) { |
| 342 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 354 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 343 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); | 355 scoped_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 344 DispatchInputEventToWindow(window(), true, key, accelerator.get()); | 356 DispatchInputEventToWindow(target_window(), true, key, accelerator.get()); |
| 345 TestChangeTracker* tracker = wm_client()->tracker(); | 357 TestChangeTracker* tracker = wm_client()->tracker(); |
| 346 EXPECT_EQ(1u, tracker->changes()->size()); | 358 EXPECT_EQ(1u, tracker->changes()->size()); |
| 347 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 359 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 348 ChangesToDescription1(*tracker->changes())[0]); | 360 ChangesToDescription1(*tracker->changes())[0]); |
| 349 | 361 |
| 350 OnEventAckTimeout(); | 362 OnEventAckTimeout(); |
| 351 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 363 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 352 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); | 364 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
| 353 } | 365 } |
| 354 | 366 |
| 367 // Tests that when a window returns an event as unhandled that event is |
| 368 // reposted. |
| 369 TEST_F(WindowManagerStateTest, RepostEvent) { |
| 370 window_manager_state()->SetCapture(target_window(), false); |
| 371 |
| 372 // Simulate a mouse release at a point outside of a target window. It will |
| 373 // still process the event because it has capture. |
| 374 ASSERT_EQ("10,10", target_window()->bounds().origin().ToString()); |
| 375 ui::PointerEvent mouse_event(ui::MouseEvent( |
| 376 ui::ET_MOUSE_RELEASED, gfx::Point(5, 5), gfx::Point(5, 5), |
| 377 base::TimeDelta(), ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON)); |
| 378 window_manager_state()->ProcessEvent(mouse_event); |
| 379 |
| 380 // The event was sent to the target window. |
| 381 TestChangeTracker* tracker = target_window_client()->tracker(); |
| 382 ASSERT_EQ(1u, tracker->changes()->size()); |
| 383 const Change& change1 = (*tracker->changes())[0]; |
| 384 EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP), |
| 385 change1.event_action); |
| 386 // The event has window-local coordinates. |
| 387 EXPECT_EQ("-5,-5", change1.event_location.ToString()); |
| 388 |
| 389 window_manager_state()->SetCapture(nullptr, false); |
| 390 |
| 391 // Ack the event and request reposting. Do this at the window tree level |
| 392 // instead of directly in window_manager_state() because otherwise the window |
| 393 // tree won't know the original event was handled and it will queue the |
| 394 // reposted event instead of dispatching it. |
| 395 WindowTree* target_tree = window_server()->GetTreeWithRoot(target_window()); |
| 396 WindowTreeTestApi(target_tree) |
| 397 .OnWindowInputEventAck(change1.event_id, mojom::EventResult::REPOST); |
| 398 |
| 399 // The event was reposted. Because its location was outside the target window |
| 400 // bounds it was sent to the window manager. |
| 401 TestChangeTracker* wm_tracker = wm_client()->tracker(); |
| 402 ASSERT_EQ(1u, wm_tracker->changes()->size()); |
| 403 const Change& change2 = (*wm_tracker->changes())[0]; |
| 404 EXPECT_EQ(static_cast<int>(mojom::EventType::POINTER_UP), |
| 405 change2.event_action); |
| 406 // The event has window-local coordinates. |
| 407 EXPECT_EQ("5,5", change2.event_location.ToString()); |
| 408 } |
| 409 |
| 355 } // namespace test | 410 } // namespace test |
| 356 } // namespace ws | 411 } // namespace ws |
| 357 } // namespace mus | 412 } // namespace mus |
| OLD | NEW |