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

Side by Side Diff: content/browser/devtools/protocol/input_handler.cc

Issue 2575513004: [DevTools] Migrate input domain to new generator. (Closed)
Patch Set: Created 4 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 "content/browser/devtools/protocol/input_handler.h" 5 #include "content/browser/devtools/protocol/input_handler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h" 10 #include "base/strings/utf_string_conversions.h"
11 #include "base/threading/thread_task_runner_handle.h" 11 #include "base/threading/thread_task_runner_handle.h"
12 #include "base/trace_event/trace_event.h" 12 #include "base/trace_event/trace_event.h"
13 #include "cc/output/compositor_frame_metadata.h" 13 #include "cc/output/compositor_frame_metadata.h"
14 #include "content/browser/frame_host/render_frame_host_impl.h"
14 #include "content/browser/renderer_host/render_widget_host_impl.h" 15 #include "content/browser/renderer_host/render_widget_host_impl.h"
15 #include "content/common/input/synthetic_pinch_gesture_params.h" 16 #include "content/common/input/synthetic_pinch_gesture_params.h"
16 #include "content/common/input/synthetic_smooth_scroll_gesture_params.h" 17 #include "content/common/input/synthetic_smooth_scroll_gesture_params.h"
17 #include "content/common/input/synthetic_tap_gesture_params.h" 18 #include "content/common/input/synthetic_tap_gesture_params.h"
18 #include "third_party/WebKit/public/platform/WebInputEvent.h" 19 #include "third_party/WebKit/public/platform/WebInputEvent.h"
19 #include "ui/events/keycodes/dom/keycode_converter.h" 20 #include "ui/events/keycodes/dom/keycode_converter.h"
20 #include "ui/gfx/geometry/point.h" 21 #include "ui/gfx/geometry/point.h"
21 22
22 namespace content { 23 namespace content {
23 namespace devtools { 24 namespace protocol {
24 namespace input {
25 25
26 namespace { 26 namespace {
27 27
28 gfx::PointF CssPixelsToPointF(int x, int y, float page_scale_factor) { 28 gfx::PointF CssPixelsToPointF(int x, int y, float page_scale_factor) {
29 return gfx::PointF(x * page_scale_factor, y * page_scale_factor); 29 return gfx::PointF(x * page_scale_factor, y * page_scale_factor);
30 } 30 }
31 31
32 gfx::Vector2dF CssPixelsToVector2dF(int x, int y, float page_scale_factor) { 32 gfx::Vector2dF CssPixelsToVector2dF(int x, int y, float page_scale_factor) {
33 return gfx::Vector2dF(x * page_scale_factor, y * page_scale_factor); 33 return gfx::Vector2dF(x * page_scale_factor, y * page_scale_factor);
34 } 34 }
35 35
36 bool StringToGestureSourceType(const std::string& in, 36 bool StringToGestureSourceType(Maybe<std::string> in,
37 SyntheticGestureParams::GestureSourceType& out) { 37 SyntheticGestureParams::GestureSourceType& out) {
38 if (in == kGestureSourceTypeDefault) { 38 if (!in.isJust()) {
39 out = SyntheticGestureParams::GestureSourceType::DEFAULT_INPUT; 39 out = SyntheticGestureParams::GestureSourceType::DEFAULT_INPUT;
40 return true; 40 return true;
41 } else if (in == kGestureSourceTypeTouch) { 41 } else if (in.fromJust() == Input::GestureSourceTypeEnum::Default) {
caseq 2016/12/14 18:18:18 no else after return
dgozman 2016/12/15 04:20:08 Done.
42 out = SyntheticGestureParams::GestureSourceType::DEFAULT_INPUT;
43 return true;
44 } else if (in.fromJust() == Input::GestureSourceTypeEnum::Touch) {
caseq 2016/12/14 18:18:18 ditto.
42 out = SyntheticGestureParams::GestureSourceType::TOUCH_INPUT; 45 out = SyntheticGestureParams::GestureSourceType::TOUCH_INPUT;
43 return true; 46 return true;
44 } else if (in == kGestureSourceTypeMouse) { 47 } else if (in.fromJust() == Input::GestureSourceTypeEnum::Mouse) {
caseq 2016/12/14 18:18:18 ditto.
45 out = SyntheticGestureParams::GestureSourceType::MOUSE_INPUT; 48 out = SyntheticGestureParams::GestureSourceType::MOUSE_INPUT;
46 return true; 49 return true;
47 } else { 50 } else {
caseq 2016/12/14 18:18:18 ditto.
48 return false; 51 return false;
49 } 52 }
50 } 53 }
51 54
52 } 55 void SetEventModifiers(blink::WebInputEvent* event, int modifiers) {
53 56 if (modifiers & 1)
54 typedef DevToolsProtocolClient::Response Response;
55
56 namespace {
57
58 void SetEventModifiers(blink::WebInputEvent* event, const int* modifiers) {
59 if (!modifiers)
60 return;
61 if (*modifiers & 1)
62 event->modifiers |= blink::WebInputEvent::AltKey; 57 event->modifiers |= blink::WebInputEvent::AltKey;
63 if (*modifiers & 2) 58 if (modifiers & 2)
64 event->modifiers |= blink::WebInputEvent::ControlKey; 59 event->modifiers |= blink::WebInputEvent::ControlKey;
65 if (*modifiers & 4) 60 if (modifiers & 4)
66 event->modifiers |= blink::WebInputEvent::MetaKey; 61 event->modifiers |= blink::WebInputEvent::MetaKey;
67 if (*modifiers & 8) 62 if (modifiers & 8)
68 event->modifiers |= blink::WebInputEvent::ShiftKey; 63 event->modifiers |= blink::WebInputEvent::ShiftKey;
69 } 64 }
70 65
71 void SetEventTimestamp(blink::WebInputEvent* event, const double* timestamp) { 66 void SetEventTimestamp(blink::WebInputEvent* event, Maybe<double> timestamp) {
72 // Convert timestamp, in seconds since unix epoch, to an event timestamp 67 // Convert timestamp, in seconds since unix epoch, to an event timestamp
73 // which is time ticks since platform start time. 68 // which is time ticks since platform start time.
74 base::TimeTicks ticks = timestamp 69 base::TimeTicks ticks = timestamp.isJust()
75 ? base::TimeDelta::FromSecondsD(*timestamp) + 70 ? base::TimeDelta::FromSecondsD(timestamp.fromJust()) +
76 base::TimeTicks::UnixEpoch() 71 base::TimeTicks::UnixEpoch()
77 : base::TimeTicks::Now(); 72 : base::TimeTicks::Now();
78 event->timeStampSeconds = (ticks - base::TimeTicks()).InSecondsF(); 73 event->timeStampSeconds = (ticks - base::TimeTicks()).InSecondsF();
79 } 74 }
80 75
81 bool SetKeyboardEventText(blink::WebUChar* to, const std::string* from) { 76 bool SetKeyboardEventText(blink::WebUChar* to, Maybe<std::string> from) {
82 if (!from) 77 if (!from.isJust())
83 return true; 78 return true;
84 79
85 base::string16 text16 = base::UTF8ToUTF16(*from); 80 base::string16 text16 = base::UTF8ToUTF16(from.fromJust());
86 if (text16.size() > blink::WebKeyboardEvent::textLengthCap) 81 if (text16.size() > blink::WebKeyboardEvent::textLengthCap)
87 return false; 82 return false;
88 83
89 for (size_t i = 0; i < text16.size(); ++i) 84 for (size_t i = 0; i < text16.size(); ++i)
90 to[i] = text16[i]; 85 to[i] = text16[i];
91 return true; 86 return true;
92 } 87 }
93 88
94 bool SetMouseEventButton(blink::WebMouseEvent* event, 89 bool SetMouseEventButton(blink::WebMouseEvent* event,
95 const std::string* button) { 90 const std::string& button) {
96 if (!button) 91 if (button.empty())
97 return true; 92 return true;
98 93
99 if (*button == dispatch_mouse_event::kButtonNone) { 94 if (button == Input::DispatchMouseEvent::ButtonEnum::None) {
100 event->button = blink::WebMouseEvent::Button::NoButton; 95 event->button = blink::WebMouseEvent::Button::NoButton;
101 } else if (*button == dispatch_mouse_event::kButtonLeft) { 96 } else if (button == Input::DispatchMouseEvent::ButtonEnum::Left) {
102 event->button = blink::WebMouseEvent::Button::Left; 97 event->button = blink::WebMouseEvent::Button::Left;
103 event->modifiers |= blink::WebInputEvent::LeftButtonDown; 98 event->modifiers |= blink::WebInputEvent::LeftButtonDown;
104 } else if (*button == dispatch_mouse_event::kButtonMiddle) { 99 } else if (button == Input::DispatchMouseEvent::ButtonEnum::Middle) {
105 event->button = blink::WebMouseEvent::Button::Middle; 100 event->button = blink::WebMouseEvent::Button::Middle;
106 event->modifiers |= blink::WebInputEvent::MiddleButtonDown; 101 event->modifiers |= blink::WebInputEvent::MiddleButtonDown;
107 } else if (*button == dispatch_mouse_event::kButtonRight) { 102 } else if (button == Input::DispatchMouseEvent::ButtonEnum::Right) {
108 event->button = blink::WebMouseEvent::Button::Right; 103 event->button = blink::WebMouseEvent::Button::Right;
109 event->modifiers |= blink::WebInputEvent::RightButtonDown; 104 event->modifiers |= blink::WebInputEvent::RightButtonDown;
110 } else { 105 } else {
111 return false; 106 return false;
112 } 107 }
113 return true; 108 return true;
114 } 109 }
115 110
116 bool SetMouseEventType(blink::WebMouseEvent* event, const std::string& type) { 111 bool SetMouseEventType(blink::WebMouseEvent* event, const std::string& type) {
117 if (type == dispatch_mouse_event::kTypeMousePressed) { 112 if (type == Input::DispatchMouseEvent::TypeEnum::MousePressed) {
118 event->type = blink::WebInputEvent::MouseDown; 113 event->type = blink::WebInputEvent::MouseDown;
119 } else if (type == dispatch_mouse_event::kTypeMouseReleased) { 114 } else if (type == Input::DispatchMouseEvent::TypeEnum::MouseReleased) {
120 event->type = blink::WebInputEvent::MouseUp; 115 event->type = blink::WebInputEvent::MouseUp;
121 } else if (type == dispatch_mouse_event::kTypeMouseMoved) { 116 } else if (type == Input::DispatchMouseEvent::TypeEnum::MouseMoved) {
122 event->type = blink::WebInputEvent::MouseMove; 117 event->type = blink::WebInputEvent::MouseMove;
123 } else { 118 } else {
124 return false; 119 return false;
125 } 120 }
126 return true; 121 return true;
127 } 122 }
128 123
124 void SendSynthesizePinchGestureResponse(
125 std::unique_ptr<Input::Backend::SynthesizePinchGestureCallback> callback,
126 SyntheticGesture::Result result) {
127 if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
128 callback->sendSuccess();
129 } else {
130 callback->sendFailure(Response::Error(
131 base::StringPrintf("Synthetic pinch failed, result was %d", result)));
132 }
133 }
134
135 void SendSynthesizeTapGestureResponse(
136 std::unique_ptr<Input::Backend::SynthesizeTapGestureCallback> callback,
137 bool send_success,
138 SyntheticGesture::Result result) {
139 if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
140 if (send_success)
caseq 2016/12/14 18:18:18 So success we try to send only once...
141 callback->sendSuccess();
142 } else {
143 callback->sendFailure(Response::Error(
caseq 2016/12/14 18:18:18 ... and failure may be sent more than once?
144 base::StringPrintf("Synthetic tap failed, result was %d", result)));
145 }
146 }
147
148 void SendSynthesizeScrollGestureResponse(
149 std::unique_ptr<Input::Backend::SynthesizeScrollGestureCallback> callback,
150 SyntheticGesture::Result result) {
151 if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
152 callback->sendSuccess();
153 } else {
154 callback->sendFailure(Response::Error(
155 base::StringPrintf("Synthetic scroll failed, result was %d", result)));
156 }
157 }
158
129 } // namespace 159 } // namespace
130 160
131 InputHandler::InputHandler() 161 InputHandler::InputHandler()
132 : host_(NULL), 162 : host_(NULL),
133 page_scale_factor_(1.0), 163 page_scale_factor_(1.0),
164 last_id_(0),
134 weak_factory_(this) { 165 weak_factory_(this) {
135 } 166 }
136 167
137 InputHandler::~InputHandler() { 168 InputHandler::~InputHandler() {
138 } 169 }
139 170
140 void InputHandler::SetRenderWidgetHost(RenderWidgetHostImpl* host) { 171 void InputHandler::SetRenderFrameHost(RenderFrameHostImpl* host) {
141 host_ = host; 172 host_ = host;
142 } 173 }
143 174
144 void InputHandler::SetClient(std::unique_ptr<Client> client) { 175 void InputHandler::Wire(UberDispatcher* dispatcher) {
145 client_.swap(client); 176 Input::Dispatcher::wire(dispatcher, this);
146 } 177 }
147 178
148 void InputHandler::OnSwapCompositorFrame( 179 void InputHandler::OnSwapCompositorFrame(
149 const cc::CompositorFrameMetadata& frame_metadata) { 180 const cc::CompositorFrameMetadata& frame_metadata) {
150 page_scale_factor_ = frame_metadata.page_scale_factor; 181 page_scale_factor_ = frame_metadata.page_scale_factor;
151 scrollable_viewport_size_ = frame_metadata.scrollable_viewport_size; 182 scrollable_viewport_size_ = frame_metadata.scrollable_viewport_size;
152 } 183 }
153 184
185 Response InputHandler::Disable() {
186 return Response::OK();
187 }
188
154 Response InputHandler::DispatchKeyEvent( 189 Response InputHandler::DispatchKeyEvent(
155 const std::string& type, 190 const std::string& type,
156 const int* modifiers, 191 Maybe<int> modifiers,
157 const double* timestamp, 192 Maybe<double> timestamp,
158 const std::string* text, 193 Maybe<std::string> text,
159 const std::string* unmodified_text, 194 Maybe<std::string> unmodified_text,
160 const std::string* key_identifier, 195 Maybe<std::string> key_identifier,
161 const std::string* code, 196 Maybe<std::string> code,
162 const std::string* key, 197 Maybe<std::string> key,
163 const int* windows_virtual_key_code, 198 Maybe<int> windows_virtual_key_code,
164 const int* native_virtual_key_code, 199 Maybe<int> native_virtual_key_code,
165 const bool* auto_repeat, 200 Maybe<bool> auto_repeat,
166 const bool* is_keypad, 201 Maybe<bool> is_keypad,
167 const bool* is_system_key) { 202 Maybe<bool> is_system_key) {
168 NativeWebKeyboardEvent event; 203 NativeWebKeyboardEvent event;
169 event.skip_in_browser = true; 204 event.skip_in_browser = true;
170 205
171 if (type == dispatch_key_event::kTypeKeyDown) { 206 if (type == Input::DispatchKeyEvent::TypeEnum::KeyDown) {
172 event.type = blink::WebInputEvent::KeyDown; 207 event.type = blink::WebInputEvent::KeyDown;
173 } else if (type == dispatch_key_event::kTypeKeyUp) { 208 } else if (type == Input::DispatchKeyEvent::TypeEnum::KeyUp) {
174 event.type = blink::WebInputEvent::KeyUp; 209 event.type = blink::WebInputEvent::KeyUp;
175 } else if (type == dispatch_key_event::kTypeChar) { 210 } else if (type == Input::DispatchKeyEvent::TypeEnum::Char) {
176 event.type = blink::WebInputEvent::Char; 211 event.type = blink::WebInputEvent::Char;
177 } else if (type == dispatch_key_event::kTypeRawKeyDown) { 212 } else if (type == Input::DispatchKeyEvent::TypeEnum::RawKeyDown) {
178 event.type = blink::WebInputEvent::RawKeyDown; 213 event.type = blink::WebInputEvent::RawKeyDown;
179 } else { 214 } else {
180 return Response::InvalidParams( 215 return Response::InvalidParams(
181 base::StringPrintf("Unexpected event type '%s'", type.c_str())); 216 base::StringPrintf("Unexpected event type '%s'", type.c_str()));
182 } 217 }
183 218
184 SetEventModifiers(&event, modifiers); 219 SetEventModifiers(&event, modifiers.fromMaybe(0));
185 SetEventTimestamp(&event, timestamp); 220 SetEventTimestamp(&event, std::move(timestamp));
186 if (!SetKeyboardEventText(event.text, text)) 221 if (!SetKeyboardEventText(event.text, std::move(text)))
187 return Response::InvalidParams("Invalid 'text' parameter"); 222 return Response::InvalidParams("Invalid 'text' parameter");
188 if (!SetKeyboardEventText(event.unmodifiedText, unmodified_text)) 223 if (!SetKeyboardEventText(event.unmodifiedText, std::move(unmodified_text)))
189 return Response::InvalidParams("Invalid 'unmodifiedText' parameter"); 224 return Response::InvalidParams("Invalid 'unmodifiedText' parameter");
190 225
191 if (windows_virtual_key_code) 226 if (windows_virtual_key_code.isJust())
192 event.windowsKeyCode = *windows_virtual_key_code; 227 event.windowsKeyCode = windows_virtual_key_code.fromJust();
193 if (native_virtual_key_code) 228 if (native_virtual_key_code.isJust())
194 event.nativeKeyCode = *native_virtual_key_code; 229 event.nativeKeyCode = native_virtual_key_code.fromJust();
195 if (auto_repeat && *auto_repeat) 230 if (auto_repeat.fromMaybe(false))
196 event.modifiers |= blink::WebInputEvent::IsAutoRepeat; 231 event.modifiers |= blink::WebInputEvent::IsAutoRepeat;
197 if (is_keypad && *is_keypad) 232 if (is_keypad.fromMaybe(false))
198 event.modifiers |= blink::WebInputEvent::IsKeyPad; 233 event.modifiers |= blink::WebInputEvent::IsKeyPad;
199 if (is_system_key) 234 if (is_system_key.isJust())
200 event.isSystemKey = *is_system_key; 235 event.isSystemKey = is_system_key.fromJust();
201 236
202 if (code) { 237 if (code.isJust()) {
203 event.domCode = static_cast<int>( 238 event.domCode = static_cast<int>(
204 ui::KeycodeConverter::CodeStringToDomCode(*code)); 239 ui::KeycodeConverter::CodeStringToDomCode(code.fromJust()));
205 } 240 }
206 241
207 if (key) { 242 if (key.isJust()) {
208 event.domKey = static_cast<int>( 243 event.domKey = static_cast<int>(
209 ui::KeycodeConverter::KeyStringToDomKey(*key)); 244 ui::KeycodeConverter::KeyStringToDomKey(key.fromJust()));
210 } 245 }
211 246
212 if (!host_) 247 if (!host_ || !host_->GetRenderWidgetHost())
213 return Response::ServerError("Could not connect to view"); 248 return Response::InternalError();
214 249
215 host_->Focus(); 250 host_->GetRenderWidgetHost()->Focus();
216 host_->ForwardKeyboardEvent(event); 251 host_->GetRenderWidgetHost()->ForwardKeyboardEvent(event);
217 return Response::OK(); 252 return Response::OK();
218 } 253 }
219 254
220 Response InputHandler::DispatchMouseEvent( 255 Response InputHandler::DispatchMouseEvent(
221 const std::string& type, 256 const std::string& type,
222 int x, 257 int x,
223 int y, 258 int y,
224 const int* modifiers, 259 Maybe<int> modifiers,
225 const double* timestamp, 260 Maybe<double> timestamp,
226 const std::string* button, 261 Maybe<std::string> button,
227 const int* click_count) { 262 Maybe<int> click_count) {
228 blink::WebMouseEvent event; 263 blink::WebMouseEvent event;
229 264
230 if (!SetMouseEventType(&event, type)) { 265 if (!SetMouseEventType(&event, type)) {
231 return Response::InvalidParams( 266 return Response::InvalidParams(
232 base::StringPrintf("Unexpected event type '%s'", type.c_str())); 267 base::StringPrintf("Unexpected event type '%s'", type.c_str()));
233 } 268 }
234 SetEventModifiers(&event, modifiers); 269 SetEventModifiers(&event, modifiers.fromMaybe(0));
235 SetEventTimestamp(&event, timestamp); 270 SetEventTimestamp(&event, std::move(timestamp));
236 if (!SetMouseEventButton(&event, button)) 271 if (!SetMouseEventButton(&event, button.fromMaybe("")))
237 return Response::InvalidParams("Invalid mouse button"); 272 return Response::InvalidParams("Invalid mouse button");
238 273
239 event.x = x * page_scale_factor_; 274 event.x = x * page_scale_factor_;
240 event.y = y * page_scale_factor_; 275 event.y = y * page_scale_factor_;
241 event.windowX = x * page_scale_factor_; 276 event.windowX = x * page_scale_factor_;
242 event.windowY = y * page_scale_factor_; 277 event.windowY = y * page_scale_factor_;
243 event.globalX = x * page_scale_factor_; 278 event.globalX = x * page_scale_factor_;
244 event.globalY = y * page_scale_factor_; 279 event.globalY = y * page_scale_factor_;
245 event.clickCount = click_count ? *click_count : 0; 280 event.clickCount = click_count.fromMaybe(0);
246 event.pointerType = blink::WebPointerProperties::PointerType::Mouse; 281 event.pointerType = blink::WebPointerProperties::PointerType::Mouse;
247 282
248 if (!host_) 283 if (!host_ || !host_->GetRenderWidgetHost())
249 return Response::ServerError("Could not connect to view"); 284 return Response::InternalError();
250 285
251 host_->Focus(); 286 host_->GetRenderWidgetHost()->Focus();
252 host_->ForwardMouseEvent(event); 287 host_->GetRenderWidgetHost()->ForwardMouseEvent(event);
253 return Response::OK(); 288 return Response::OK();
254 } 289 }
255 290
256 Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type, 291 Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type,
257 int x, 292 int x,
258 int y, 293 int y,
259 double timestamp, 294 double timestamp,
260 const std::string& button, 295 const std::string& button,
261 double* delta_x, 296 Maybe<double> delta_x,
262 double* delta_y, 297 Maybe<double> delta_y,
263 int* modifiers, 298 Maybe<int> modifiers,
264 int* click_count) { 299 Maybe<int> click_count) {
265 blink::WebMouseWheelEvent wheel_event; 300 blink::WebMouseWheelEvent wheel_event;
266 blink::WebMouseEvent mouse_event; 301 blink::WebMouseEvent mouse_event;
267 blink::WebMouseEvent* event = &mouse_event; 302 blink::WebMouseEvent* event = &mouse_event;
268 303
269 if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) { 304 if (type == Input::EmulateTouchFromMouseEvent::TypeEnum::MouseWheel) {
270 if (!delta_x || !delta_y) { 305 if (!delta_x.isJust() || !delta_y.isJust()) {
271 return Response::InvalidParams( 306 return Response::InvalidParams(
272 "'deltaX' and 'deltaY' are expected for mouseWheel event"); 307 "'deltaX' and 'deltaY' are expected for mouseWheel event");
273 } 308 }
274 wheel_event.deltaX = static_cast<float>(*delta_x); 309 wheel_event.deltaX = static_cast<float>(delta_x.fromJust());
275 wheel_event.deltaY = static_cast<float>(*delta_y); 310 wheel_event.deltaY = static_cast<float>(delta_y.fromJust());
276 event = &wheel_event; 311 event = &wheel_event;
277 event->type = blink::WebInputEvent::MouseWheel; 312 event->type = blink::WebInputEvent::MouseWheel;
278 } else if (!SetMouseEventType(event, type)) { 313 } else if (!SetMouseEventType(event, type)) {
279 return Response::InvalidParams( 314 return Response::InvalidParams(
280 base::StringPrintf("Unexpected event type '%s'", type.c_str())); 315 base::StringPrintf("Unexpected event type '%s'", type.c_str()));
281 } 316 }
282 317
283 SetEventModifiers(event, modifiers); 318 SetEventModifiers(event, modifiers.fromMaybe(0));
284 SetEventTimestamp(event, &timestamp); 319 SetEventTimestamp(event, Maybe<double>(timestamp));
285 if (!SetMouseEventButton(event, &button)) 320 if (!SetMouseEventButton(event, button))
286 return Response::InvalidParams("Invalid mouse button"); 321 return Response::InvalidParams("Invalid mouse button");
287 322
288 event->x = x; 323 event->x = x;
289 event->y = y; 324 event->y = y;
290 event->windowX = x; 325 event->windowX = x;
291 event->windowY = y; 326 event->windowY = y;
292 event->globalX = x; 327 event->globalX = x;
293 event->globalY = y; 328 event->globalY = y;
294 event->clickCount = click_count ? *click_count : 0; 329 event->clickCount = click_count.fromMaybe(0);
295 event->pointerType = blink::WebPointerProperties::PointerType::Touch; 330 event->pointerType = blink::WebPointerProperties::PointerType::Touch;
296 331
297 if (!host_) 332 if (!host_ || !host_->GetRenderWidgetHost())
298 return Response::ServerError("Could not connect to view"); 333 return Response::InternalError();
299 334
300 if (event->type == blink::WebInputEvent::MouseWheel) 335 if (event->type == blink::WebInputEvent::MouseWheel)
301 host_->ForwardWheelEvent(wheel_event); 336 host_->GetRenderWidgetHost()->ForwardWheelEvent(wheel_event);
302 else 337 else
303 host_->ForwardMouseEvent(mouse_event); 338 host_->GetRenderWidgetHost()->ForwardMouseEvent(mouse_event);
304 return Response::OK(); 339 return Response::OK();
305 } 340 }
306 341
307 Response InputHandler::SynthesizePinchGesture( 342 void InputHandler::SynthesizePinchGesture(
308 DevToolsCommandId command_id,
309 int x, 343 int x,
310 int y, 344 int y,
311 double scale_factor, 345 double scale_factor,
312 const int* relative_speed, 346 Maybe<int> relative_speed,
313 const std::string* gesture_source_type) { 347 Maybe<std::string> gesture_source_type,
314 if (!host_) 348 std::unique_ptr<SynthesizePinchGestureCallback> callback) {
315 return Response::ServerError("Could not connect to view"); 349 if (!host_ || !host_->GetRenderWidgetHost()) {
350 callback->sendFailure(Response::InternalError());
351 return;
352 }
316 353
317 SyntheticPinchGestureParams gesture_params; 354 SyntheticPinchGestureParams gesture_params;
318 const int kDefaultRelativeSpeed = 800; 355 const int kDefaultRelativeSpeed = 800;
319 356
320 gesture_params.scale_factor = scale_factor; 357 gesture_params.scale_factor = scale_factor;
321 gesture_params.anchor = CssPixelsToPointF(x, y, page_scale_factor_); 358 gesture_params.anchor = CssPixelsToPointF(x, y, page_scale_factor_);
322 gesture_params.relative_pointer_speed_in_pixels_s = 359 gesture_params.relative_pointer_speed_in_pixels_s =
323 relative_speed ? *relative_speed : kDefaultRelativeSpeed; 360 relative_speed.fromMaybe(kDefaultRelativeSpeed);
324 361
325 if (!StringToGestureSourceType( 362 if (!StringToGestureSourceType(
326 gesture_source_type ? *gesture_source_type : kGestureSourceTypeDefault, 363 std::move(gesture_source_type),
327 gesture_params.gesture_source_type)) { 364 gesture_params.gesture_source_type)) {
328 return Response::InvalidParams("gestureSourceType"); 365 callback->sendFailure(
366 Response::InvalidParams("Unknown gestureSourceType"));
367 return;
329 } 368 }
330 369
331 host_->QueueSyntheticGesture( 370 host_->GetRenderWidgetHost()->QueueSyntheticGesture(
332 SyntheticGesture::Create(gesture_params), 371 SyntheticGesture::Create(gesture_params),
333 base::Bind(&InputHandler::SendSynthesizePinchGestureResponse, 372 base::Bind(&SendSynthesizePinchGestureResponse,
334 weak_factory_.GetWeakPtr(), command_id)); 373 base::Passed(std::move(callback))));
335
336 return Response::OK();
337 } 374 }
338 375
339 Response InputHandler::SynthesizeScrollGesture( 376 void InputHandler::SynthesizeScrollGesture(
340 DevToolsCommandId command_id,
341 int x, 377 int x,
342 int y, 378 int y,
343 const int* x_distance, 379 Maybe<int> x_distance,
344 const int* y_distance, 380 Maybe<int> y_distance,
345 const int* x_overscroll, 381 Maybe<int> x_overscroll,
346 const int* y_overscroll, 382 Maybe<int> y_overscroll,
347 const bool* prevent_fling, 383 Maybe<bool> prevent_fling,
348 const int* speed, 384 Maybe<int> speed,
349 const std::string* gesture_source_type, 385 Maybe<std::string> gesture_source_type,
350 const int* repeat_count, 386 Maybe<int> repeat_count,
351 const int* repeat_delay_ms, 387 Maybe<int> repeat_delay_ms,
352 const std::string* interaction_marker_name) { 388 Maybe<std::string> interaction_marker_name,
353 if (!host_) 389 std::unique_ptr<SynthesizeScrollGestureCallback> callback) {
354 return Response::ServerError("Could not connect to view"); 390 if (!host_ || !host_->GetRenderWidgetHost()) {
391 callback->sendFailure(Response::InternalError());
392 return;
393 }
355 394
356 SyntheticSmoothScrollGestureParams gesture_params; 395 SyntheticSmoothScrollGestureParams gesture_params;
357 const bool kDefaultPreventFling = true; 396 const bool kDefaultPreventFling = true;
358 const int kDefaultSpeed = 800; 397 const int kDefaultSpeed = 800;
359 398
360 gesture_params.anchor = CssPixelsToPointF(x, y, page_scale_factor_); 399 gesture_params.anchor = CssPixelsToPointF(x, y, page_scale_factor_);
361 gesture_params.prevent_fling = 400 gesture_params.prevent_fling =
362 prevent_fling ? *prevent_fling : kDefaultPreventFling; 401 prevent_fling.fromMaybe(kDefaultPreventFling);
363 gesture_params.speed_in_pixels_s = speed ? *speed : kDefaultSpeed; 402 gesture_params.speed_in_pixels_s = speed.fromMaybe(kDefaultSpeed);
364 403
365 if (x_distance || y_distance) { 404 if (x_distance.fromJust() || y_distance.fromJust()) {
366 gesture_params.distances.push_back( 405 gesture_params.distances.push_back(
367 CssPixelsToVector2dF(x_distance ? *x_distance : 0, 406 CssPixelsToVector2dF(x_distance.fromMaybe(0),
368 y_distance ? *y_distance : 0, page_scale_factor_)); 407 y_distance.fromMaybe(0), page_scale_factor_));
369 } 408 }
370 409
371 if (x_overscroll || y_overscroll) { 410 if (x_overscroll.isJust() || y_overscroll.isJust()) {
372 gesture_params.distances.push_back(CssPixelsToVector2dF( 411 gesture_params.distances.push_back(CssPixelsToVector2dF(
373 x_overscroll ? -*x_overscroll : 0, y_overscroll ? -*y_overscroll : 0, 412 -x_overscroll.fromMaybe(0), -y_overscroll.fromMaybe(0),
374 page_scale_factor_)); 413 page_scale_factor_));
375 } 414 }
376 415
377 if (!StringToGestureSourceType( 416 if (!StringToGestureSourceType(
378 gesture_source_type ? *gesture_source_type : kGestureSourceTypeDefault, 417 std::move(gesture_source_type),
379 gesture_params.gesture_source_type)) { 418 gesture_params.gesture_source_type)) {
380 return Response::InvalidParams("gestureSourceType"); 419 callback->sendFailure(
420 Response::InvalidParams("Unknown gestureSourceType"));
421 return;
381 } 422 }
382 423
383 SynthesizeRepeatingScroll( 424 SynthesizeRepeatingScroll(
384 gesture_params, repeat_count ? *repeat_count : 0, 425 gesture_params, repeat_count.fromMaybe(0),
385 base::TimeDelta::FromMilliseconds(repeat_delay_ms ? *repeat_delay_ms 426 base::TimeDelta::FromMilliseconds(repeat_delay_ms.fromMaybe(250)),
386 : 250), 427 interaction_marker_name.fromMaybe(""), ++last_id_, std::move(callback));
387 interaction_marker_name ? *interaction_marker_name : "", command_id);
388
389 return Response::OK();
390 } 428 }
391 429
392 void InputHandler::SynthesizeRepeatingScroll( 430 void InputHandler::SynthesizeRepeatingScroll(
393 SyntheticSmoothScrollGestureParams gesture_params, 431 SyntheticSmoothScrollGestureParams gesture_params,
394 int repeat_count, 432 int repeat_count,
395 base::TimeDelta repeat_delay, 433 base::TimeDelta repeat_delay,
396 std::string interaction_marker_name, 434 std::string interaction_marker_name,
397 DevToolsCommandId command_id) { 435 int id,
436 std::unique_ptr<SynthesizeScrollGestureCallback> callback) {
398 if (!interaction_marker_name.empty()) { 437 if (!interaction_marker_name.empty()) {
399 // TODO(alexclarke): Can we move this elsewhere? It doesn't really fit here. 438 // TODO(alexclarke): Can we move this elsewhere? It doesn't really fit here.
400 TRACE_EVENT_COPY_ASYNC_BEGIN0("benchmark", interaction_marker_name.c_str(), 439 TRACE_EVENT_COPY_ASYNC_BEGIN0("benchmark", interaction_marker_name.c_str(),
401 command_id.call_id); 440 id);
402 } 441 }
403 442
404 host_->QueueSyntheticGesture( 443 host_->GetRenderWidgetHost()->QueueSyntheticGesture(
405 SyntheticGesture::Create(gesture_params), 444 SyntheticGesture::Create(gesture_params),
406 base::Bind(&InputHandler::OnScrollFinished, weak_factory_.GetWeakPtr(), 445 base::Bind(&InputHandler::OnScrollFinished, weak_factory_.GetWeakPtr(),
407 gesture_params, repeat_count, repeat_delay, 446 gesture_params, repeat_count, repeat_delay,
408 interaction_marker_name, command_id)); 447 interaction_marker_name, id,
448 base::Passed(std::move(callback))));
409 } 449 }
410 450
411 void InputHandler::OnScrollFinished( 451 void InputHandler::OnScrollFinished(
412 SyntheticSmoothScrollGestureParams gesture_params, 452 SyntheticSmoothScrollGestureParams gesture_params,
413 int repeat_count, 453 int repeat_count,
414 base::TimeDelta repeat_delay, 454 base::TimeDelta repeat_delay,
415 std::string interaction_marker_name, 455 std::string interaction_marker_name,
416 DevToolsCommandId command_id, 456 int id,
457 std::unique_ptr<SynthesizeScrollGestureCallback> callback,
417 SyntheticGesture::Result result) { 458 SyntheticGesture::Result result) {
418 if (!interaction_marker_name.empty()) { 459 if (!interaction_marker_name.empty()) {
419 TRACE_EVENT_COPY_ASYNC_END0("benchmark", interaction_marker_name.c_str(), 460 TRACE_EVENT_COPY_ASYNC_END0("benchmark", interaction_marker_name.c_str(),
420 command_id.call_id); 461 id);
421 } 462 }
422 463
423 if (repeat_count > 0) { 464 if (repeat_count > 0) {
424 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 465 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
425 FROM_HERE, 466 FROM_HERE,
426 base::Bind(&InputHandler::SynthesizeRepeatingScroll, 467 base::Bind(&InputHandler::SynthesizeRepeatingScroll,
427 weak_factory_.GetWeakPtr(), gesture_params, repeat_count - 1, 468 weak_factory_.GetWeakPtr(), gesture_params, repeat_count - 1,
428 repeat_delay, interaction_marker_name, command_id), 469 repeat_delay, interaction_marker_name, id,
470 base::Passed(std::move(callback))),
429 repeat_delay); 471 repeat_delay);
430 } else { 472 } else {
431 SendSynthesizeScrollGestureResponse(command_id, result); 473 SendSynthesizeScrollGestureResponse(std::move(callback), result);
432 } 474 }
433 } 475 }
434 476
435 Response InputHandler::SynthesizeTapGesture( 477 void InputHandler::SynthesizeTapGesture(
436 DevToolsCommandId command_id,
437 int x, 478 int x,
438 int y, 479 int y,
439 const int* duration, 480 Maybe<int> duration,
440 const int* tap_count, 481 Maybe<int> tap_count,
441 const std::string* gesture_source_type) { 482 Maybe<std::string> gesture_source_type,
442 if (!host_) 483 std::unique_ptr<SynthesizeTapGestureCallback> callback) {
443 return Response::ServerError("Could not connect to view"); 484 if (!host_ || !host_->GetRenderWidgetHost()) {
485 callback->sendFailure(Response::InternalError());
486 return;
487 }
444 488
445 SyntheticTapGestureParams gesture_params; 489 SyntheticTapGestureParams gesture_params;
446 const int kDefaultDuration = 50; 490 const int kDefaultDuration = 50;
447 const int kDefaultTapCount = 1; 491 const int kDefaultTapCount = 1;
448 492
449 gesture_params.position = CssPixelsToPointF(x, y, page_scale_factor_); 493 gesture_params.position = CssPixelsToPointF(x, y, page_scale_factor_);
450 gesture_params.duration_ms = duration ? *duration : kDefaultDuration; 494 gesture_params.duration_ms = duration.fromMaybe(kDefaultDuration);
451 495
452 if (!StringToGestureSourceType( 496 if (!StringToGestureSourceType(
453 gesture_source_type ? *gesture_source_type : kGestureSourceTypeDefault, 497 std::move(gesture_source_type),
caseq 2016/12/14 18:18:18 weird indent.
dgozman 2016/12/15 04:20:08 Done.
454 gesture_params.gesture_source_type)) { 498 gesture_params.gesture_source_type)) {
455 return Response::InvalidParams("gestureSourceType"); 499 callback->sendFailure(
500 Response::InvalidParams("Unknown gestureSourceType"));
501 return;
456 } 502 }
457 503
458 if (!tap_count) 504 int count = tap_count.fromMaybe(kDefaultTapCount);
459 tap_count = &kDefaultTapCount; 505 for (int i = 0; i < count; i++) {
460
461 for (int i = 0; i < *tap_count; i++) {
462 // If we're doing more than one tap, don't send the response to the client 506 // If we're doing more than one tap, don't send the response to the client
463 // until we've completed the last tap. 507 // until we've completed the last tap.
464 bool is_last_tap = i == *tap_count - 1; 508 bool is_last_tap = i == count - 1;
465 host_->QueueSyntheticGesture( 509 host_->GetRenderWidgetHost()->QueueSyntheticGesture(
466 SyntheticGesture::Create(gesture_params), 510 SyntheticGesture::Create(gesture_params),
467 base::Bind(&InputHandler::SendSynthesizeTapGestureResponse, 511 base::Bind(&SendSynthesizeTapGestureResponse,
468 weak_factory_.GetWeakPtr(), command_id, is_last_tap)); 512 base::Passed(std::move(callback)), is_last_tap));
caseq 2016/12/14 18:18:18 This will not have the result you expect. Do we ha
dgozman 2016/12/15 04:20:08 I guess the only tests we have for this are teleme
469 }
470
471 return Response::OK();
472 }
473
474 Response InputHandler::DispatchTouchEvent(
475 const std::string& type,
476 const std::vector<std::unique_ptr<base::DictionaryValue>>& touch_points,
477 const int* modifiers,
478 const double* timestamp) {
479 return Response::FallThrough();
480 }
481
482 void InputHandler::SendSynthesizePinchGestureResponse(
483 DevToolsCommandId command_id,
484 SyntheticGesture::Result result) {
485 if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
486 client_->SendSynthesizePinchGestureResponse(
487 command_id, SynthesizePinchGestureResponse::Create());
488 } else {
489 client_->SendError(command_id,
490 Response::InternalError(base::StringPrintf(
491 "Synthetic pinch failed, result was %d", result)));
492 } 513 }
493 } 514 }
494 515
495 void InputHandler::SendSynthesizeScrollGestureResponse( 516 } // namespace protocol
496 DevToolsCommandId command_id,
497 SyntheticGesture::Result result) {
498 if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
499 client_->SendSynthesizeScrollGestureResponse(
500 command_id, SynthesizeScrollGestureResponse::Create());
501 } else {
502 client_->SendError(command_id,
503 Response::InternalError(base::StringPrintf(
504 "Synthetic scroll failed, result was %d", result)));
505 }
506 }
507
508 void InputHandler::SendSynthesizeTapGestureResponse(
509 DevToolsCommandId command_id,
510 bool send_success,
511 SyntheticGesture::Result result) {
512 if (result == SyntheticGesture::Result::GESTURE_FINISHED) {
513 if (send_success) {
514 client_->SendSynthesizeTapGestureResponse(
515 command_id, SynthesizeTapGestureResponse::Create());
516 }
517 } else {
518 client_->SendError(command_id,
519 Response::InternalError(base::StringPrintf(
520 "Synthetic tap failed, result was %d", result)));
521 }
522 }
523
524 } // namespace input
525 } // namespace devtools
526 } // namespace content 517 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698