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

Side by Side Diff: components/mus/ws/window_tree_unittest.cc

Issue 1465803003: mus: Let clients set the cursor of their window. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix WindowTreeAppTest.SetCursor. Created 5 years 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 <string> 5 #include <string>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "components/mus/common/types.h" 9 #include "components/mus/common/types.h"
10 #include "components/mus/common/util.h" 10 #include "components/mus/common/util.h"
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 tracker_.OnWindowSharedPropertyChanged(window, name, new_data.Pass()); 117 tracker_.OnWindowSharedPropertyChanged(window, name, new_data.Pass());
118 } 118 }
119 void OnWindowInputEvent(uint32_t event_id, 119 void OnWindowInputEvent(uint32_t event_id,
120 uint32_t window, 120 uint32_t window,
121 EventPtr event) override { 121 EventPtr event) override {
122 tracker_.OnWindowInputEvent(window, event.Pass()); 122 tracker_.OnWindowInputEvent(window, event.Pass());
123 } 123 }
124 void OnWindowFocused(uint32_t focused_window_id) override { 124 void OnWindowFocused(uint32_t focused_window_id) override {
125 tracker_.OnWindowFocused(focused_window_id); 125 tracker_.OnWindowFocused(focused_window_id);
126 } 126 }
127 void OnWindowSetPredefinedCursor(uint32 window_id,
128 mojom::Cursor cursor_id) override {
129 tracker_.OnWindowSetPredefinedCursor(window_id, cursor_id);
130 }
127 void OnChangeCompleted(uint32_t change_id, bool success) override {} 131 void OnChangeCompleted(uint32_t change_id, bool success) override {}
128 void WmSetBounds(uint32_t change_id, 132 void WmSetBounds(uint32_t change_id,
129 Id window_id, 133 Id window_id,
130 mojo::RectPtr bounds) override {} 134 mojo::RectPtr bounds) override {}
131 void WmSetProperty(uint32_t change_id, 135 void WmSetProperty(uint32_t change_id,
132 Id window_id, 136 Id window_id,
133 const mojo::String& name, 137 const mojo::String& name,
134 mojo::Array<uint8_t> transit_data) override {} 138 mojo::Array<uint8_t> transit_data) override {}
135 139
136 TestChangeTracker tracker_; 140 TestChangeTracker tracker_;
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 mus::mojom::WindowTree::ACCESS_POLICY_EMBED_ROOT, 217 mus::mojom::WindowTree::ACCESS_POLICY_EMBED_ROOT,
214 mus::mojom::WindowTreeClientPtr())); 218 mus::mojom::WindowTreeClientPtr()));
215 } 219 }
216 DISALLOW_COPY_AND_ASSIGN(TestWindowTreeHostConnection); 220 DISALLOW_COPY_AND_ASSIGN(TestWindowTreeHostConnection);
217 }; 221 };
218 222
219 // ----------------------------------------------------------------------------- 223 // -----------------------------------------------------------------------------
220 // Empty implementation of DisplayManager. 224 // Empty implementation of DisplayManager.
221 class TestDisplayManager : public DisplayManager { 225 class TestDisplayManager : public DisplayManager {
222 public: 226 public:
223 TestDisplayManager() {} 227 TestDisplayManager(int32_t* cursor_id_storage)
sky 2015/12/02 21:42:35 nit: explicit
228 : cursor_id_storage_(cursor_id_storage) {}
224 ~TestDisplayManager() override {} 229 ~TestDisplayManager() override {}
225 230
226 // DisplayManager: 231 // DisplayManager:
227 void Init(DisplayManagerDelegate* delegate) override { 232 void Init(DisplayManagerDelegate* delegate) override {
228 // It is necessary to tell the delegate about the ViewportMetrics to make 233 // It is necessary to tell the delegate about the ViewportMetrics to make
229 // sure that the WindowTreeHostConnection is correctly initialized (and a 234 // sure that the WindowTreeHostConnection is correctly initialized (and a
230 // root-window is created). 235 // root-window is created).
231 mojom::ViewportMetrics metrics; 236 mojom::ViewportMetrics metrics;
232 metrics.size_in_pixels = mojo::Size::From(gfx::Size(400, 300)); 237 metrics.size_in_pixels = mojo::Size::From(gfx::Size(400, 300));
233 metrics.device_pixel_ratio = 1.f; 238 metrics.device_pixel_ratio = 1.f;
234 delegate->OnViewportMetricsChanged(mojom::ViewportMetrics(), metrics); 239 delegate->OnViewportMetricsChanged(mojom::ViewportMetrics(), metrics);
235 } 240 }
236 void SchedulePaint(const ServerWindow* window, 241 void SchedulePaint(const ServerWindow* window,
237 const gfx::Rect& bounds) override {} 242 const gfx::Rect& bounds) override {}
238 void SetViewportSize(const gfx::Size& size) override {} 243 void SetViewportSize(const gfx::Size& size) override {}
239 void SetTitle(const base::string16& title) override {} 244 void SetTitle(const base::string16& title) override {}
245 void SetCursorById(int32_t cursor) override { *cursor_id_storage_ = cursor; }
240 const mojom::ViewportMetrics& GetViewportMetrics() override { 246 const mojom::ViewportMetrics& GetViewportMetrics() override {
241 return display_metrices_; 247 return display_metrices_;
242 } 248 }
243 void UpdateTextInputState(const ui::TextInputState& state) override {} 249 void UpdateTextInputState(const ui::TextInputState& state) override {}
244 void SetImeVisibility(bool visible) override {} 250 void SetImeVisibility(bool visible) override {}
245 bool IsFramePending() const override { return false; } 251 bool IsFramePending() const override { return false; }
246 252
247 private: 253 private:
248 mojom::ViewportMetrics display_metrices_; 254 mojom::ViewportMetrics display_metrices_;
249 255
256 int32_t* cursor_id_storage_;
257
250 DISALLOW_COPY_AND_ASSIGN(TestDisplayManager); 258 DISALLOW_COPY_AND_ASSIGN(TestDisplayManager);
251 }; 259 };
252 260
253 // Factory that dispenses TestDisplayManagers. 261 // Factory that dispenses TestDisplayManagers.
254 class TestDisplayManagerFactory : public DisplayManagerFactory { 262 class TestDisplayManagerFactory : public DisplayManagerFactory {
255 public: 263 public:
256 TestDisplayManagerFactory() {} 264 TestDisplayManagerFactory(int32_t* cursor_id_storage)
sky 2015/12/02 21:42:35 explicit
265 : cursor_id_storage_(cursor_id_storage) {}
257 ~TestDisplayManagerFactory() {} 266 ~TestDisplayManagerFactory() {}
258 DisplayManager* CreateDisplayManager( 267 DisplayManager* CreateDisplayManager(
259 mojo::ApplicationImpl* app_impl, 268 mojo::ApplicationImpl* app_impl,
260 const scoped_refptr<GpuState>& gpu_state, 269 const scoped_refptr<GpuState>& gpu_state,
261 const scoped_refptr<mus::SurfacesState>& surfaces_state) override { 270 const scoped_refptr<mus::SurfacesState>& surfaces_state) override {
262 return new TestDisplayManager(); 271 return new TestDisplayManager(cursor_id_storage_);
263 } 272 }
264 273
265 private: 274 private:
275 int32_t* cursor_id_storage_;
276
266 DISALLOW_COPY_AND_ASSIGN(TestDisplayManagerFactory); 277 DISALLOW_COPY_AND_ASSIGN(TestDisplayManagerFactory);
267 }; 278 };
268 279
269 EventPtr CreatePointerDownEvent(int x, int y) { 280 EventPtr CreatePointerDownEvent(int x, int y) {
270 EventPtr event(Event::New()); 281 EventPtr event(Event::New());
271 event->action = mus::mojom::EVENT_TYPE_POINTER_DOWN; 282 event->action = mus::mojom::EVENT_TYPE_POINTER_DOWN;
272 event->pointer_data = PointerData::New(); 283 event->pointer_data = PointerData::New();
273 event->pointer_data->pointer_id = 1u; 284 event->pointer_data->pointer_id = 1u;
274 event->pointer_data->location = LocationData::New(); 285 event->pointer_data->location = LocationData::New();
275 event->pointer_data->location->x = x; 286 event->pointer_data->location->x = x;
(...skipping 25 matching lines...) Expand all
301 event->pointer_data->kind = mojom::POINTER_KIND_MOUSE; 312 event->pointer_data->kind = mojom::POINTER_KIND_MOUSE;
302 return event.Pass(); 313 return event.Pass();
303 } 314 }
304 315
305 } // namespace 316 } // namespace
306 317
307 // ----------------------------------------------------------------------------- 318 // -----------------------------------------------------------------------------
308 319
309 class WindowTreeTest : public testing::Test { 320 class WindowTreeTest : public testing::Test {
310 public: 321 public:
311 WindowTreeTest() : wm_client_(nullptr) {} 322 WindowTreeTest()
323 : wm_client_(nullptr),
324 cursor_id_(0),
325 display_manager_factory_(&cursor_id_) {}
312 ~WindowTreeTest() override {} 326 ~WindowTreeTest() override {}
313 327
314 // WindowTreeImpl for the window manager. 328 // WindowTreeImpl for the window manager.
315 WindowTreeImpl* wm_connection() { 329 WindowTreeImpl* wm_connection() {
316 return connection_manager_->GetConnection(1); 330 return connection_manager_->GetConnection(1);
317 } 331 }
318 332
319 TestWindowTreeClient* last_window_tree_client() { 333 TestWindowTreeClient* last_window_tree_client() {
320 return delegate_.last_client(); 334 return delegate_.last_client();
321 } 335 }
322 336
323 TestClientConnection* last_client_connection() { 337 TestClientConnection* last_client_connection() {
324 return delegate_.last_connection(); 338 return delegate_.last_connection();
325 } 339 }
326 340
327 ConnectionManager* connection_manager() { return connection_manager_.get(); } 341 ConnectionManager* connection_manager() { return connection_manager_.get(); }
328 342
329 TestWindowTreeClient* wm_client() { return wm_client_; } 343 TestWindowTreeClient* wm_client() { return wm_client_; }
344 int32_t cursor_id() { return cursor_id_; }
330 345
331 TestWindowTreeHostConnection* host_connection() { return host_connection_; } 346 TestWindowTreeHostConnection* host_connection() { return host_connection_; }
332 347
333 void DispatchEventWithoutAck(mojom::EventPtr event) { 348 void DispatchEventWithoutAck(mojom::EventPtr event) {
334 host_connection()->window_tree_host()->OnEvent(event.Pass()); 349 host_connection()->window_tree_host()->OnEvent(event.Pass());
335 } 350 }
336 351
337 void AckPreviousEvent() { 352 void AckPreviousEvent() {
338 host_connection() 353 host_connection()
339 ->window_tree_host() 354 ->window_tree_host()
340 ->tree_awaiting_input_ack_->OnWindowInputEventAck(0); 355 ->tree_awaiting_input_ack_->OnWindowInputEventAck(0);
341 } 356 }
342 357
343 void DispatchEventAndAckImmediately(mojom::EventPtr event) { 358 void DispatchEventAndAckImmediately(mojom::EventPtr event) {
344 DispatchEventWithoutAck(event.Pass()); 359 DispatchEventWithoutAck(event.Pass());
345 AckPreviousEvent(); 360 AckPreviousEvent();
346 } 361 }
347 362
363 void SetupEventTargeting(TestWindowTreeClient** out_client,
sky 2015/12/02 21:42:35 Add description.
364 ServerWindow** out_window);
365
348 protected: 366 protected:
349 // testing::Test: 367 // testing::Test:
350 void SetUp() override { 368 void SetUp() override {
351 DisplayManager::set_factory_for_testing(&display_manager_factory_); 369 DisplayManager::set_factory_for_testing(&display_manager_factory_);
352 // TODO(fsamuel): This is probably broken. We need a root. 370 // TODO(fsamuel): This is probably broken. We need a root.
353 connection_manager_.reset( 371 connection_manager_.reset(
354 new ConnectionManager(&delegate_, scoped_refptr<SurfacesState>())); 372 new ConnectionManager(&delegate_, scoped_refptr<SurfacesState>()));
355 WindowTreeHostImpl* host = new WindowTreeHostImpl( 373 WindowTreeHostImpl* host = new WindowTreeHostImpl(
356 mus::mojom::WindowTreeHostClientPtr(), connection_manager_.get(), 374 mus::mojom::WindowTreeHostClientPtr(), connection_manager_.get(),
357 nullptr, scoped_refptr<GpuState>(), scoped_refptr<mus::SurfacesState>(), 375 nullptr, scoped_refptr<GpuState>(), scoped_refptr<mus::SurfacesState>(),
358 nullptr); 376 nullptr);
359 // TODO(fsamuel): This is way too magical. We need to find a better way to 377 // TODO(fsamuel): This is way too magical. We need to find a better way to
360 // manage lifetime. 378 // manage lifetime.
361 host_connection_ = new TestWindowTreeHostConnection( 379 host_connection_ = new TestWindowTreeHostConnection(
362 make_scoped_ptr(host), connection_manager_.get()); 380 make_scoped_ptr(host), connection_manager_.get());
363 host->Init(host_connection_); 381 host->Init(host_connection_);
364 wm_client_ = delegate_.last_client(); 382 wm_client_ = delegate_.last_client();
365 } 383 }
366 384
367 private: 385 private:
368 // TestWindowTreeClient that is used for the WM connection. 386 // TestWindowTreeClient that is used for the WM connection.
369 TestWindowTreeClient* wm_client_; 387 TestWindowTreeClient* wm_client_;
388 int32_t cursor_id_;
370 TestDisplayManagerFactory display_manager_factory_; 389 TestDisplayManagerFactory display_manager_factory_;
371 TestConnectionManagerDelegate delegate_; 390 TestConnectionManagerDelegate delegate_;
372 TestWindowTreeHostConnection* host_connection_; 391 TestWindowTreeHostConnection* host_connection_;
373 scoped_ptr<ConnectionManager> connection_manager_; 392 scoped_ptr<ConnectionManager> connection_manager_;
374 base::MessageLoop message_loop_; 393 base::MessageLoop message_loop_;
375 394
376 DISALLOW_COPY_AND_ASSIGN(WindowTreeTest); 395 DISALLOW_COPY_AND_ASSIGN(WindowTreeTest);
377 }; 396 };
378 397
398 void WindowTreeTest::SetupEventTargeting(TestWindowTreeClient** out_client,
sky 2015/12/02 21:42:35 Make sure you wrap calls to this in EXPECT_NO_FATA
399 ServerWindow** out_window) {
400 const WindowId embed_window_id(wm_connection()->id(), 1);
401 EXPECT_TRUE(
402 wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties()));
403 EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true));
404 EXPECT_TRUE(
405 wm_connection()->AddWindow(*(wm_connection()->root()), embed_window_id));
406 host_connection()->window_tree_host()->root_window()->SetBounds(
407 gfx::Rect(0, 0, 100, 100));
408 mojom::WindowTreeClientPtr client;
409 mojo::InterfaceRequest<mojom::WindowTreeClient> client_request =
410 GetProxy(&client);
411 wm_client()->Bind(client_request.Pass());
412 ConnectionSpecificId connection_id = 0;
413 wm_connection()->Embed(embed_window_id, client.Pass(),
414 mojom::WindowTree::ACCESS_POLICY_DEFAULT,
415 &connection_id);
416 WindowTreeImpl* connection1 =
417 connection_manager()->GetConnectionWithRoot(embed_window_id);
418 ASSERT_TRUE(connection1 != nullptr);
419 ASSERT_NE(connection1, wm_connection());
420
421 connection_manager()
422 ->GetWindow(embed_window_id)
423 ->SetBounds(gfx::Rect(0, 0, 50, 50));
424
425 const WindowId child1(connection1->id(), 1);
426 EXPECT_TRUE(connection1->NewWindow(child1, ServerWindow::Properties()));
427 EXPECT_TRUE(connection1->AddWindow(embed_window_id, child1));
428 connection1->GetHost()->AddActivationParent(
429 WindowIdToTransportId(embed_window_id));
430
431 ServerWindow* v1 = connection1->GetWindow(child1);
432 v1->SetVisible(true);
433 v1->SetBounds(gfx::Rect(20, 20, 20, 20));
434 EnableHitTest(v1);
435
436 TestWindowTreeClient* embed_connection = last_window_tree_client();
437 embed_connection->tracker()->changes()->clear();
438 wm_client()->tracker()->changes()->clear();
439
440 *out_client = embed_connection;
441 *out_window = v1;
442 }
443
379 // Verifies focus correctly changes on pointer events. 444 // Verifies focus correctly changes on pointer events.
380 TEST_F(WindowTreeTest, FocusOnPointer) { 445 TEST_F(WindowTreeTest, FocusOnPointer) {
381 const WindowId embed_window_id(wm_connection()->id(), 1); 446 const WindowId embed_window_id(wm_connection()->id(), 1);
382 EXPECT_TRUE( 447 EXPECT_TRUE(
383 wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties())); 448 wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties()));
384 EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true)); 449 EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true));
385 EXPECT_TRUE( 450 EXPECT_TRUE(
386 wm_connection()->AddWindow(*(wm_connection()->root()), embed_window_id)); 451 wm_connection()->AddWindow(*(wm_connection()->root()), embed_window_id));
387 host_connection()->window_tree_host()->root_window()->SetBounds( 452 host_connection()->window_tree_host()->root_window()->SetBounds(
388 gfx::Rect(0, 0, 100, 100)); 453 gfx::Rect(0, 0, 100, 100));
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
457 DispatchEventAndAckImmediately(CreatePointerDownEvent(61, 22)); 522 DispatchEventAndAckImmediately(CreatePointerDownEvent(61, 22));
458 EXPECT_EQ(v1, host_connection()->window_tree_host()->GetFocusedWindow()); 523 EXPECT_EQ(v1, host_connection()->window_tree_host()->GetFocusedWindow());
459 ASSERT_EQ(wm_client()->tracker()->changes()->size(), 1u) 524 ASSERT_EQ(wm_client()->tracker()->changes()->size(), 1u)
460 << SingleChangeToDescription(*wm_client()->tracker()->changes()); 525 << SingleChangeToDescription(*wm_client()->tracker()->changes());
461 EXPECT_EQ("InputEvent window=0,2 event_action=4", 526 EXPECT_EQ("InputEvent window=0,2 event_action=4",
462 ChangesToDescription1(*wm_client()->tracker()->changes())[0]); 527 ChangesToDescription1(*wm_client()->tracker()->changes())[0]);
463 EXPECT_TRUE(connection1_client->tracker()->changes()->empty()); 528 EXPECT_TRUE(connection1_client->tracker()->changes()->empty());
464 } 529 }
465 530
466 TEST_F(WindowTreeTest, BasicInputEventTarget) { 531 TEST_F(WindowTreeTest, BasicInputEventTarget) {
467 const WindowId embed_window_id(wm_connection()->id(), 1); 532 TestWindowTreeClient* embed_connection;
468 EXPECT_TRUE( 533 ServerWindow* out_window = nullptr;
469 wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties())); 534 SetupEventTargeting(&embed_connection, &out_window);
470 EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true));
471 EXPECT_TRUE(
472 wm_connection()->AddWindow(*(wm_connection()->root()), embed_window_id));
473 host_connection()->window_tree_host()->root_window()->SetBounds(
474 gfx::Rect(0, 0, 100, 100));
475 mojom::WindowTreeClientPtr client;
476 mojo::InterfaceRequest<mojom::WindowTreeClient> client_request =
477 GetProxy(&client);
478 wm_client()->Bind(client_request.Pass());
479 ConnectionSpecificId connection_id = 0;
480 wm_connection()->Embed(embed_window_id,
481 client.Pass(),
482 mojom::WindowTree::ACCESS_POLICY_DEFAULT,
483 &connection_id);
484 WindowTreeImpl* connection1 =
485 connection_manager()->GetConnectionWithRoot(embed_window_id);
486 ASSERT_TRUE(connection1 != nullptr);
487 ASSERT_NE(connection1, wm_connection());
488
489 connection_manager()
490 ->GetWindow(embed_window_id)
491 ->SetBounds(gfx::Rect(0, 0, 50, 50));
492
493 const WindowId child1(connection1->id(), 1);
494 EXPECT_TRUE(connection1->NewWindow(child1, ServerWindow::Properties()));
495 EXPECT_TRUE(connection1->AddWindow(embed_window_id, child1));
496 connection1->GetHost()->AddActivationParent(
497 WindowIdToTransportId(embed_window_id));
498
499 ServerWindow* v1 = connection1->GetWindow(child1);
500 v1->SetVisible(true);
501 v1->SetBounds(gfx::Rect(20, 20, 20, 20));
502 EnableHitTest(v1);
503
504 TestWindowTreeClient* embed_connection = last_window_tree_client();
505 embed_connection->tracker()->changes()->clear();
506 wm_client()->tracker()->changes()->clear();
507 535
508 // Send an event to |v1|. |embed_connection| should get the event, not 536 // Send an event to |v1|. |embed_connection| should get the event, not
509 // |wm_client|, since |v1| lives inside an embedded window. 537 // |wm_client|, since |v1| lives inside an embedded window.
510 DispatchEventAndAckImmediately(CreatePointerDownEvent(21, 22)); 538 DispatchEventAndAckImmediately(CreatePointerDownEvent(21, 22));
511 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size()); 539 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size());
512 EXPECT_EQ("Focused id=2,1", 540 EXPECT_EQ("Focused id=2,1",
513 ChangesToDescription1(*wm_client()->tracker()->changes())[0]); 541 ChangesToDescription1(*wm_client()->tracker()->changes())[0]);
514 ASSERT_EQ(2u, embed_connection->tracker()->changes()->size()); 542 ASSERT_EQ(2u, embed_connection->tracker()->changes()->size());
515 EXPECT_EQ("Focused id=2,1", 543 EXPECT_EQ("Focused id=2,1",
516 ChangesToDescription1(*embed_connection->tracker()->changes())[0]); 544 ChangesToDescription1(*embed_connection->tracker()->changes())[0]);
517 EXPECT_EQ("InputEvent window=2,1 event_action=4", 545 EXPECT_EQ("InputEvent window=2,1 event_action=4",
518 ChangesToDescription1(*embed_connection->tracker()->changes())[1]); 546 ChangesToDescription1(*embed_connection->tracker()->changes())[1]);
519 } 547 }
520 548
549 TEST_F(WindowTreeTest, CursorChangesWhenMouseOverWindowAndWindowSetsCursor) {
550 TestWindowTreeClient* embed_connection = nullptr;
551 ServerWindow* out_window = nullptr;
552 SetupEventTargeting(&embed_connection, &out_window);
553
554 // Like in BasicInputEventTarget, we send a pointer down event to be
555 // dispatched. This is only to place the mouse cursor over that window though.
556 DispatchEventAndAckImmediately(CreateMouseMoveEvent(21, 22));
557
558 out_window->SetPredefinedCursor(mojom::Cursor::CURSOR_IBEAM);
559
560 // Because the cursor is over the window when SetCursor was called, we should
561 // have immediately changed the cursor.
562 EXPECT_EQ(mojom::Cursor::CURSOR_IBEAM, cursor_id());
563 }
564
565 TEST_F(WindowTreeTest, CursorChangesWhenEnteringWindowWithDifferentCursor) {
566 TestWindowTreeClient* embed_connection = nullptr;
567 ServerWindow* out_window = nullptr;
568 SetupEventTargeting(&embed_connection, &out_window);
569
570 // Let's create a pointer event outside the window and then move the pointer
571 // inside.
572 DispatchEventAndAckImmediately(CreateMouseMoveEvent(5, 5));
573 out_window->SetPredefinedCursor(mojom::Cursor::CURSOR_IBEAM);
574 EXPECT_EQ(mojom::Cursor::CURSOR_NULL, cursor_id());
575
576 DispatchEventAndAckImmediately(CreateMouseMoveEvent(21, 22));
577 EXPECT_EQ(mojom::Cursor::CURSOR_IBEAM, cursor_id());
578 }
579
580 TEST_F(WindowTreeTest, TouchesDontChangeCursor) {
581 TestWindowTreeClient* embed_connection = nullptr;
582 ServerWindow* out_window = nullptr;
583 SetupEventTargeting(&embed_connection, &out_window);
584
585 // Let's create a pointer event outside the window and then move the pointer
586 // inside.
587 DispatchEventAndAckImmediately(CreateMouseMoveEvent(5, 5));
588 out_window->SetPredefinedCursor(mojom::Cursor::CURSOR_IBEAM);
589 EXPECT_EQ(mojom::Cursor::CURSOR_NULL, cursor_id());
590
591 // With a touch event, we shouldn't update the cursor.
592 DispatchEventAndAckImmediately(CreatePointerDownEvent(21, 22));
593 EXPECT_EQ(mojom::Cursor::CURSOR_NULL, cursor_id());
594 }
595
521 TEST_F(WindowTreeTest, EventAck) { 596 TEST_F(WindowTreeTest, EventAck) {
522 const WindowId embed_window_id(wm_connection()->id(), 1); 597 const WindowId embed_window_id(wm_connection()->id(), 1);
523 EXPECT_TRUE( 598 EXPECT_TRUE(
524 wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties())); 599 wm_connection()->NewWindow(embed_window_id, ServerWindow::Properties()));
525 EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true)); 600 EXPECT_TRUE(wm_connection()->SetWindowVisibility(embed_window_id, true));
526 EXPECT_TRUE( 601 EXPECT_TRUE(
527 wm_connection()->AddWindow(*(wm_connection()->root()), embed_window_id)); 602 wm_connection()->AddWindow(*(wm_connection()->root()), embed_window_id));
528 host_connection()->window_tree_host()->root_window()->SetBounds( 603 host_connection()->window_tree_host()->root_window()->SetBounds(
529 gfx::Rect(0, 0, 100, 100)); 604 gfx::Rect(0, 0, 100, 100));
530 605
(...skipping 11 matching lines...) Expand all
542 // Ack the first event. That should trigger the dispatch of the second event. 617 // Ack the first event. That should trigger the dispatch of the second event.
543 AckPreviousEvent(); 618 AckPreviousEvent();
544 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size()); 619 ASSERT_EQ(1u, wm_client()->tracker()->changes()->size());
545 EXPECT_EQ("InputEvent window=0,2 event_action=5", 620 EXPECT_EQ("InputEvent window=0,2 event_action=5",
546 ChangesToDescription1(*wm_client()->tracker()->changes())[0]); 621 ChangesToDescription1(*wm_client()->tracker()->changes())[0]);
547 } 622 }
548 623
549 } // namespace ws 624 } // namespace ws
550 625
551 } // namespace mus 626 } // namespace mus
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698