| 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/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 | 40 |
| 41 std::unique_ptr<Accelerator> CreateAccelerator(); | 41 std::unique_ptr<Accelerator> CreateAccelerator(); |
| 42 | 42 |
| 43 // Creates a child |server_window| with associataed |window_tree| and | 43 // Creates a child |server_window| with associataed |window_tree| and |
| 44 // |test_client|. The window is setup for processing input. | 44 // |test_client|. The window is setup for processing input. |
| 45 void CreateSecondaryTree(TestWindowTreeClient** test_client, | 45 void CreateSecondaryTree(TestWindowTreeClient** test_client, |
| 46 WindowTree** window_tree, | 46 WindowTree** window_tree, |
| 47 ServerWindow** server_window); | 47 ServerWindow** server_window); |
| 48 | 48 |
| 49 void DispatchInputEventToWindow(ServerWindow* target, | 49 void DispatchInputEventToWindow(ServerWindow* target, |
| 50 const int64_t display_id, |
| 50 const ui::Event& event, | 51 const ui::Event& event, |
| 51 Accelerator* accelerator); | 52 Accelerator* accelerator); |
| 52 void OnEventAckTimeout(ClientSpecificId client_id); | 53 void OnEventAckTimeout(ClientSpecificId client_id); |
| 53 | 54 |
| 54 // This is the tree associated with the WindowManagerState. That is, this is | 55 // This is the tree associated with the WindowManagerState. That is, this is |
| 55 // the WindowTree of the WindowManager. | 56 // the WindowTree of the WindowManager. |
| 56 WindowTree* tree() { | 57 WindowTree* tree() { |
| 57 return window_event_targeting_helper_.window_server()->GetTreeWithId(1); | 58 return window_event_targeting_helper_.window_server()->GetTreeWithId(1); |
| 58 } | 59 } |
| 59 // This is *not* the tree associated with the WindowManagerState, use tree() | 60 // This is *not* the tree associated with the WindowManagerState, use tree() |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 TestWindowTreeClient** test_client, | 132 TestWindowTreeClient** test_client, |
| 132 WindowTree** window_tree, | 133 WindowTree** window_tree, |
| 133 ServerWindow** server_window) { | 134 ServerWindow** server_window) { |
| 134 window_event_targeting_helper_.CreateSecondaryTree( | 135 window_event_targeting_helper_.CreateSecondaryTree( |
| 135 window_, gfx::Rect(20, 20, 20, 20), test_client, window_tree, | 136 window_, gfx::Rect(20, 20, 20, 20), test_client, window_tree, |
| 136 server_window); | 137 server_window); |
| 137 } | 138 } |
| 138 | 139 |
| 139 void WindowManagerStateTest::DispatchInputEventToWindow( | 140 void WindowManagerStateTest::DispatchInputEventToWindow( |
| 140 ServerWindow* target, | 141 ServerWindow* target, |
| 142 const int64_t display_id, |
| 141 const ui::Event& event, | 143 const ui::Event& event, |
| 142 Accelerator* accelerator) { | 144 Accelerator* accelerator) { |
| 143 WindowManagerStateTestApi test_api(window_manager_state_); | 145 WindowManagerStateTestApi test_api(window_manager_state_); |
| 144 ClientSpecificId client_id = test_api.GetEventTargetClientId(target, false); | 146 ClientSpecificId client_id = test_api.GetEventTargetClientId(target, false); |
| 145 test_api.DispatchInputEventToWindow(target, client_id, event, accelerator); | 147 test_api.DispatchInputEventToWindow(target, client_id, display_id, event, |
| 148 accelerator); |
| 146 } | 149 } |
| 147 | 150 |
| 148 void WindowManagerStateTest::OnEventAckTimeout( | 151 void WindowManagerStateTest::OnEventAckTimeout( |
| 149 ClientSpecificId client_id) { | 152 ClientSpecificId client_id) { |
| 150 WindowManagerStateTestApi test_api(window_manager_state_); | 153 WindowManagerStateTestApi test_api(window_manager_state_); |
| 151 test_api.OnEventAckTimeout(client_id); | 154 test_api.OnEventAckTimeout(client_id); |
| 152 } | 155 } |
| 153 | 156 |
| 154 void WindowManagerStateTest::SetUp() { | 157 void WindowManagerStateTest::SetUp() { |
| 155 window_event_targeting_helper_.SetTaskRunner(task_runner_); | 158 window_event_targeting_helper_.SetTaskRunner(task_runner_); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 175 } | 178 } |
| 176 } | 179 } |
| 177 | 180 |
| 178 // Tests that when an event is dispatched with no accelerator, that post target | 181 // Tests that when an event is dispatched with no accelerator, that post target |
| 179 // accelerator is not triggered. | 182 // accelerator is not triggered. |
| 180 TEST_F(WindowManagerStateTest, NullAccelerator) { | 183 TEST_F(WindowManagerStateTest, NullAccelerator) { |
| 181 WindowManagerState* state = window_manager_state(); | 184 WindowManagerState* state = window_manager_state(); |
| 182 EXPECT_TRUE(state); | 185 EXPECT_TRUE(state); |
| 183 | 186 |
| 184 ServerWindow* target = window(); | 187 ServerWindow* target = window(); |
| 188 const Display* display = window_tree()->GetDisplay(target); |
| 189 DCHECK(display); |
| 185 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 190 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 186 DispatchInputEventToWindow(target, key, nullptr); | 191 DispatchInputEventToWindow(target, display->GetId(), key, nullptr); |
| 187 WindowTree* target_tree = window_tree(); | 192 WindowTree* target_tree = window_tree(); |
| 188 TestChangeTracker* tracker = window_tree_client()->tracker(); | 193 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 189 ASSERT_EQ(1u, tracker->changes()->size()); | 194 ASSERT_EQ(1u, tracker->changes()->size()); |
| 190 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 195 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 191 ChangesToDescription1(*tracker->changes())[0]); | 196 ChangesToDescription1(*tracker->changes())[0]); |
| 192 | 197 |
| 193 WindowTreeTestApi(target_tree).AckOldestEvent(); | 198 WindowTreeTestApi(target_tree).AckOldestEvent(); |
| 194 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 199 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 195 } | 200 } |
| 196 | 201 |
| 197 // Tests that when a post target accelerator is provided on an event, that it is | 202 // Tests that when a post target accelerator is provided on an event, that it is |
| 198 // called on ack. | 203 // called on ack. |
| 199 TEST_F(WindowManagerStateTest, PostTargetAccelerator) { | 204 TEST_F(WindowManagerStateTest, PostTargetAccelerator) { |
| 200 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 205 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 201 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); | 206 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 202 | 207 |
| 203 ServerWindow* target = window(); | 208 ServerWindow* target = window(); |
| 204 DispatchInputEventToWindow(target, key, accelerator.get()); | 209 const Display* display = window_tree()->GetDisplay(target); |
| 210 DCHECK(display); |
| 211 DispatchInputEventToWindow(target, display->GetId(), key, accelerator.get()); |
| 205 TestChangeTracker* tracker = window_tree_client()->tracker(); | 212 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 206 ASSERT_EQ(1u, tracker->changes()->size()); | 213 ASSERT_EQ(1u, tracker->changes()->size()); |
| 207 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 214 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 208 ChangesToDescription1(*tracker->changes())[0]); | 215 ChangesToDescription1(*tracker->changes())[0]); |
| 209 | 216 |
| 210 WindowTreeTestApi(window_tree()).AckOldestEvent(); | 217 WindowTreeTestApi(window_tree()).AckOldestEvent(); |
| 211 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 218 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 212 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); | 219 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
| 213 } | 220 } |
| 214 | 221 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 EXPECT_TRUE((*tracker2->changes())[0].key_event_properties.empty()); | 350 EXPECT_TRUE((*tracker2->changes())[0].key_event_properties.empty()); |
| 344 } | 351 } |
| 345 | 352 |
| 346 // Tests that when a client handles an event that post target accelerators are | 353 // Tests that when a client handles an event that post target accelerators are |
| 347 // not called. | 354 // not called. |
| 348 TEST_F(WindowManagerStateTest, ClientHandlesEvent) { | 355 TEST_F(WindowManagerStateTest, ClientHandlesEvent) { |
| 349 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 356 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 350 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); | 357 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 351 | 358 |
| 352 ServerWindow* target = window(); | 359 ServerWindow* target = window(); |
| 353 DispatchInputEventToWindow(target, key, accelerator.get()); | 360 const Display* display = window_tree()->GetDisplay(target); |
| 361 DCHECK(display); |
| 362 DispatchInputEventToWindow(target, display->GetId(), key, accelerator.get()); |
| 354 TestChangeTracker* tracker = window_tree_client()->tracker(); | 363 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 355 ASSERT_EQ(1u, tracker->changes()->size()); | 364 ASSERT_EQ(1u, tracker->changes()->size()); |
| 356 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 365 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 357 ChangesToDescription1(*tracker->changes())[0]); | 366 ChangesToDescription1(*tracker->changes())[0]); |
| 358 | 367 |
| 359 EXPECT_TRUE(WindowManagerStateTestApi(window_manager_state()) | 368 EXPECT_TRUE(WindowManagerStateTestApi(window_manager_state()) |
| 360 .AckInFlightEvent(mojom::EventResult::HANDLED)); | 369 .AckInFlightEvent(mojom::EventResult::HANDLED)); |
| 361 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 370 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 362 } | 371 } |
| 363 | 372 |
| 364 // Tests that when an accelerator is deleted before an ack, that it is not | 373 // Tests that when an accelerator is deleted before an ack, that it is not |
| 365 // called. | 374 // called. |
| 366 TEST_F(WindowManagerStateTest, AcceleratorDeleted) { | 375 TEST_F(WindowManagerStateTest, AcceleratorDeleted) { |
| 367 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 376 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 368 std::unique_ptr<Accelerator> accelerator(CreateAccelerator()); | 377 std::unique_ptr<Accelerator> accelerator(CreateAccelerator()); |
| 369 | 378 |
| 370 ServerWindow* target = window(); | 379 ServerWindow* target = window(); |
| 371 DispatchInputEventToWindow(target, key, accelerator.get()); | 380 const Display* display = window_tree()->GetDisplay(target); |
| 381 DCHECK(display); |
| 382 DispatchInputEventToWindow(target, display->GetId(), key, accelerator.get()); |
| 372 TestChangeTracker* tracker = window_tree_client()->tracker(); | 383 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 373 ASSERT_EQ(1u, tracker->changes()->size()); | 384 ASSERT_EQ(1u, tracker->changes()->size()); |
| 374 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 385 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 375 ChangesToDescription1(*tracker->changes())[0]); | 386 ChangesToDescription1(*tracker->changes())[0]); |
| 376 | 387 |
| 377 accelerator.reset(); | 388 accelerator.reset(); |
| 378 EXPECT_TRUE(WindowManagerStateTestApi(window_manager_state()) | 389 EXPECT_TRUE(WindowManagerStateTestApi(window_manager_state()) |
| 379 .AckInFlightEvent(mojom::EventResult::UNHANDLED)); | 390 .AckInFlightEvent(mojom::EventResult::UNHANDLED)); |
| 380 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 391 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 381 } | 392 } |
| 382 | 393 |
| 383 // Tests that a events arriving before an ack don't notify the tree until the | 394 // Tests that a events arriving before an ack don't notify the tree until the |
| 384 // ack arrives, and that the correct accelerator is called. | 395 // ack arrives, and that the correct accelerator is called. |
| 385 TEST_F(WindowManagerStateTest, EnqueuedAccelerators) { | 396 TEST_F(WindowManagerStateTest, EnqueuedAccelerators) { |
| 386 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 397 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 387 std::unique_ptr<Accelerator> accelerator(CreateAccelerator()); | 398 std::unique_ptr<Accelerator> accelerator(CreateAccelerator()); |
| 388 | 399 |
| 389 ServerWindow* target = window(); | 400 ServerWindow* target = window(); |
| 390 DispatchInputEventToWindow(target, key, accelerator.get()); | 401 const Display* display = window_tree()->GetDisplay(target); |
| 402 DCHECK(display); |
| 403 DispatchInputEventToWindow(target, display->GetId(), key, accelerator.get()); |
| 391 TestChangeTracker* tracker = window_tree_client()->tracker(); | 404 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 392 ASSERT_EQ(1u, tracker->changes()->size()); | 405 ASSERT_EQ(1u, tracker->changes()->size()); |
| 393 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 406 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 394 ChangesToDescription1(*tracker->changes())[0]); | 407 ChangesToDescription1(*tracker->changes())[0]); |
| 395 | 408 |
| 396 tracker->changes()->clear(); | 409 tracker->changes()->clear(); |
| 397 ui::KeyEvent key2(ui::ET_KEY_PRESSED, ui::VKEY_Y, ui::EF_CONTROL_DOWN); | 410 ui::KeyEvent key2(ui::ET_KEY_PRESSED, ui::VKEY_Y, ui::EF_CONTROL_DOWN); |
| 398 mojom::EventMatcherPtr matcher = ui::CreateKeyMatcher( | 411 mojom::EventMatcherPtr matcher = ui::CreateKeyMatcher( |
| 399 ui::mojom::KeyboardCode::Y, ui::mojom::kEventFlagControlDown); | 412 ui::mojom::KeyboardCode::Y, ui::mojom::kEventFlagControlDown); |
| 400 matcher->accelerator_phase = ui::mojom::AcceleratorPhase::POST_TARGET; | 413 matcher->accelerator_phase = ui::mojom::AcceleratorPhase::POST_TARGET; |
| 401 uint32_t accelerator_id = 2; | 414 uint32_t accelerator_id = 2; |
| 402 std::unique_ptr<Accelerator> accelerator2( | 415 std::unique_ptr<Accelerator> accelerator2( |
| 403 new Accelerator(accelerator_id, *matcher)); | 416 new Accelerator(accelerator_id, *matcher)); |
| 404 DispatchInputEventToWindow(target, key2, accelerator2.get()); | 417 DispatchInputEventToWindow(target, display->GetId(), key2, |
| 418 accelerator2.get()); |
| 405 EXPECT_TRUE(tracker->changes()->empty()); | 419 EXPECT_TRUE(tracker->changes()->empty()); |
| 406 | 420 |
| 407 WindowTreeTestApi(window_tree()).AckOldestEvent(); | 421 WindowTreeTestApi(window_tree()).AckOldestEvent(); |
| 408 ASSERT_EQ(1u, tracker->changes()->size()); | 422 ASSERT_EQ(1u, tracker->changes()->size()); |
| 409 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 423 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 410 ChangesToDescription1(*tracker->changes())[0]); | 424 ChangesToDescription1(*tracker->changes())[0]); |
| 411 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 425 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 412 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); | 426 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
| 413 } | 427 } |
| 414 | 428 |
| 415 // Tests that the accelerator is not sent when the tree is dying. | 429 // Tests that the accelerator is not sent when the tree is dying. |
| 416 TEST_F(WindowManagerStateTest, DeleteTree) { | 430 TEST_F(WindowManagerStateTest, DeleteTree) { |
| 417 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 431 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 418 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); | 432 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 419 | 433 |
| 420 ServerWindow* target = window(); | 434 ServerWindow* target = window(); |
| 421 DispatchInputEventToWindow(target, key, accelerator.get()); | 435 const Display* display = window_tree()->GetDisplay(target); |
| 436 DCHECK(display); |
| 437 DispatchInputEventToWindow(target, display->GetId(), key, accelerator.get()); |
| 422 TestChangeTracker* tracker = window_tree_client()->tracker(); | 438 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 423 ASSERT_EQ(1u, tracker->changes()->size()); | 439 ASSERT_EQ(1u, tracker->changes()->size()); |
| 424 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 440 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 425 ChangesToDescription1(*tracker->changes())[0]); | 441 ChangesToDescription1(*tracker->changes())[0]); |
| 426 | 442 |
| 427 window_manager_state()->OnWillDestroyTree(tree()); | 443 window_manager_state()->OnWillDestroyTree(tree()); |
| 428 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 444 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 429 } | 445 } |
| 430 | 446 |
| 431 // Tests that if a tree is destroyed before acking, that the accelerator is | 447 // Tests that if a tree is destroyed before acking, that the accelerator is |
| 432 // still sent if it is not the root tree. | 448 // still sent if it is not the root tree. |
| 433 TEST_F(WindowManagerStateTest, DeleteNonRootTree) { | 449 TEST_F(WindowManagerStateTest, DeleteNonRootTree) { |
| 434 TestWindowTreeClient* embed_connection = nullptr; | 450 TestWindowTreeClient* embed_connection = nullptr; |
| 435 WindowTree* target_tree = nullptr; | 451 WindowTree* target_tree = nullptr; |
| 436 ServerWindow* target = nullptr; | 452 ServerWindow* target = nullptr; |
| 437 CreateSecondaryTree(&embed_connection, &target_tree, &target); | 453 CreateSecondaryTree(&embed_connection, &target_tree, &target); |
| 438 TestWindowManager target_window_manager; | 454 TestWindowManager target_window_manager; |
| 439 WindowTreeTestApi(target_tree) | 455 WindowTreeTestApi(target_tree) |
| 440 .set_window_manager_internal(&target_window_manager); | 456 .set_window_manager_internal(&target_window_manager); |
| 441 | 457 |
| 442 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 458 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 443 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); | 459 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 444 DispatchInputEventToWindow(target, key, accelerator.get()); | 460 const Display* display = target_tree->GetDisplay(target); |
| 461 DCHECK(display); |
| 462 DispatchInputEventToWindow(target, display->GetId(), key, accelerator.get()); |
| 445 TestChangeTracker* tracker = embed_connection->tracker(); | 463 TestChangeTracker* tracker = embed_connection->tracker(); |
| 446 ASSERT_EQ(1u, tracker->changes()->size()); | 464 ASSERT_EQ(1u, tracker->changes()->size()); |
| 447 EXPECT_EQ("InputEvent window=2,1 event_action=7", | 465 EXPECT_EQ("InputEvent window=2,1 event_action=7", |
| 448 ChangesToDescription1(*tracker->changes())[0]); | 466 ChangesToDescription1(*tracker->changes())[0]); |
| 449 EXPECT_TRUE(wm_client()->tracker()->changes()->empty()); | 467 EXPECT_TRUE(wm_client()->tracker()->changes()->empty()); |
| 450 | 468 |
| 451 window_manager_state()->OnWillDestroyTree(target_tree); | 469 window_manager_state()->OnWillDestroyTree(target_tree); |
| 452 EXPECT_FALSE(target_window_manager.on_accelerator_called()); | 470 EXPECT_FALSE(target_window_manager.on_accelerator_called()); |
| 453 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 471 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 454 } | 472 } |
| 455 | 473 |
| 456 // Tests that if a tree is destroyed before acking an event, that mus won't | 474 // Tests that if a tree is destroyed before acking an event, that mus won't |
| 457 // then try to send any queued events. | 475 // then try to send any queued events. |
| 458 TEST_F(WindowManagerStateTest, DontSendQueuedEventsToADeadTree) { | 476 TEST_F(WindowManagerStateTest, DontSendQueuedEventsToADeadTree) { |
| 459 ServerWindow* target = window(); | 477 ServerWindow* target = window(); |
| 460 TestChangeTracker* tracker = window_tree_client()->tracker(); | 478 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 461 | 479 |
| 480 const Display* display = window_tree()->GetDisplay(target); |
| 481 DCHECK(display); |
| 462 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(5, 5), gfx::Point(5, 5), | 482 ui::MouseEvent press(ui::ET_MOUSE_PRESSED, gfx::Point(5, 5), gfx::Point(5, 5), |
| 463 base::TimeTicks(), EF_LEFT_MOUSE_BUTTON, | 483 base::TimeTicks(), EF_LEFT_MOUSE_BUTTON, |
| 464 EF_LEFT_MOUSE_BUTTON); | 484 EF_LEFT_MOUSE_BUTTON); |
| 465 DispatchInputEventToWindow(target, press, nullptr); | 485 DispatchInputEventToWindow(target, display->GetId(), press, nullptr); |
| 466 ASSERT_EQ(1u, tracker->changes()->size()); | 486 ASSERT_EQ(1u, tracker->changes()->size()); |
| 467 EXPECT_EQ("InputEvent window=1,1 event_action=1", | 487 EXPECT_EQ("InputEvent window=1,1 event_action=1", |
| 468 ChangesToDescription1(*tracker->changes())[0]); | 488 ChangesToDescription1(*tracker->changes())[0]); |
| 469 tracker->changes()->clear(); | 489 tracker->changes()->clear(); |
| 470 // The above is not setting TreeAwaitingInputAck. | 490 // The above is not setting TreeAwaitingInputAck. |
| 471 | 491 |
| 472 // Queue the key release event; it should not be immediately dispatched | 492 // Queue the key release event; it should not be immediately dispatched |
| 473 // because there's no ACK for the last one. | 493 // because there's no ACK for the last one. |
| 474 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(5, 5), | 494 ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(5, 5), |
| 475 gfx::Point(5, 5), base::TimeTicks(), | 495 gfx::Point(5, 5), base::TimeTicks(), |
| 476 EF_LEFT_MOUSE_BUTTON, EF_LEFT_MOUSE_BUTTON); | 496 EF_LEFT_MOUSE_BUTTON, EF_LEFT_MOUSE_BUTTON); |
| 477 DispatchInputEventToWindow(target, release, nullptr); | 497 DispatchInputEventToWindow(target, display->GetId(), release, nullptr); |
| 478 EXPECT_EQ(0u, tracker->changes()->size()); | 498 EXPECT_EQ(0u, tracker->changes()->size()); |
| 479 | 499 |
| 480 // Destroying a window tree with an event in queue shouldn't crash. | 500 // Destroying a window tree with an event in queue shouldn't crash. |
| 481 DestroyWindowTree(); | 501 DestroyWindowTree(); |
| 482 } | 502 } |
| 483 | 503 |
| 484 // Tests that when an ack times out that the accelerator is notified. | 504 // Tests that when an ack times out that the accelerator is notified. |
| 485 TEST_F(WindowManagerStateTest, AckTimeout) { | 505 TEST_F(WindowManagerStateTest, AckTimeout) { |
| 486 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); | 506 ui::KeyEvent key(ui::ET_KEY_PRESSED, ui::VKEY_W, ui::EF_CONTROL_DOWN); |
| 487 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); | 507 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 488 DispatchInputEventToWindow(window(), key, accelerator.get()); | 508 const Display* display = window_tree()->GetDisplay(window()); |
| 509 DCHECK(display); |
| 510 DispatchInputEventToWindow(window(), display->GetId(), key, |
| 511 accelerator.get()); |
| 489 TestChangeTracker* tracker = window_tree_client()->tracker(); | 512 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 490 ASSERT_EQ(1u, tracker->changes()->size()); | 513 ASSERT_EQ(1u, tracker->changes()->size()); |
| 491 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 514 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 492 ChangesToDescription1(*tracker->changes())[0]); | 515 ChangesToDescription1(*tracker->changes())[0]); |
| 493 | 516 |
| 494 OnEventAckTimeout(window()->id().client_id); | 517 OnEventAckTimeout(window()->id().client_id); |
| 495 EXPECT_TRUE(window_manager()->on_accelerator_called()); | 518 EXPECT_TRUE(window_manager()->on_accelerator_called()); |
| 496 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); | 519 EXPECT_EQ(accelerator->id(), window_manager()->on_accelerator_id()); |
| 497 } | 520 } |
| 498 | 521 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 513 { | 536 { |
| 514 // Do a normal embed. | 537 // Do a normal embed. |
| 515 const uint32_t embed_flags = 0; | 538 const uint32_t embed_flags = 0; |
| 516 WindowTree* embed_tree = nullptr; | 539 WindowTree* embed_tree = nullptr; |
| 517 TestWindowTreeClient* embed_client_proxy = nullptr; | 540 TestWindowTreeClient* embed_client_proxy = nullptr; |
| 518 EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree, | 541 EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree, |
| 519 &embed_client_proxy); | 542 &embed_client_proxy); |
| 520 ASSERT_TRUE(embed_client_proxy); | 543 ASSERT_TRUE(embed_client_proxy); |
| 521 | 544 |
| 522 // Send an event to the embed window. It should go to the embedded client. | 545 // Send an event to the embed window. It should go to the embedded client. |
| 546 const Display* display = embed_tree->GetDisplay(embedder_window); |
| 547 DCHECK(display); |
| 523 ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), | 548 ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), |
| 524 base::TimeTicks(), 0, 0); | 549 base::TimeTicks(), 0, 0); |
| 525 DispatchInputEventToWindow(embedder_window, mouse, nullptr); | 550 DispatchInputEventToWindow(embedder_window, display->GetId(), mouse, |
| 551 nullptr); |
| 526 ASSERT_EQ(1u, embed_client_proxy->tracker()->changes()->size()); | 552 ASSERT_EQ(1u, embed_client_proxy->tracker()->changes()->size()); |
| 527 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, | 553 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, |
| 528 (*embed_client_proxy->tracker()->changes())[0].type); | 554 (*embed_client_proxy->tracker()->changes())[0].type); |
| 529 WindowTreeTestApi(embed_tree).AckLastEvent(mojom::EventResult::UNHANDLED); | 555 WindowTreeTestApi(embed_tree).AckLastEvent(mojom::EventResult::UNHANDLED); |
| 530 embed_client_proxy->tracker()->changes()->clear(); | 556 embed_client_proxy->tracker()->changes()->clear(); |
| 531 } | 557 } |
| 532 | 558 |
| 533 { | 559 { |
| 534 // Do an embed where the embedder wants to intercept events to the embedded | 560 // Do an embed where the embedder wants to intercept events to the embedded |
| 535 // tree. | 561 // tree. |
| 536 const uint32_t embed_flags = mojom::kEmbedFlagEmbedderInterceptsEvents; | 562 const uint32_t embed_flags = mojom::kEmbedFlagEmbedderInterceptsEvents; |
| 537 WindowTree* embed_tree = nullptr; | 563 WindowTree* embed_tree = nullptr; |
| 538 TestWindowTreeClient* embed_client_proxy = nullptr; | 564 TestWindowTreeClient* embed_client_proxy = nullptr; |
| 539 EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree, | 565 EmbedAt(embedder_tree, embed_window_id, embed_flags, &embed_tree, |
| 540 &embed_client_proxy); | 566 &embed_client_proxy); |
| 541 ASSERT_TRUE(embed_client_proxy); | 567 ASSERT_TRUE(embed_client_proxy); |
| 542 embedder_client->tracker()->changes()->clear(); | 568 embedder_client->tracker()->changes()->clear(); |
| 543 | 569 |
| 544 // Send an event to the embed window. But this time, it should reach the | 570 // Send an event to the embed window. But this time, it should reach the |
| 545 // embedder. | 571 // embedder. |
| 572 const Display* display = embed_tree->GetDisplay(embedder_window); |
| 573 DCHECK(display); |
| 546 ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), | 574 ui::MouseEvent mouse(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), |
| 547 base::TimeTicks(), 0, 0); | 575 base::TimeTicks(), 0, 0); |
| 548 DispatchInputEventToWindow(embedder_window, mouse, nullptr); | 576 DispatchInputEventToWindow(embedder_window, display->GetId(), mouse, |
| 577 nullptr); |
| 549 ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size()); | 578 ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size()); |
| 550 ASSERT_EQ(1u, embedder_client->tracker()->changes()->size()); | 579 ASSERT_EQ(1u, embedder_client->tracker()->changes()->size()); |
| 551 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, | 580 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, |
| 552 (*embedder_client->tracker()->changes())[0].type); | 581 (*embedder_client->tracker()->changes())[0].type); |
| 553 WindowTreeTestApi(embedder_tree) | 582 WindowTreeTestApi(embedder_tree) |
| 554 .AckLastEvent(mojom::EventResult::UNHANDLED); | 583 .AckLastEvent(mojom::EventResult::UNHANDLED); |
| 555 embedder_client->tracker()->changes()->clear(); | 584 embedder_client->tracker()->changes()->clear(); |
| 556 | 585 |
| 557 // Embed another tree in the embedded tree. | 586 // Embed another tree in the embedded tree. |
| 558 const ClientWindowId nested_embed_window_id( | 587 const ClientWindowId nested_embed_window_id( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 570 embed_client_proxy->tracker()->changes()->clear(); | 599 embed_client_proxy->tracker()->changes()->clear(); |
| 571 embedder_client->tracker()->changes()->clear(); | 600 embedder_client->tracker()->changes()->clear(); |
| 572 | 601 |
| 573 // Send an event to the nested embed window. The event should still reach | 602 // Send an event to the nested embed window. The event should still reach |
| 574 // the outermost embedder. | 603 // the outermost embedder. |
| 575 ServerWindow* nested_embed_window = | 604 ServerWindow* nested_embed_window = |
| 576 embed_tree->GetWindowByClientId(nested_embed_window_id); | 605 embed_tree->GetWindowByClientId(nested_embed_window_id); |
| 577 DCHECK(nested_embed_window->parent()); | 606 DCHECK(nested_embed_window->parent()); |
| 578 mouse = ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), | 607 mouse = ui::MouseEvent(ui::ET_MOUSE_MOVED, gfx::Point(), gfx::Point(), |
| 579 base::TimeTicks(), 0, 0); | 608 base::TimeTicks(), 0, 0); |
| 580 DispatchInputEventToWindow(nested_embed_window, mouse, nullptr); | 609 DispatchInputEventToWindow(nested_embed_window, display->GetId(), mouse, |
| 610 nullptr); |
| 581 ASSERT_EQ(0u, nested_embed_client_proxy->tracker()->changes()->size()); | 611 ASSERT_EQ(0u, nested_embed_client_proxy->tracker()->changes()->size()); |
| 582 ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size()); | 612 ASSERT_EQ(0u, embed_client_proxy->tracker()->changes()->size()); |
| 583 | 613 |
| 584 ASSERT_EQ(1u, embedder_client->tracker()->changes()->size()); | 614 ASSERT_EQ(1u, embedder_client->tracker()->changes()->size()); |
| 585 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, | 615 EXPECT_EQ(CHANGE_TYPE_INPUT_EVENT, |
| 586 (*embedder_client->tracker()->changes())[0].type); | 616 (*embedder_client->tracker()->changes())[0].type); |
| 587 WindowTreeTestApi(embedder_tree) | 617 WindowTreeTestApi(embedder_tree) |
| 588 .AckLastEvent(mojom::EventResult::UNHANDLED); | 618 .AckLastEvent(mojom::EventResult::UNHANDLED); |
| 589 } | 619 } |
| 590 } | 620 } |
| 591 | 621 |
| 592 // Ensures accelerators are forgotten between events. | 622 // Ensures accelerators are forgotten between events. |
| 593 TEST_F(WindowManagerStateTest, PostAcceleratorForgotten) { | 623 TEST_F(WindowManagerStateTest, PostAcceleratorForgotten) { |
| 594 // Send an event that matches the accelerator and have the target respond | 624 // Send an event that matches the accelerator and have the target respond |
| 595 // that it handled the event so that the accelerator isn't called. | 625 // that it handled the event so that the accelerator isn't called. |
| 596 ui::KeyEvent accelerator_key(ui::ET_KEY_PRESSED, ui::VKEY_W, | 626 ui::KeyEvent accelerator_key(ui::ET_KEY_PRESSED, ui::VKEY_W, |
| 597 ui::EF_CONTROL_DOWN); | 627 ui::EF_CONTROL_DOWN); |
| 598 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); | 628 std::unique_ptr<Accelerator> accelerator = CreateAccelerator(); |
| 599 ServerWindow* target = window(); | 629 ServerWindow* target = window(); |
| 600 DispatchInputEventToWindow(target, accelerator_key, accelerator.get()); | 630 const Display* display = window_tree()->GetDisplay(target); |
| 631 DCHECK(display); |
| 632 DispatchInputEventToWindow(target, display->GetId(), accelerator_key, |
| 633 accelerator.get()); |
| 601 TestChangeTracker* tracker = window_tree_client()->tracker(); | 634 TestChangeTracker* tracker = window_tree_client()->tracker(); |
| 602 ASSERT_EQ(1u, tracker->changes()->size()); | 635 ASSERT_EQ(1u, tracker->changes()->size()); |
| 603 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 636 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 604 ChangesToDescription1(*tracker->changes())[0]); | 637 ChangesToDescription1(*tracker->changes())[0]); |
| 605 tracker->changes()->clear(); | 638 tracker->changes()->clear(); |
| 606 WindowTreeTestApi(window_tree()).AckLastEvent(mojom::EventResult::HANDLED); | 639 WindowTreeTestApi(window_tree()).AckLastEvent(mojom::EventResult::HANDLED); |
| 607 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 640 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 608 | 641 |
| 609 // Send another event that doesn't match the accelerator, the accelerator | 642 // Send another event that doesn't match the accelerator, the accelerator |
| 610 // shouldn't be called. | 643 // shouldn't be called. |
| 611 ui::KeyEvent non_accelerator_key(ui::ET_KEY_PRESSED, ui::VKEY_T, | 644 ui::KeyEvent non_accelerator_key(ui::ET_KEY_PRESSED, ui::VKEY_T, |
| 612 ui::EF_CONTROL_DOWN); | 645 ui::EF_CONTROL_DOWN); |
| 613 DispatchInputEventToWindow(target, non_accelerator_key, nullptr); | 646 DispatchInputEventToWindow(target, display->GetId(), non_accelerator_key, |
| 647 nullptr); |
| 614 ASSERT_EQ(1u, tracker->changes()->size()); | 648 ASSERT_EQ(1u, tracker->changes()->size()); |
| 615 EXPECT_EQ("InputEvent window=1,1 event_action=7", | 649 EXPECT_EQ("InputEvent window=1,1 event_action=7", |
| 616 ChangesToDescription1(*tracker->changes())[0]); | 650 ChangesToDescription1(*tracker->changes())[0]); |
| 617 WindowTreeTestApi(window_tree()).AckLastEvent(mojom::EventResult::UNHANDLED); | 651 WindowTreeTestApi(window_tree()).AckLastEvent(mojom::EventResult::UNHANDLED); |
| 618 EXPECT_FALSE(window_manager()->on_accelerator_called()); | 652 EXPECT_FALSE(window_manager()->on_accelerator_called()); |
| 619 } | 653 } |
| 620 | 654 |
| 621 // Verifies there is no crash if the WindowTree of a window manager is destroyed | 655 // Verifies there is no crash if the WindowTree of a window manager is destroyed |
| 622 // with no roots. | 656 // with no roots. |
| 623 TEST(WindowManagerStateShutdownTest, DestroyTreeBeforeDisplay) { | 657 TEST(WindowManagerStateShutdownTest, DestroyTreeBeforeDisplay) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 661 base::TimeTicks()); | 695 base::TimeTicks()); |
| 662 window_manager_state()->ProcessEvent(move, 0); | 696 window_manager_state()->ProcessEvent(move, 0); |
| 663 // The event isn't over a valid target, which should trigger resetting the | 697 // The event isn't over a valid target, which should trigger resetting the |
| 664 // cursor to POINTER. | 698 // cursor to POINTER. |
| 665 EXPECT_EQ(ui::CursorType::kPointer, cursor_type()); | 699 EXPECT_EQ(ui::CursorType::kPointer, cursor_type()); |
| 666 } | 700 } |
| 667 | 701 |
| 668 } // namespace test | 702 } // namespace test |
| 669 } // namespace ws | 703 } // namespace ws |
| 670 } // namespace ui | 704 } // namespace ui |
| OLD | NEW |