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

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

Issue 2183163002: mus: Change PointerWatcher to observe all pointer events, with moves optional. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Event conversion; comments; rebase Created 4 years, 4 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_tree.h" 5 #include "services/ui/ws/window_tree.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
83 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, 83 ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON,
84 ui::EF_LEFT_MOUSE_BUTTON)); 84 ui::EF_LEFT_MOUSE_BUTTON));
85 } 85 }
86 86
87 ServerWindow* GetCaptureWindow(Display* display) { 87 ServerWindow* GetCaptureWindow(Display* display) {
88 return display->GetActiveWindowManagerDisplayRoot() 88 return display->GetActiveWindowManagerDisplayRoot()
89 ->window_manager_state() 89 ->window_manager_state()
90 ->capture_window(); 90 ->capture_window();
91 } 91 }
92 92
93 mojom::EventMatcherPtr CreateEventMatcher(ui::mojom::EventType type) {
94 mojom::EventMatcherPtr matcher = mojom::EventMatcher::New();
95 matcher->type_matcher = mojom::EventTypeMatcher::New();
96 matcher->type_matcher->type = type;
97 return matcher;
98 }
99
100 class TestMoveLoopWindowManager : public TestWindowManager { 93 class TestMoveLoopWindowManager : public TestWindowManager {
101 public: 94 public:
102 TestMoveLoopWindowManager(WindowTree* tree) : tree_(tree) {} 95 TestMoveLoopWindowManager(WindowTree* tree) : tree_(tree) {}
103 ~TestMoveLoopWindowManager() override {} 96 ~TestMoveLoopWindowManager() override {}
104 97
105 void WmPerformMoveLoop(uint32_t change_id, 98 void WmPerformMoveLoop(uint32_t change_id,
106 uint32_t window_id, 99 uint32_t window_id,
107 mojom::MoveLoopSource source, 100 mojom::MoveLoopSource source,
108 const gfx::Point& cursor_location) override { 101 const gfx::Point& cursor_location) override {
109 static_cast<mojom::WindowManagerClient*>(tree_)->WmResponse( 102 static_cast<mojom::WindowManagerClient*>(tree_)->WmResponse(
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
302 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size()); 295 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size());
303 EXPECT_EQ("Focused id=2,1", 296 EXPECT_EQ("Focused id=2,1",
304 ChangesToDescription1(*wm_client()->tracker()->changes())[0]); 297 ChangesToDescription1(*wm_client()->tracker()->changes())[0]);
305 ASSERT_EQ(2u, embed_client->tracker()->changes()->size()); 298 ASSERT_EQ(2u, embed_client->tracker()->changes()->size());
306 EXPECT_EQ("Focused id=2,1", 299 EXPECT_EQ("Focused id=2,1",
307 ChangesToDescription1(*embed_client->tracker()->changes())[0]); 300 ChangesToDescription1(*embed_client->tracker()->changes())[0]);
308 EXPECT_EQ("InputEvent window=2,1 event_action=16", 301 EXPECT_EQ("InputEvent window=2,1 event_action=16",
309 ChangesToDescription1(*embed_client->tracker()->changes())[1]); 302 ChangesToDescription1(*embed_client->tracker()->changes())[1]);
310 } 303 }
311 304
312 // Tests that a client can observe events outside its bounds. 305 // Tests that a client can watch for events outside its bounds.
313 TEST_F(WindowTreeTest, SetEventObserver) { 306 TEST_F(WindowTreeTest, StartPointerWatcher) {
314 // Create an embedded client. 307 // Create an embedded client.
315 TestWindowTreeClient* client = nullptr; 308 TestWindowTreeClient* client = nullptr;
316 WindowTree* tree = nullptr; 309 WindowTree* tree = nullptr;
317 ServerWindow* window = nullptr; 310 ServerWindow* window = nullptr;
318 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); 311 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window));
319 312
320 // Create an event outside the bounds of the client. 313 // Create an event outside the bounds of the client.
321 ui::PointerEvent pointer_down = CreatePointerDownEvent(5, 5); 314 ui::PointerEvent pointer_down = CreatePointerDownEvent(5, 5);
322 315
323 // Events are not observed before setting an observer. 316 // Events are not watched before starting a watcher.
324 DispatchEventAndAckImmediately(pointer_down); 317 DispatchEventAndAckImmediately(pointer_down);
325 ASSERT_EQ(0u, client->tracker()->changes()->size()); 318 ASSERT_EQ(0u, client->tracker()->changes()->size());
326 319
327 // Create an observer for pointer-down events. 320 // Create a watcher for all events excluding move events.
328 WindowTreeTestApi(tree).SetEventObserver( 321 WindowTreeTestApi(tree).StartPointerWatcher(false, 111u);
329 CreateEventMatcher(ui::mojom::EventType::POINTER_DOWN), 111u);
330 322
331 // Pointer-down events are sent to the client. 323 // Pointer-down events are sent to the client.
332 DispatchEventAndAckImmediately(pointer_down); 324 DispatchEventAndAckImmediately(pointer_down);
333 ASSERT_EQ(1u, client->tracker()->changes()->size()); 325 ASSERT_EQ(1u, client->tracker()->changes()->size());
334 EXPECT_EQ("EventObserved event_action=16 event_observer_id=111", 326 EXPECT_EQ("PointerWatcherEvent event_action=16 pointer_watcher_id=111",
335 ChangesToDescription1(*client->tracker()->changes())[0]); 327 ChangesToDescription1(*client->tracker()->changes())[0]);
336 client->tracker()->changes()->clear(); 328 client->tracker()->changes()->clear();
337 329
338 // Clearing the observer stops sending events to the client. 330 // Stopping the watcher stops sending events to the client.
339 WindowTreeTestApi(tree).SetEventObserver(nullptr, 0u); 331 WindowTreeTestApi(tree).StopPointerWatcher();
340 DispatchEventAndAckImmediately(pointer_down); 332 DispatchEventAndAckImmediately(pointer_down);
341 ASSERT_EQ(0u, client->tracker()->changes()->size()); 333 ASSERT_EQ(0u, client->tracker()->changes()->size());
342 } 334 }
343 335
344 // Tests that a client using an event observer does not receive events that 336 // Tests that a client using a pointer watcher does not receive events that
345 // don't match the EventMatcher spec. 337 // don't match the |want_moves| setting.
346 TEST_F(WindowTreeTest, SetEventObserverNonMatching) { 338 TEST_F(WindowTreeTest, StartPointerWatcherNonMatching) {
347 // Create an embedded client. 339 // Create an embedded client.
348 TestWindowTreeClient* client = nullptr; 340 TestWindowTreeClient* client = nullptr;
349 WindowTree* tree = nullptr; 341 WindowTree* tree = nullptr;
350 ServerWindow* window = nullptr; 342 ServerWindow* window = nullptr;
351 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); 343 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window));
352 344
353 // Create an observer for pointer-down events. 345 // Create a watcher for all events excluding move events.
354 WindowTreeTestApi(tree).SetEventObserver( 346 WindowTreeTestApi(tree).StartPointerWatcher(false, 111u);
355 CreateEventMatcher(ui::mojom::EventType::POINTER_DOWN), 111u);
356 347
357 // Pointer-up events are not sent to the client, since they don't match. 348 // Pointer-move events are not sent to the client, since they don't match.
358 DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5)); 349 DispatchEventAndAckImmediately(CreateMouseMoveEvent(5, 5));
359 ASSERT_EQ(0u, client->tracker()->changes()->size()); 350 ASSERT_EQ(0u, client->tracker()->changes()->size());
360 } 351 }
361 352
362 // Tests that an event that both hits a client window and matches an event 353 // Tests that an event that both hits a client window and matches a pointer
363 // observer is sent only once to the client. 354 // watcher is sent only once to the client.
364 TEST_F(WindowTreeTest, SetEventObserverSendsOnce) { 355 TEST_F(WindowTreeTest, StartPointerWatcherSendsOnce) {
365 // Create an embedded client. 356 // Create an embedded client.
366 TestWindowTreeClient* client = nullptr; 357 TestWindowTreeClient* client = nullptr;
367 WindowTree* tree = nullptr; 358 WindowTree* tree = nullptr;
368 ServerWindow* window = nullptr; 359 ServerWindow* window = nullptr;
369 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window)); 360 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&client, &tree, &window));
370 361
371 // Create an observer for pointer-up events (which do not cause focus 362 // Create a watcher for all events excluding move events (which do not
372 // changes). 363 // cause focus changes).
373 WindowTreeTestApi(tree).SetEventObserver( 364 WindowTreeTestApi(tree).StartPointerWatcher(false, 111u);
374 CreateEventMatcher(ui::mojom::EventType::POINTER_UP), 111u);
375 365
376 // Create an event inside the bounds of the client. 366 // Create an event inside the bounds of the client.
377 ui::PointerEvent pointer_up = CreatePointerUpEvent(25, 25); 367 ui::PointerEvent pointer_up = CreatePointerUpEvent(25, 25);
378 368
379 // The event is dispatched once, with a flag set that it matched the event 369 // The event is dispatched once, with a flag set that it matched the pointer
380 // observer. 370 // watcher.
381 DispatchEventAndAckImmediately(pointer_up); 371 DispatchEventAndAckImmediately(pointer_up);
382 ASSERT_EQ(1u, client->tracker()->changes()->size()); 372 ASSERT_EQ(1u, client->tracker()->changes()->size());
383 EXPECT_EQ("InputEvent window=2,1 event_action=18 event_observer_id=111", 373 EXPECT_EQ("InputEvent window=2,1 event_action=18 pointer_watcher_id=111",
384 SingleChangeToDescription(*client->tracker()->changes())); 374 SingleChangeToDescription(*client->tracker()->changes()));
385 } 375 }
386 376
387 // Tests that events generated by user A are not observed by event observers for 377 // Tests that events generated by user A are not watched by pointer watchers
388 // user B. 378 // for user B.
389 TEST_F(WindowTreeTest, SetEventObserverWrongUser) { 379 TEST_F(WindowTreeTest, StartPointerWatcherWrongUser) {
390 // Embed a window tree belonging to a different user. 380 // Embed a window tree belonging to a different user.
391 TestWindowTreeBinding* other_binding; 381 TestWindowTreeBinding* other_binding;
392 WindowTree* other_tree = CreateNewTree("other_user", &other_binding); 382 WindowTree* other_tree = CreateNewTree("other_user", &other_binding);
393 other_binding->client()->tracker()->changes()->clear(); 383 other_binding->client()->tracker()->changes()->clear();
394 384
395 // Set event observers on both the wm tree and the other user's tree. 385 // Set pointer watchers on both the wm tree and the other user's tree.
396 WindowTreeTestApi(wm_tree()).SetEventObserver( 386 WindowTreeTestApi(wm_tree()).StartPointerWatcher(false, 111u);
397 CreateEventMatcher(ui::mojom::EventType::POINTER_UP), 111u); 387 WindowTreeTestApi(other_tree).StartPointerWatcher(false, 222u);
398 WindowTreeTestApi(other_tree)
399 .SetEventObserver(CreateEventMatcher(ui::mojom::EventType::POINTER_UP),
400 222u);
401 388
402 // An event is observed by the wm tree, but not by the other user's tree. 389 // An event is watched by the wm tree, but not by the other user's tree.
403 DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5)); 390 DispatchEventAndAckImmediately(CreatePointerUpEvent(5, 5));
404 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size()); 391 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size());
405 EXPECT_EQ("InputEvent window=0,3 event_action=18 event_observer_id=111", 392 EXPECT_EQ("InputEvent window=0,3 event_action=18 pointer_watcher_id=111",
406 SingleChangeToDescription(*wm_client()->tracker()->changes())); 393 SingleChangeToDescription(*wm_client()->tracker()->changes()));
407 ASSERT_EQ(0u, other_binding->client()->tracker()->changes()->size()); 394 ASSERT_EQ(0u, other_binding->client()->tracker()->changes()->size());
408 } 395 }
409 396
410 // Tests that an event observer cannot observe keystrokes. 397 // Tests that a pointer watcher cannot watch keystrokes.
411 TEST_F(WindowTreeTest, SetEventObserverKeyEventsDisallowed) { 398 TEST_F(WindowTreeTest, StartPointerWatcherKeyEventsDisallowed) {
412 WindowTreeTestApi(wm_tree()).SetEventObserver( 399 WindowTreeTestApi(wm_tree()).StartPointerWatcher(false, 111u);
413 CreateEventMatcher(ui::mojom::EventType::KEY_PRESSED), 111u);
414 ui::KeyEvent key_pressed(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE); 400 ui::KeyEvent key_pressed(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
415 DispatchEventAndAckImmediately(key_pressed); 401 DispatchEventAndAckImmediately(key_pressed);
416 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size()); 402 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size());
417 403
418 WindowTreeTestApi(wm_tree()).SetEventObserver( 404 WindowTreeTestApi(wm_tree()).StartPointerWatcher(false, 222u);
419 CreateEventMatcher(ui::mojom::EventType::KEY_RELEASED), 222u);
420 ui::KeyEvent key_released(ui::ET_KEY_RELEASED, ui::VKEY_A, ui::EF_NONE); 405 ui::KeyEvent key_released(ui::ET_KEY_RELEASED, ui::VKEY_A, ui::EF_NONE);
421 DispatchEventAndAckImmediately(key_released); 406 DispatchEventAndAckImmediately(key_released);
422 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size()); 407 EXPECT_EQ(0u, wm_client()->tracker()->changes()->size());
423 } 408 }
424 409
425 TEST_F(WindowTreeTest, CursorChangesWhenMouseOverWindowAndWindowSetsCursor) { 410 TEST_F(WindowTreeTest, CursorChangesWhenMouseOverWindowAndWindowSetsCursor) {
426 TestWindowTreeClient* embed_client = nullptr; 411 TestWindowTreeClient* embed_client = nullptr;
427 WindowTree* tree = nullptr; 412 WindowTree* tree = nullptr;
428 ServerWindow* window = nullptr; 413 ServerWindow* window = nullptr;
429 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_client, &tree, &window)); 414 EXPECT_NO_FATAL_FAILURE(SetupEventTargeting(&embed_client, &tree, &window));
(...skipping 823 matching lines...) Expand 10 before | Expand all | Expand 10 after
1253 1238
1254 EXPECT_TRUE(window->can_accept_events()); 1239 EXPECT_TRUE(window->can_accept_events());
1255 WindowTreeTestApi(tree).SetCanAcceptEvents( 1240 WindowTreeTestApi(tree).SetCanAcceptEvents(
1256 ClientWindowIdForWindow(tree, window).id, false); 1241 ClientWindowIdForWindow(tree, window).id, false);
1257 EXPECT_FALSE(window->can_accept_events()); 1242 EXPECT_FALSE(window->can_accept_events());
1258 } 1243 }
1259 1244
1260 } // namespace test 1245 } // namespace test
1261 } // namespace ws 1246 } // namespace ws
1262 } // namespace ui 1247 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698