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

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

Powered by Google App Engine
This is Rietveld 408576698