OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/mus/compositor_mus_connection.h" | 5 #include "content/renderer/mus/compositor_mus_connection.h" |
6 | 6 |
7 #include "base/macros.h" | 7 #include "base/macros.h" |
8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/test/test_simple_task_runner.h" | 10 #include "base/test/test_simple_task_runner.h" |
11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
12 #include "components/mus/public/cpp/tests/test_window.h" | 12 #include "components/mus/public/cpp/tests/test_window.h" |
13 #include "components/mus/public/interfaces/input_event_constants.mojom.h" | 13 #include "components/mus/public/interfaces/input_event_constants.mojom.h" |
14 #include "components/mus/public/interfaces/input_events.mojom.h" | 14 #include "components/mus/public/interfaces/input_events.mojom.h" |
15 #include "components/mus/public/interfaces/input_key_codes.mojom.h" | 15 #include "components/mus/public/interfaces/input_key_codes.mojom.h" |
16 #include "content/common/input/did_overscroll_params.h" | 16 #include "content/common/input/did_overscroll_params.h" |
17 #include "content/common/input/input_event_ack.h" | 17 #include "content/common/input/input_event_ack.h" |
18 #include "content/common/input/input_event_ack_state.h" | 18 #include "content/common/input/input_event_ack_state.h" |
19 #include "content/public/test/mock_render_thread.h" | 19 #include "content/public/test/mock_render_thread.h" |
20 #include "content/renderer/input/input_handler_manager.h" | 20 #include "content/renderer/input/input_handler_manager.h" |
21 #include "content/renderer/input/input_handler_manager_client.h" | 21 #include "content/renderer/input/input_handler_manager_client.h" |
22 #include "content/renderer/input/render_widget_input_handler.h" | 22 #include "content/renderer/input/render_widget_input_handler.h" |
23 #include "content/renderer/mus/render_widget_mus_connection.h" | 23 #include "content/renderer/mus/render_widget_mus_connection.h" |
24 #include "content/renderer/render_widget.h" | 24 #include "content/renderer/render_widget.h" |
25 #include "content/test/fake_compositor_dependencies.h" | 25 #include "content/test/fake_compositor_dependencies.h" |
26 #include "content/test/fake_renderer_scheduler.h" | 26 #include "content/test/fake_renderer_scheduler.h" |
27 #include "mojo/public/cpp/bindings/interface_request.h" | 27 #include "mojo/public/cpp/bindings/interface_request.h" |
28 #include "testing/gtest/include/gtest/gtest.h" | 28 #include "testing/gtest/include/gtest/gtest.h" |
| 29 #include "ui/events/event_utils.h" |
29 | 30 |
30 namespace { | 31 namespace { |
31 | 32 |
32 // Wrapper for the callback provided to | 33 // Wrapper for the callback provided to |
33 // CompositorMusConnection:OnWindowInputEvent. This tracks whether the it was | 34 // CompositorMusConnection:OnWindowInputEvent. This tracks whether the it was |
34 // called, along with the result. | 35 // called, along with the result. |
35 class TestCallback : public base::RefCounted<TestCallback> { | 36 class TestCallback : public base::RefCounted<TestCallback> { |
36 public: | 37 public: |
37 TestCallback() : called_(false), result_(false) {} | 38 TestCallback() : called_(false), result_(false) {} |
38 | 39 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 namespace content { | 201 namespace content { |
201 | 202 |
202 // Test suite for CompositorMusConnection, this does not setup a full renderer | 203 // Test suite for CompositorMusConnection, this does not setup a full renderer |
203 // environment. This does not establish a connection to a mus server, nor does | 204 // environment. This does not establish a connection to a mus server, nor does |
204 // it initialize one. | 205 // it initialize one. |
205 class CompositorMusConnectionTest : public testing::Test { | 206 class CompositorMusConnectionTest : public testing::Test { |
206 public: | 207 public: |
207 CompositorMusConnectionTest() {} | 208 CompositorMusConnectionTest() {} |
208 ~CompositorMusConnectionTest() override {} | 209 ~CompositorMusConnectionTest() override {} |
209 | 210 |
210 // Initializes |event| with valid parameters for a key event, so that it can | 211 // Returns a valid key event, so that it can be converted to a web event by |
211 // be converted to a web event by CompositorMusConnection. | 212 // CompositorMusConnection. |
212 void GenerateKeyEvent(mus::mojom::EventPtr& event); | 213 scoped_ptr<ui::Event> GenerateKeyEvent(); |
213 | 214 |
214 // Calls CompositorMusConnection::OnWindowInputEvent. | 215 // Calls CompositorMusConnection::OnWindowInputEvent. |
215 void OnWindowInputEvent(mus::Window* window, | 216 void OnWindowInputEvent(mus::Window* window, |
216 mus::mojom::EventPtr event, | 217 ui::Event* event, |
217 scoped_ptr<base::Callback<void(bool)>>* ack_callback); | 218 scoped_ptr<base::Callback<void(bool)>>* ack_callback); |
218 | 219 |
219 // Confirms the state of pending tasks enqueued on each task runner, and runs | 220 // Confirms the state of pending tasks enqueued on each task runner, and runs |
220 // until idle. | 221 // until idle. |
221 void VerifyAndRunQueues(bool main_task_runner_enqueued, | 222 void VerifyAndRunQueues(bool main_task_runner_enqueued, |
222 bool compositor_task_runner_enqueued); | 223 bool compositor_task_runner_enqueued); |
223 | 224 |
224 CompositorMusConnection* compositor_connection() { | 225 CompositorMusConnection* compositor_connection() { |
225 return compositor_connection_.get(); | 226 return compositor_connection_.get(); |
226 } | 227 } |
(...skipping 29 matching lines...) Expand all Loading... |
256 // Actual CompositorMusConnection for testing. | 257 // Actual CompositorMusConnection for testing. |
257 scoped_refptr<CompositorMusConnection> compositor_connection_; | 258 scoped_refptr<CompositorMusConnection> compositor_connection_; |
258 | 259 |
259 // Test implementations, to control input given to |compositor_connection_|. | 260 // Test implementations, to control input given to |compositor_connection_|. |
260 scoped_ptr<TestInputHandlerManager> input_handler_manager_; | 261 scoped_ptr<TestInputHandlerManager> input_handler_manager_; |
261 scoped_ptr<TestRenderWidgetInputHandler> render_widget_input_handler_; | 262 scoped_ptr<TestRenderWidgetInputHandler> render_widget_input_handler_; |
262 | 263 |
263 DISALLOW_COPY_AND_ASSIGN(CompositorMusConnectionTest); | 264 DISALLOW_COPY_AND_ASSIGN(CompositorMusConnectionTest); |
264 }; | 265 }; |
265 | 266 |
266 void CompositorMusConnectionTest::GenerateKeyEvent( | 267 scoped_ptr<ui::Event> CompositorMusConnectionTest::GenerateKeyEvent() { |
267 mus::mojom::EventPtr& event) { | 268 return scoped_ptr<ui::Event>(new ui::KeyEvent( |
268 event->action = mus::mojom::EventType::KEY_PRESSED; | 269 ui::ET_KEY_PRESSED, ui::KeyboardCode::VKEY_A, ui::EF_NONE)); |
269 event->time_stamp = base::TimeTicks::Now().ToInternalValue(); | |
270 event->key_data = mus::mojom::KeyData::New(); | |
271 event->key_data->is_char = true; | |
272 event->key_data->windows_key_code = mus::mojom::KeyboardCode::A; | |
273 } | 270 } |
274 | 271 |
275 void CompositorMusConnectionTest::OnWindowInputEvent( | 272 void CompositorMusConnectionTest::OnWindowInputEvent( |
276 mus::Window* window, | 273 mus::Window* window, |
277 mus::mojom::EventPtr event, | 274 ui::Event* event, |
278 scoped_ptr<base::Callback<void(bool)>>* ack_callback) { | 275 scoped_ptr<base::Callback<void(bool)>>* ack_callback) { |
279 compositor_connection_->OnWindowInputEvent(window, std::move(event), | 276 compositor_connection_->OnWindowInputEvent(window, event, ack_callback); |
280 ack_callback); | |
281 } | 277 } |
282 | 278 |
283 void CompositorMusConnectionTest::VerifyAndRunQueues( | 279 void CompositorMusConnectionTest::VerifyAndRunQueues( |
284 bool main_task_runner_enqueued, | 280 bool main_task_runner_enqueued, |
285 bool compositor_task_runner_enqueued) { | 281 bool compositor_task_runner_enqueued) { |
286 // Run through the enqueued actions. | 282 // Run through the enqueued actions. |
287 EXPECT_EQ(main_task_runner_enqueued, main_task_runner_->HasPendingTask()); | 283 EXPECT_EQ(main_task_runner_enqueued, main_task_runner_->HasPendingTask()); |
288 main_task_runner_->RunUntilIdle(); | 284 main_task_runner_->RunUntilIdle(); |
289 | 285 |
290 EXPECT_EQ(compositor_task_runner_enqueued, | 286 EXPECT_EQ(compositor_task_runner_enqueued, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 // Tests that for events which the renderer will ack, yet not consume, that | 323 // Tests that for events which the renderer will ack, yet not consume, that |
328 // CompositorMusConnection consumes the ack during OnWindowInputEvent, and calls | 324 // CompositorMusConnection consumes the ack during OnWindowInputEvent, and calls |
329 // it with the correct state once processed. | 325 // it with the correct state once processed. |
330 TEST_F(CompositorMusConnectionTest, NotConsumed) { | 326 TEST_F(CompositorMusConnectionTest, NotConsumed) { |
331 TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); | 327 TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); |
332 input_handler->set_delegate(connection()); | 328 input_handler->set_delegate(connection()); |
333 input_handler->set_state( | 329 input_handler->set_state( |
334 InputEventAckState::INPUT_EVENT_ACK_STATE_NOT_CONSUMED); | 330 InputEventAckState::INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
335 | 331 |
336 mus::TestWindow test_window; | 332 mus::TestWindow test_window; |
337 mus::mojom::EventPtr event = mus::mojom::Event::New(); | 333 scoped_ptr<ui::Event> event(GenerateKeyEvent()); |
338 GenerateKeyEvent(event); | |
339 scoped_refptr<TestCallback> test_callback(new TestCallback); | 334 scoped_refptr<TestCallback> test_callback(new TestCallback); |
340 scoped_ptr<base::Callback<void(bool)>> ack_callback( | 335 scoped_ptr<base::Callback<void(bool)>> ack_callback( |
341 new base::Callback<void(bool)>( | 336 new base::Callback<void(bool)>( |
342 base::Bind(&::TestCallback::BoolCallback, test_callback))); | 337 base::Bind(&::TestCallback::BoolCallback, test_callback))); |
343 | 338 |
344 OnWindowInputEvent(&test_window, std::move(event), &ack_callback); | 339 OnWindowInputEvent(&test_window, event.get(), &ack_callback); |
345 // OnWindowInputEvent is expected to clear the callback if it plans on | 340 // OnWindowInputEvent is expected to clear the callback if it plans on |
346 // handling the ack. | 341 // handling the ack. |
347 EXPECT_FALSE(ack_callback.get()); | 342 EXPECT_FALSE(ack_callback.get()); |
348 | 343 |
349 VerifyAndRunQueues(true, true); | 344 VerifyAndRunQueues(true, true); |
350 | 345 |
351 // The ack callback should have been called | 346 // The ack callback should have been called |
352 EXPECT_TRUE(test_callback->called()); | 347 EXPECT_TRUE(test_callback->called()); |
353 EXPECT_FALSE(test_callback->result()); | 348 EXPECT_FALSE(test_callback->result()); |
354 } | 349 } |
355 | 350 |
356 // Tests that for events which the renderer will ack, and consume, that | 351 // Tests that for events which the renderer will ack, and consume, that |
357 // CompositorMusConnection consumes the ack during OnWindowInputEvent, and calls | 352 // CompositorMusConnection consumes the ack during OnWindowInputEvent, and calls |
358 // it with the correct state once processed. | 353 // it with the correct state once processed. |
359 TEST_F(CompositorMusConnectionTest, Consumed) { | 354 TEST_F(CompositorMusConnectionTest, Consumed) { |
360 TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); | 355 TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); |
361 input_handler->set_delegate(connection()); | 356 input_handler->set_delegate(connection()); |
362 input_handler->set_state(InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); | 357 input_handler->set_state(InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); |
363 | 358 |
364 mus::TestWindow test_window; | 359 mus::TestWindow test_window; |
365 mus::mojom::EventPtr event = mus::mojom::Event::New(); | 360 scoped_ptr<ui::Event> event(GenerateKeyEvent()); |
366 GenerateKeyEvent(event); | |
367 scoped_refptr<TestCallback> test_callback(new TestCallback); | 361 scoped_refptr<TestCallback> test_callback(new TestCallback); |
368 scoped_ptr<base::Callback<void(bool)>> ack_callback( | 362 scoped_ptr<base::Callback<void(bool)>> ack_callback( |
369 new base::Callback<void(bool)>( | 363 new base::Callback<void(bool)>( |
370 base::Bind(&::TestCallback::BoolCallback, test_callback))); | 364 base::Bind(&::TestCallback::BoolCallback, test_callback))); |
371 | 365 |
372 OnWindowInputEvent(&test_window, std::move(event), &ack_callback); | 366 OnWindowInputEvent(&test_window, event.get(), &ack_callback); |
373 // OnWindowInputEvent is expected to clear the callback if it plans on | 367 // OnWindowInputEvent is expected to clear the callback if it plans on |
374 // handling the ack. | 368 // handling the ack. |
375 EXPECT_FALSE(ack_callback.get()); | 369 EXPECT_FALSE(ack_callback.get()); |
376 | 370 |
377 VerifyAndRunQueues(true, true); | 371 VerifyAndRunQueues(true, true); |
378 | 372 |
379 // The ack callback should have been called | 373 // The ack callback should have been called |
380 EXPECT_TRUE(test_callback->called()); | 374 EXPECT_TRUE(test_callback->called()); |
381 EXPECT_TRUE(test_callback->result()); | 375 EXPECT_TRUE(test_callback->result()); |
382 } | 376 } |
383 | 377 |
384 // Tests that when the RenderWidgetInputHandler does not ack before a new event | 378 // Tests that when the RenderWidgetInputHandler does not ack before a new event |
385 // arrives, that only the most recent ack is fired. | 379 // arrives, that only the most recent ack is fired. |
386 TEST_F(CompositorMusConnectionTest, LostAck) { | 380 TEST_F(CompositorMusConnectionTest, LostAck) { |
387 mus::TestWindow test_window; | 381 mus::TestWindow test_window; |
388 mus::mojom::EventPtr event1 = mus::mojom::Event::New(); | 382 scoped_ptr<ui::Event> event1(GenerateKeyEvent()); |
389 GenerateKeyEvent(event1); | |
390 scoped_refptr<TestCallback> test_callback1(new TestCallback); | 383 scoped_refptr<TestCallback> test_callback1(new TestCallback); |
391 scoped_ptr<base::Callback<void(bool)>> ack_callback1( | 384 scoped_ptr<base::Callback<void(bool)>> ack_callback1( |
392 new base::Callback<void(bool)>( | 385 new base::Callback<void(bool)>( |
393 base::Bind(&::TestCallback::BoolCallback, test_callback1))); | 386 base::Bind(&::TestCallback::BoolCallback, test_callback1))); |
394 | 387 |
395 OnWindowInputEvent(&test_window, std::move(event1), &ack_callback1); | 388 OnWindowInputEvent(&test_window, event1.get(), &ack_callback1); |
396 EXPECT_FALSE(ack_callback1.get()); | 389 EXPECT_FALSE(ack_callback1.get()); |
397 // When simulating the timeout the ack is never enqueued | 390 // When simulating the timeout the ack is never enqueued |
398 VerifyAndRunQueues(true, false); | 391 VerifyAndRunQueues(true, false); |
399 | 392 |
400 // Setting a delegate will lead to the next event being acked. Having a | 393 // Setting a delegate will lead to the next event being acked. Having a |
401 // cleared queue simulates the input handler timing out on an event. | 394 // cleared queue simulates the input handler timing out on an event. |
402 TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); | 395 TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); |
403 input_handler->set_delegate(connection()); | 396 input_handler->set_delegate(connection()); |
404 input_handler->set_state(InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); | 397 input_handler->set_state(InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); |
405 | 398 |
406 mus::mojom::EventPtr event2 = mus::mojom::Event::New(); | 399 scoped_ptr<ui::Event> event2(GenerateKeyEvent()); |
407 GenerateKeyEvent(event2); | |
408 scoped_refptr<TestCallback> test_callback2(new TestCallback); | 400 scoped_refptr<TestCallback> test_callback2(new TestCallback); |
409 scoped_ptr<base::Callback<void(bool)>> ack_callback2( | 401 scoped_ptr<base::Callback<void(bool)>> ack_callback2( |
410 new base::Callback<void(bool)>( | 402 new base::Callback<void(bool)>( |
411 base::Bind(&::TestCallback::BoolCallback, test_callback2))); | 403 base::Bind(&::TestCallback::BoolCallback, test_callback2))); |
412 OnWindowInputEvent(&test_window, std::move(event2), &ack_callback2); | 404 OnWindowInputEvent(&test_window, event2.get(), &ack_callback2); |
413 EXPECT_FALSE(ack_callback2.get()); | 405 EXPECT_FALSE(ack_callback2.get()); |
414 | 406 |
415 VerifyAndRunQueues(true, true); | 407 VerifyAndRunQueues(true, true); |
416 | 408 |
417 // Only the most recent ack was called. | 409 // Only the most recent ack was called. |
418 EXPECT_FALSE(test_callback1->called()); | 410 EXPECT_FALSE(test_callback1->called()); |
419 EXPECT_TRUE(test_callback2->called()); | 411 EXPECT_TRUE(test_callback2->called()); |
420 EXPECT_TRUE(test_callback2->result()); | 412 EXPECT_TRUE(test_callback2->result()); |
421 } | 413 } |
422 | 414 |
423 // Tests that when an input handler consumes the event, that | 415 // Tests that when an input handler consumes the event, that |
424 // CompositorMusConnection does not consume the ack, nor calls it. | 416 // CompositorMusConnection does not consume the ack, nor calls it. |
425 TEST_F(CompositorMusConnectionTest, InputHandlerConsumes) { | 417 TEST_F(CompositorMusConnectionTest, InputHandlerConsumes) { |
426 input_handler_manager()->SetHandleInputEventResult( | 418 input_handler_manager()->SetHandleInputEventResult( |
427 InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); | 419 InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); |
428 mus::TestWindow test_window; | 420 mus::TestWindow test_window; |
429 mus::mojom::EventPtr event = mus::mojom::Event::New(); | 421 scoped_ptr<ui::Event> event(GenerateKeyEvent()); |
430 GenerateKeyEvent(event); | |
431 scoped_refptr<TestCallback> test_callback(new TestCallback); | 422 scoped_refptr<TestCallback> test_callback(new TestCallback); |
432 scoped_ptr<base::Callback<void(bool)>> ack_callback( | 423 scoped_ptr<base::Callback<void(bool)>> ack_callback( |
433 new base::Callback<void(bool)>( | 424 new base::Callback<void(bool)>( |
434 base::Bind(&::TestCallback::BoolCallback, test_callback))); | 425 base::Bind(&::TestCallback::BoolCallback, test_callback))); |
435 | 426 |
436 OnWindowInputEvent(&test_window, std::move(event), &ack_callback); | 427 OnWindowInputEvent(&test_window, event.get(), &ack_callback); |
437 | 428 |
438 EXPECT_TRUE(ack_callback.get()); | 429 EXPECT_TRUE(ack_callback.get()); |
439 VerifyAndRunQueues(false, false); | 430 VerifyAndRunQueues(false, false); |
440 EXPECT_FALSE(test_callback->called()); | 431 EXPECT_FALSE(test_callback->called()); |
441 } | 432 } |
442 | 433 |
443 // Tests that when the renderer will not ack an event, that | 434 // Tests that when the renderer will not ack an event, that |
444 // CompositorMusConnection does not consume the ack, nor calls it. | 435 // CompositorMusConnection does not consume the ack, nor calls it. |
445 TEST_F(CompositorMusConnectionTest, RendererWillNotSendAck) { | 436 TEST_F(CompositorMusConnectionTest, RendererWillNotSendAck) { |
446 mus::TestWindow test_window; | 437 mus::TestWindow test_window; |
447 mus::mojom::EventPtr event = mus::mojom::Event::New(); | 438 ui::PointerEvent event(ui::ET_POINTER_DOWN, |
448 event->action = mus::mojom::EventType::POINTER_DOWN; | 439 ui::EventPointerType::POINTER_TYPE_MOUSE, gfx::Point(), |
449 event->time_stamp = base::TimeTicks::Now().ToInternalValue(); | 440 gfx::Point(), ui::EF_NONE, 0, ui::EventTimeForNow()); |
450 event->pointer_data = mus::mojom::PointerData::New(); | |
451 | 441 |
452 scoped_refptr<TestCallback> test_callback(new TestCallback); | 442 scoped_refptr<TestCallback> test_callback(new TestCallback); |
453 scoped_ptr<base::Callback<void(bool)>> ack_callback( | 443 scoped_ptr<base::Callback<void(bool)>> ack_callback( |
454 new base::Callback<void(bool)>( | 444 new base::Callback<void(bool)>( |
455 base::Bind(&::TestCallback::BoolCallback, test_callback))); | 445 base::Bind(&::TestCallback::BoolCallback, test_callback))); |
456 | 446 |
457 OnWindowInputEvent(&test_window, std::move(event), &ack_callback); | 447 OnWindowInputEvent(&test_window, &event, &ack_callback); |
458 EXPECT_TRUE(ack_callback.get()); | 448 EXPECT_TRUE(ack_callback.get()); |
459 | 449 |
460 VerifyAndRunQueues(true, false); | 450 VerifyAndRunQueues(true, false); |
461 EXPECT_FALSE(test_callback->called()); | 451 EXPECT_FALSE(test_callback->called()); |
462 } | 452 } |
463 | 453 |
464 } // namespace content | 454 } // namespace content |
OLD | NEW |