Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(326)

Side by Side Diff: services/ui/ws/window_manager_state_unittest.cc

Issue 2778943005: Keep root_location to be in pixels and display coordinates in WS. (Closed)
Patch Set: const Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « services/ui/ws/window_manager_state.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « services/ui/ws/window_manager_state.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698