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 |