Index: content/renderer/mus/compositor_mus_connection_unittest.cc |
diff --git a/content/renderer/mus/compositor_mus_connection_unittest.cc b/content/renderer/mus/compositor_mus_connection_unittest.cc |
deleted file mode 100644 |
index d4d93b313af8c3530c897c88a9d7624a006311a8..0000000000000000000000000000000000000000 |
--- a/content/renderer/mus/compositor_mus_connection_unittest.cc |
+++ /dev/null |
@@ -1,502 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/renderer/mus/compositor_mus_connection.h" |
- |
-#include <memory> |
- |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/test/test_simple_task_runner.h" |
-#include "base/time/time.h" |
-#include "content/common/input/input_event_ack.h" |
-#include "content/common/input/input_event_ack_state.h" |
-#include "content/public/test/mock_render_thread.h" |
-#include "content/renderer/input/input_handler_manager.h" |
-#include "content/renderer/input/input_handler_manager_client.h" |
-#include "content/renderer/input/render_widget_input_handler.h" |
-#include "content/renderer/mus/render_widget_mus_connection.h" |
-#include "content/renderer/render_widget.h" |
-#include "content/test/fake_compositor_dependencies.h" |
-#include "mojo/public/cpp/bindings/interface_request.h" |
-#include "services/ui/public/cpp/tests/test_window.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/WebKit/public/platform/scheduler/test/fake_renderer_scheduler.h" |
-#include "ui/events/blink/did_overscroll_params.h" |
-#include "ui/events/event_utils.h" |
-#include "ui/events/mojo/event.mojom.h" |
-#include "ui/events/mojo/event_constants.mojom.h" |
-#include "ui/events/mojo/keyboard_codes.mojom.h" |
- |
-using ui::mojom::EventResult; |
- |
-namespace content { |
- |
-namespace { |
- |
-// Wrapper for the callback provided to |
-// CompositorMusConnection:OnWindowInputEvent. This tracks whether the it was |
-// called, along with the result. |
-class TestCallback : public base::RefCounted<TestCallback> { |
- public: |
- TestCallback() : called_(false), result_(EventResult::UNHANDLED) {} |
- |
- bool called() { return called_; } |
- EventResult result() { return result_; } |
- |
- void ResultCallback(EventResult result) { |
- called_ = true; |
- result_ = result; |
- } |
- |
- private: |
- friend class base::RefCounted<TestCallback>; |
- |
- ~TestCallback() {} |
- |
- bool called_; |
- EventResult result_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestCallback); |
-}; |
- |
-// Allows for overriding the behaviour of HandleInputEvent, to simulate input |
-// handlers which consume events before they are sent to the renderer. |
-class TestInputHandlerManager : public InputHandlerManager { |
- public: |
- TestInputHandlerManager( |
- const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
- InputHandlerManagerClient* client, |
- blink::scheduler::RendererScheduler* renderer_scheduler) |
- : InputHandlerManager(task_runner, client, nullptr, renderer_scheduler), |
- override_result_(false), |
- result_(InputEventAckState::INPUT_EVENT_ACK_STATE_UNKNOWN) {} |
- ~TestInputHandlerManager() override {} |
- |
- // Stops overriding the behaviour of HandleInputEvent |
- void ClearHandleInputEventOverride(); |
- |
- // Overrides the behaviour of HandleInputEvent, returing |result|. |
- void SetHandleInputEventResult(InputEventAckState result); |
- |
- // InputHandlerManager: |
- void HandleInputEvent(int routing_id, |
- blink::WebScopedInputEvent input_event, |
- const ui::LatencyInfo& latency_info, |
- const InputEventAckStateCallback& callback) override; |
- |
- private: |
- // If true InputHandlerManager::HandleInputEvent is not called. |
- bool override_result_; |
- |
- // The result to return in HandleInputEvent if |override_result_|. |
- InputEventAckState result_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestInputHandlerManager); |
-}; |
- |
-void TestInputHandlerManager::ClearHandleInputEventOverride() { |
- override_result_ = false; |
-} |
- |
-void TestInputHandlerManager::SetHandleInputEventResult( |
- InputEventAckState result) { |
- override_result_ = true; |
- result_ = result; |
-} |
- |
-void TestInputHandlerManager::HandleInputEvent( |
- int routing_id, |
- blink::WebScopedInputEvent input_event, |
- const ui::LatencyInfo& latency_info, |
- const InputEventAckStateCallback& callback) { |
- if (override_result_) { |
- callback.Run(result_, std::move(input_event), latency_info, nullptr); |
- return; |
- } |
- InputHandlerManager::HandleInputEvent(routing_id, std::move(input_event), |
- latency_info, callback); |
-} |
- |
-// Empty implementation of InputHandlerManagerClient. |
-class TestInputHandlerManagerClient : public InputHandlerManagerClient { |
- public: |
- TestInputHandlerManagerClient() {} |
- ~TestInputHandlerManagerClient() override{}; |
- |
- // InputHandlerManagerClient: |
- void SetInputHandlerManager( |
- InputHandlerManager* input_handler_manager) override {} |
- void RegisterRoutingID(int routing_id) override {} |
- void UnregisterRoutingID(int routing_id) override {} |
- void DidOverscroll(int routing_id, |
- const ui::DidOverscrollParams& params) override {} |
- void DidStopFlinging(int routing_id) override {} |
- void DispatchNonBlockingEventToMainThread( |
- int routing_id, |
- blink::WebScopedInputEvent event, |
- const ui::LatencyInfo& latency_info) override {} |
- |
- void NotifyInputEventHandled(int routing_id, |
- blink::WebInputEvent::Type type, |
- InputEventAckState ack_result) override {} |
- void ProcessRafAlignedInput(int routing_id) override {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(TestInputHandlerManagerClient); |
-}; |
- |
-// Implementation of RenderWidget for testing, performs no initialization. |
-class TestRenderWidget : public RenderWidget { |
- public: |
- explicit TestRenderWidget(CompositorDependencies* compositor_deps) |
- : RenderWidget(1, |
- compositor_deps, |
- blink::WebPopupTypeNone, |
- ScreenInfo(), |
- true, |
- false, |
- false) {} |
- |
- protected: |
- ~TestRenderWidget() override {} |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(TestRenderWidget); |
-}; |
- |
-// Test override of RenderWidgetInputHandler to allow the control of |
-// HandleInputEvent. This will perform no actions on input until a |
-// RenderWidgetInputHandlerDelegate is set. Once set this will always ack |
-// received events. |
-class TestRenderWidgetInputHandler : public RenderWidgetInputHandler { |
- public: |
- TestRenderWidgetInputHandler(RenderWidget* render_widget); |
- ~TestRenderWidgetInputHandler() override {} |
- |
- void set_delegate(RenderWidgetInputHandlerDelegate* delegate) { |
- delegate_ = delegate; |
- } |
- void set_state(InputEventAckState state) { state_ = state; } |
- |
- // RenderWidgetInputHandler: |
- void HandleInputEvent(const blink::WebInputEvent& input_event, |
- const ui::LatencyInfo& latency_info, |
- InputEventDispatchType dispatch_type) override; |
- |
- private: |
- // The input delegate which receives event acks. |
- RenderWidgetInputHandlerDelegate* delegate_; |
- |
- // The result of input handling to send to |delegate_| during the ack. |
- InputEventAckState state_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestRenderWidgetInputHandler); |
-}; |
- |
-TestRenderWidgetInputHandler::TestRenderWidgetInputHandler( |
- RenderWidget* render_widget) |
- : RenderWidgetInputHandler(render_widget, render_widget), |
- delegate_(nullptr), |
- state_(InputEventAckState::INPUT_EVENT_ACK_STATE_UNKNOWN) {} |
- |
-void TestRenderWidgetInputHandler::HandleInputEvent( |
- const blink::WebInputEvent& input_event, |
- const ui::LatencyInfo& latency_info, |
- InputEventDispatchType dispatch_type) { |
- if (delegate_) { |
- std::unique_ptr<InputEventAck> ack(new InputEventAck( |
- InputEventAckSource::COMPOSITOR_THREAD, input_event.type(), state_)); |
- delegate_->OnInputEventAck(std::move(ack)); |
- } |
-} |
- |
-} // namespace |
- |
-// Test suite for CompositorMusConnection, this does not setup a full renderer |
-// environment. This does not establish a connection to a mus server, nor does |
-// it initialize one. |
-class CompositorMusConnectionTest : public testing::Test { |
- public: |
- CompositorMusConnectionTest() {} |
- ~CompositorMusConnectionTest() override {} |
- |
- // Returns a valid key event, so that it can be converted to a web event by |
- // CompositorMusConnection. |
- std::unique_ptr<ui::Event> GenerateKeyEvent(); |
- |
- // Calls CompositorMusConnection::OnWindowInputEvent. |
- void OnWindowInputEvent( |
- ui::Window* window, |
- const ui::Event& event, |
- std::unique_ptr<base::Callback<void(EventResult)>>* ack_callback); |
- |
- // Confirms the state of pending tasks enqueued on each task runner, and runs |
- // until idle. |
- void VerifyAndRunQueues(bool main_task_runner_enqueued, |
- bool compositor_task_runner_enqueued); |
- |
- CompositorMusConnection* compositor_connection() { |
- return compositor_connection_.get(); |
- } |
- RenderWidgetMusConnection* connection() { return connection_; } |
- TestInputHandlerManager* input_handler_manager() { |
- return input_handler_manager_.get(); |
- } |
- TestRenderWidgetInputHandler* render_widget_input_handler() { |
- return render_widget_input_handler_.get(); |
- } |
- |
- // testing::Test: |
- void SetUp() override; |
- void TearDown() override; |
- |
- private: |
- // Mocks/Fakes of the testing environment. |
- TestInputHandlerManagerClient input_handler_manager_client_; |
- FakeCompositorDependencies compositor_dependencies_; |
- blink::scheduler::FakeRendererScheduler renderer_scheduler_; |
- MockRenderThread render_thread_; |
- scoped_refptr<TestRenderWidget> render_widget_; |
- mojo::InterfaceRequest<ui::mojom::WindowTreeClient> request_; |
- |
- // Not owned, RenderWidgetMusConnection tracks in static state. Cleared during |
- // TearDown. |
- RenderWidgetMusConnection* connection_; |
- |
- // Test versions of task runners, see VerifyAndRunQueues to use in testing. |
- scoped_refptr<base::TestSimpleTaskRunner> main_task_runner_; |
- scoped_refptr<base::TestSimpleTaskRunner> compositor_task_runner_; |
- |
- // Actual CompositorMusConnection for testing. |
- scoped_refptr<CompositorMusConnection> compositor_connection_; |
- |
- // Test implementations, to control input given to |compositor_connection_|. |
- std::unique_ptr<TestInputHandlerManager> input_handler_manager_; |
- std::unique_ptr<TestRenderWidgetInputHandler> render_widget_input_handler_; |
- |
- DISALLOW_COPY_AND_ASSIGN(CompositorMusConnectionTest); |
-}; |
- |
-std::unique_ptr<ui::Event> CompositorMusConnectionTest::GenerateKeyEvent() { |
- return std::unique_ptr<ui::Event>(new ui::KeyEvent( |
- ui::ET_KEY_PRESSED, ui::KeyboardCode::VKEY_A, ui::EF_NONE)); |
-} |
- |
-void CompositorMusConnectionTest::OnWindowInputEvent( |
- ui::Window* window, |
- const ui::Event& event, |
- std::unique_ptr<base::Callback<void(EventResult)>>* ack_callback) { |
- compositor_connection_->OnWindowInputEvent(window, event, ack_callback); |
-} |
- |
-void CompositorMusConnectionTest::VerifyAndRunQueues( |
- bool main_task_runner_enqueued, |
- bool compositor_task_runner_enqueued) { |
- // Run through the enqueued actions. |
- EXPECT_EQ(main_task_runner_enqueued, main_task_runner_->HasPendingTask()); |
- main_task_runner_->RunUntilIdle(); |
- |
- EXPECT_EQ(compositor_task_runner_enqueued, |
- compositor_task_runner_->HasPendingTask()); |
- compositor_task_runner_->RunUntilIdle(); |
-} |
- |
-void CompositorMusConnectionTest::SetUp() { |
- testing::Test::SetUp(); |
- |
- main_task_runner_ = new base::TestSimpleTaskRunner(); |
- compositor_task_runner_ = new base::TestSimpleTaskRunner(); |
- |
- input_handler_manager_.reset(new TestInputHandlerManager( |
- compositor_task_runner_, &input_handler_manager_client_, |
- &renderer_scheduler_)); |
- |
- const int routing_id = 42; |
- compositor_connection_ = new CompositorMusConnection( |
- routing_id, main_task_runner_, compositor_task_runner_, |
- std::move(request_), input_handler_manager_.get()); |
- |
- // CompositorMusConnection attempts to create connection to the non-existant |
- // server. Clear that. |
- compositor_task_runner_->ClearPendingTasks(); |
- |
- render_widget_ = new TestRenderWidget(&compositor_dependencies_); |
- render_widget_input_handler_.reset( |
- new TestRenderWidgetInputHandler(render_widget_.get())); |
- connection_ = RenderWidgetMusConnection::GetOrCreate(routing_id); |
- connection_->SetInputHandler(render_widget_input_handler_.get()); |
-} |
- |
-void CompositorMusConnectionTest::TearDown() { |
- // Clear static state. |
- connection_->OnConnectionLost(); |
- testing::Test::TearDown(); |
-} |
- |
-// Tests that for events which the renderer will ack, yet not consume, that |
-// CompositorMusConnection consumes the ack during OnWindowInputEvent, and calls |
-// it with the correct state once processed. |
-TEST_F(CompositorMusConnectionTest, NotConsumed) { |
- TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); |
- input_handler->set_delegate(connection()); |
- input_handler->set_state( |
- InputEventAckState::INPUT_EVENT_ACK_STATE_NOT_CONSUMED); |
- |
- ui::TestWindow test_window; |
- std::unique_ptr<ui::Event> event(GenerateKeyEvent()); |
- scoped_refptr<TestCallback> test_callback(new TestCallback); |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback( |
- new base::Callback<void(EventResult)>( |
- base::Bind(&TestCallback::ResultCallback, test_callback))); |
- |
- OnWindowInputEvent(&test_window, *event.get(), &ack_callback); |
- // OnWindowInputEvent is expected to clear the callback if it plans on |
- // handling the ack. |
- EXPECT_FALSE(ack_callback.get()); |
- |
- VerifyAndRunQueues(true, true); |
- |
- // The ack callback should have been called |
- EXPECT_TRUE(test_callback->called()); |
- EXPECT_EQ(EventResult::UNHANDLED, test_callback->result()); |
-} |
- |
-// Tests that for events which the renderer will ack, and consume, that |
-// CompositorMusConnection consumes the ack during OnWindowInputEvent, and calls |
-// it with the correct state once processed. |
-TEST_F(CompositorMusConnectionTest, Consumed) { |
- TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); |
- input_handler->set_delegate(connection()); |
- input_handler->set_state(InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); |
- |
- ui::TestWindow test_window; |
- std::unique_ptr<ui::Event> event(GenerateKeyEvent()); |
- scoped_refptr<TestCallback> test_callback(new TestCallback); |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback( |
- new base::Callback<void(EventResult)>( |
- base::Bind(&TestCallback::ResultCallback, test_callback))); |
- |
- OnWindowInputEvent(&test_window, *event.get(), &ack_callback); |
- // OnWindowInputEvent is expected to clear the callback if it plans on |
- // handling the ack. |
- EXPECT_FALSE(ack_callback.get()); |
- |
- VerifyAndRunQueues(true, true); |
- |
- // The ack callback should have been called |
- EXPECT_TRUE(test_callback->called()); |
- EXPECT_EQ(EventResult::HANDLED, test_callback->result()); |
-} |
- |
-// Tests that when the RenderWidgetInputHandler does not ack before a new event |
-// arrives, that only the most recent ack is fired. |
-TEST_F(CompositorMusConnectionTest, LostAck) { |
- ui::TestWindow test_window; |
- std::unique_ptr<ui::Event> event1(GenerateKeyEvent()); |
- scoped_refptr<TestCallback> test_callback1(new TestCallback); |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback1( |
- new base::Callback<void(EventResult)>( |
- base::Bind(&TestCallback::ResultCallback, test_callback1))); |
- |
- OnWindowInputEvent(&test_window, *event1.get(), &ack_callback1); |
- EXPECT_FALSE(ack_callback1.get()); |
- // When simulating the timeout the ack is never enqueued |
- VerifyAndRunQueues(true, false); |
- |
- // Setting a delegate will lead to the next event being acked. Having a |
- // cleared queue simulates the input handler timing out on an event. |
- TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); |
- input_handler->set_delegate(connection()); |
- input_handler->set_state(InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); |
- |
- std::unique_ptr<ui::Event> event2(GenerateKeyEvent()); |
- scoped_refptr<TestCallback> test_callback2(new TestCallback); |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback2( |
- new base::Callback<void(EventResult)>( |
- base::Bind(&TestCallback::ResultCallback, test_callback2))); |
- OnWindowInputEvent(&test_window, *event2.get(), &ack_callback2); |
- EXPECT_FALSE(ack_callback2.get()); |
- |
- VerifyAndRunQueues(true, true); |
- |
- // Only the most recent ack was called. |
- EXPECT_FALSE(test_callback1->called()); |
- EXPECT_TRUE(test_callback2->called()); |
- EXPECT_EQ(EventResult::HANDLED, test_callback2->result()); |
-} |
- |
-// Tests that when an input handler consumes the event, that |
-// CompositorMusConnection will consume the ack, but call as UNHANDLED. |
-TEST_F(CompositorMusConnectionTest, InputHandlerConsumes) { |
- input_handler_manager()->SetHandleInputEventResult( |
- InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); |
- ui::TestWindow test_window; |
- std::unique_ptr<ui::Event> event(GenerateKeyEvent()); |
- scoped_refptr<TestCallback> test_callback(new TestCallback); |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback( |
- new base::Callback<void(EventResult)>( |
- base::Bind(&TestCallback::ResultCallback, test_callback))); |
- |
- OnWindowInputEvent(&test_window, *event.get(), &ack_callback); |
- |
- EXPECT_FALSE(ack_callback.get()); |
- VerifyAndRunQueues(false, false); |
- EXPECT_TRUE(test_callback->called()); |
- EXPECT_EQ(EventResult::UNHANDLED, test_callback->result()); |
-} |
- |
-// Tests that when the renderer will not ack an event, that |
-// CompositorMusConnection will consume the ack, but call as UNHANDLED. |
-TEST_F(CompositorMusConnectionTest, RendererWillNotSendAck) { |
- ui::TestWindow test_window; |
- ui::PointerEvent event( |
- ui::ET_POINTER_DOWN, gfx::Point(), gfx::Point(), ui::EF_NONE, 0, 0, |
- ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_MOUSE), |
- ui::EventTimeForNow()); |
- |
- scoped_refptr<TestCallback> test_callback(new TestCallback); |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback( |
- new base::Callback<void(EventResult)>( |
- base::Bind(&TestCallback::ResultCallback, test_callback))); |
- |
- OnWindowInputEvent(&test_window, event, &ack_callback); |
- EXPECT_FALSE(ack_callback.get()); |
- |
- VerifyAndRunQueues(true, false); |
- EXPECT_TRUE(test_callback->called()); |
- EXPECT_EQ(EventResult::UNHANDLED, test_callback->result()); |
-} |
- |
-// Tests that when a touch event id provided, that CompositorMusConnection |
-// consumes the ack. |
-TEST_F(CompositorMusConnectionTest, TouchEventConsumed) { |
- TestRenderWidgetInputHandler* input_handler = render_widget_input_handler(); |
- input_handler->set_delegate(connection()); |
- input_handler->set_state(InputEventAckState::INPUT_EVENT_ACK_STATE_CONSUMED); |
- |
- ui::TestWindow test_window; |
- ui::PointerEvent event( |
- ui::ET_POINTER_DOWN, gfx::Point(), gfx::Point(), ui::EF_NONE, 0, 0, |
- ui::PointerDetails(ui::EventPointerType::POINTER_TYPE_TOUCH), |
- ui::EventTimeForNow()); |
- |
- scoped_refptr<TestCallback> test_callback(new TestCallback); |
- std::unique_ptr<base::Callback<void(EventResult)>> ack_callback( |
- new base::Callback<void(EventResult)>( |
- base::Bind(&TestCallback::ResultCallback, test_callback))); |
- |
- OnWindowInputEvent(&test_window, event, &ack_callback); |
- // OnWindowInputEvent is expected to clear the callback if it plans on |
- // handling the ack. |
- EXPECT_FALSE(ack_callback.get()); |
- |
- VerifyAndRunQueues(true, true); |
- |
- // The ack callback should have been called |
- EXPECT_TRUE(test_callback->called()); |
- EXPECT_EQ(EventResult::HANDLED, test_callback->result()); |
-} |
- |
-} // namespace content |