| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/input/input_handler_manager.h" | 5 #include "content/renderer/input/input_handler_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 InputEventAckState InputEventDispositionToAck( | 30 InputEventAckState InputEventDispositionToAck( |
| 31 InputHandlerProxy::EventDisposition disposition) { | 31 InputHandlerProxy::EventDisposition disposition) { |
| 32 switch (disposition) { | 32 switch (disposition) { |
| 33 case InputHandlerProxy::DID_HANDLE: | 33 case InputHandlerProxy::DID_HANDLE: |
| 34 return INPUT_EVENT_ACK_STATE_CONSUMED; | 34 return INPUT_EVENT_ACK_STATE_CONSUMED; |
| 35 case InputHandlerProxy::DID_NOT_HANDLE: | 35 case InputHandlerProxy::DID_NOT_HANDLE: |
| 36 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; | 36 return INPUT_EVENT_ACK_STATE_NOT_CONSUMED; |
| 37 case InputHandlerProxy::DROP_EVENT: | 37 case InputHandlerProxy::DROP_EVENT: |
| 38 return INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS; | 38 return INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS; |
| 39 case InputHandlerProxy::NON_BLOCKING: |
| 40 return INPUT_EVENT_ACK_STATE_SET_NON_BLOCKING; |
| 39 } | 41 } |
| 40 NOTREACHED(); | 42 NOTREACHED(); |
| 41 return INPUT_EVENT_ACK_STATE_UNKNOWN; | 43 return INPUT_EVENT_ACK_STATE_UNKNOWN; |
| 42 } | 44 } |
| 43 | 45 |
| 44 } // namespace | 46 } // namespace |
| 45 | 47 |
| 46 InputHandlerManager::InputHandlerManager( | 48 InputHandlerManager::InputHandlerManager( |
| 47 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 49 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| 48 InputHandlerManagerClient* client, | 50 InputHandlerManagerClient* client, |
| 49 scheduler::RendererScheduler* renderer_scheduler) | 51 scheduler::RendererScheduler* renderer_scheduler) |
| 50 : task_runner_(task_runner), | 52 : task_runner_(task_runner), |
| 51 client_(client), | 53 client_(client), |
| 52 renderer_scheduler_(renderer_scheduler) { | 54 renderer_scheduler_(renderer_scheduler) { |
| 53 DCHECK(client_); | 55 DCHECK(client_); |
| 54 client_->SetBoundHandler(base::Bind(&InputHandlerManager::HandleInputEvent, | 56 client_->SetBoundHandler(base::Bind(&InputHandlerManager::HandleInputEvent, |
| 55 base::Unretained(this))); | 57 base::Unretained(this))); |
| 56 } | 58 } |
| 57 | 59 |
| 58 InputHandlerManager::~InputHandlerManager() { | 60 InputHandlerManager::~InputHandlerManager() { |
| 59 client_->SetBoundHandler(InputHandlerManagerClient::Handler()); | 61 client_->SetBoundHandler(InputHandlerManagerClient::Handler()); |
| 60 } | 62 } |
| 61 | 63 |
| 62 void InputHandlerManager::AddInputHandler( | 64 void InputHandlerManager::AddInputHandler( |
| 63 int routing_id, | 65 int routing_id, |
| 64 const base::WeakPtr<cc::InputHandler>& input_handler, | 66 const base::WeakPtr<cc::InputHandler>& input_handler, |
| 65 const base::WeakPtr<RenderViewImpl>& render_view_impl, | 67 const base::WeakPtr<RenderViewImpl>& render_view_impl, |
| 66 bool enable_smooth_scrolling) { | 68 bool enable_smooth_scrolling, |
| 69 bool enable_wheel_gestures) { |
| 67 if (task_runner_->BelongsToCurrentThread()) { | 70 if (task_runner_->BelongsToCurrentThread()) { |
| 68 AddInputHandlerOnCompositorThread(routing_id, | 71 AddInputHandlerOnCompositorThread( |
| 69 base::ThreadTaskRunnerHandle::Get(), | 72 routing_id, base::ThreadTaskRunnerHandle::Get(), input_handler, |
| 70 input_handler, render_view_impl, | 73 render_view_impl, enable_smooth_scrolling, enable_wheel_gestures); |
| 71 enable_smooth_scrolling); | |
| 72 } else { | 74 } else { |
| 73 task_runner_->PostTask( | 75 task_runner_->PostTask( |
| 74 FROM_HERE, | 76 FROM_HERE, |
| 75 base::Bind(&InputHandlerManager::AddInputHandlerOnCompositorThread, | 77 base::Bind(&InputHandlerManager::AddInputHandlerOnCompositorThread, |
| 76 base::Unretained(this), routing_id, | 78 base::Unretained(this), routing_id, |
| 77 base::ThreadTaskRunnerHandle::Get(), input_handler, | 79 base::ThreadTaskRunnerHandle::Get(), input_handler, |
| 78 render_view_impl, | 80 render_view_impl, enable_smooth_scrolling, |
| 79 enable_smooth_scrolling)); | 81 enable_wheel_gestures)); |
| 80 } | 82 } |
| 81 } | 83 } |
| 82 | 84 |
| 83 void InputHandlerManager::AddInputHandlerOnCompositorThread( | 85 void InputHandlerManager::AddInputHandlerOnCompositorThread( |
| 84 int routing_id, | 86 int routing_id, |
| 85 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, | 87 const scoped_refptr<base::SingleThreadTaskRunner>& main_task_runner, |
| 86 const base::WeakPtr<cc::InputHandler>& input_handler, | 88 const base::WeakPtr<cc::InputHandler>& input_handler, |
| 87 const base::WeakPtr<RenderViewImpl>& render_view_impl, | 89 const base::WeakPtr<RenderViewImpl>& render_view_impl, |
| 88 bool enable_smooth_scrolling) { | 90 bool enable_smooth_scrolling, |
| 91 bool enable_wheel_gestures) { |
| 89 DCHECK(task_runner_->BelongsToCurrentThread()); | 92 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 90 | 93 |
| 91 // The handler could be gone by this point if the compositor has shut down. | 94 // The handler could be gone by this point if the compositor has shut down. |
| 92 if (!input_handler) | 95 if (!input_handler) |
| 93 return; | 96 return; |
| 94 | 97 |
| 95 // The same handler may be registered for a route multiple times. | 98 // The same handler may be registered for a route multiple times. |
| 96 if (input_handlers_.count(routing_id) != 0) | 99 if (input_handlers_.count(routing_id) != 0) |
| 97 return; | 100 return; |
| 98 | 101 |
| 99 TRACE_EVENT1("input", | 102 TRACE_EVENT1("input", |
| 100 "InputHandlerManager::AddInputHandlerOnCompositorThread", | 103 "InputHandlerManager::AddInputHandlerOnCompositorThread", |
| 101 "result", "AddingRoute"); | 104 "result", "AddingRoute"); |
| 102 scoped_ptr<InputHandlerWrapper> wrapper(new InputHandlerWrapper( | 105 scoped_ptr<InputHandlerWrapper> wrapper(new InputHandlerWrapper( |
| 103 this, routing_id, main_task_runner, input_handler, render_view_impl, | 106 this, routing_id, main_task_runner, input_handler, render_view_impl, |
| 104 enable_smooth_scrolling)); | 107 enable_smooth_scrolling, enable_wheel_gestures)); |
| 105 client_->DidAddInputHandler(routing_id, wrapper->input_handler_proxy()); | 108 client_->DidAddInputHandler(routing_id, wrapper->input_handler_proxy()); |
| 106 input_handlers_.add(routing_id, std::move(wrapper)); | 109 input_handlers_.add(routing_id, std::move(wrapper)); |
| 107 } | 110 } |
| 108 | 111 |
| 109 void InputHandlerManager::RemoveInputHandler(int routing_id) { | 112 void InputHandlerManager::RemoveInputHandler(int routing_id) { |
| 110 DCHECK(task_runner_->BelongsToCurrentThread()); | 113 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 111 DCHECK(input_handlers_.contains(routing_id)); | 114 DCHECK(input_handlers_.contains(routing_id)); |
| 112 | 115 |
| 113 TRACE_EVENT0("input", "InputHandlerManager::RemoveInputHandler"); | 116 TRACE_EVENT0("input", "InputHandlerManager::RemoveInputHandler"); |
| 114 | 117 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 134 auto it = input_handlers_.find(routing_id); | 137 auto it = input_handlers_.find(routing_id); |
| 135 if (it == input_handlers_.end()) | 138 if (it == input_handlers_.end()) |
| 136 return; | 139 return; |
| 137 | 140 |
| 138 InputHandlerProxy* proxy = it->second->input_handler_proxy(); | 141 InputHandlerProxy* proxy = it->second->input_handler_proxy(); |
| 139 DCHECK(proxy->scroll_elasticity_controller()); | 142 DCHECK(proxy->scroll_elasticity_controller()); |
| 140 proxy->scroll_elasticity_controller()->ObserveWheelEventAndResult( | 143 proxy->scroll_elasticity_controller()->ObserveWheelEventAndResult( |
| 141 wheel_event, scroll_result); | 144 wheel_event, scroll_result); |
| 142 } | 145 } |
| 143 | 146 |
| 147 void InputHandlerManager::NonBlockingInputEventHandledOnMainThread( |
| 148 int routing_id, |
| 149 blink::WebInputEvent::Type type) { |
| 150 task_runner_->PostTask( |
| 151 FROM_HERE, |
| 152 base::Bind( |
| 153 &InputHandlerManager::NonBlockingInputEventHandledOnCompositorThread, |
| 154 base::Unretained(this), routing_id, type)); |
| 155 } |
| 156 |
| 157 void InputHandlerManager::NonBlockingInputEventHandledOnCompositorThread( |
| 158 int routing_id, |
| 159 blink::WebInputEvent::Type handled_type) { |
| 160 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 161 auto it = input_handlers_.find(routing_id); |
| 162 if (it == input_handlers_.end()) |
| 163 return; |
| 164 |
| 165 client_->NonBlockingInputEventHandled(routing_id, handled_type); |
| 166 } |
| 167 |
| 144 InputEventAckState InputHandlerManager::HandleInputEvent( | 168 InputEventAckState InputHandlerManager::HandleInputEvent( |
| 145 int routing_id, | 169 int routing_id, |
| 146 const WebInputEvent* input_event, | 170 const WebInputEvent* input_event, |
| 147 ui::LatencyInfo* latency_info) { | 171 ui::LatencyInfo* latency_info) { |
| 148 DCHECK(task_runner_->BelongsToCurrentThread()); | 172 DCHECK(task_runner_->BelongsToCurrentThread()); |
| 149 TRACE_EVENT1("input,benchmark", "InputHandlerManager::HandleInputEvent", | 173 TRACE_EVENT1("input,benchmark", "InputHandlerManager::HandleInputEvent", |
| 150 "type", WebInputEventTraits::GetName(input_event->type)); | 174 "type", WebInputEventTraits::GetName(input_event->type)); |
| 151 | 175 |
| 152 auto it = input_handlers_.find(routing_id); | 176 auto it = input_handlers_.find(routing_id); |
| 153 if (it == input_handlers_.end()) { | 177 if (it == input_handlers_.end()) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 210 |
| 187 void InputHandlerManager::DidStopFlinging(int routing_id) { | 211 void InputHandlerManager::DidStopFlinging(int routing_id) { |
| 188 client_->DidStopFlinging(routing_id); | 212 client_->DidStopFlinging(routing_id); |
| 189 } | 213 } |
| 190 | 214 |
| 191 void InputHandlerManager::DidAnimateForInput() { | 215 void InputHandlerManager::DidAnimateForInput() { |
| 192 renderer_scheduler_->DidAnimateForInputOnCompositorThread(); | 216 renderer_scheduler_->DidAnimateForInputOnCompositorThread(); |
| 193 } | 217 } |
| 194 | 218 |
| 195 } // namespace content | 219 } // namespace content |
| OLD | NEW |