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

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

Issue 2569273002: Add constructors to WebInputEvents and setters so we can work at cleaning up these public structs. (Closed)
Patch Set: Fix mouse up event sender not modifying modifiers 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"
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 return false; 48 return false;
49 } 49 }
50 } 50 }
51 51
52 } 52 }
53 53
54 typedef DevToolsProtocolClient::Response Response; 54 typedef DevToolsProtocolClient::Response Response;
55 55
56 namespace { 56 namespace {
57 57
58 void SetEventModifiers(blink::WebInputEvent* event, const int* modifiers) { 58 int GetEventModifiers(const int* modifiers,
59 if (!modifiers) 59 const bool* auto_repeat,
60 return; 60 const bool* is_keypad) {
61 if (*modifiers & 1) 61 int result = 0;
62 event->modifiers |= blink::WebInputEvent::AltKey; 62 if (auto_repeat && *auto_repeat)
63 if (*modifiers & 2) 63 result |= blink::WebInputEvent::IsAutoRepeat;
64 event->modifiers |= blink::WebInputEvent::ControlKey; 64 if (is_keypad && *is_keypad)
65 if (*modifiers & 4) 65 result |= blink::WebInputEvent::IsKeyPad;
66 event->modifiers |= blink::WebInputEvent::MetaKey; 66
67 if (*modifiers & 8) 67 if (modifiers) {
68 event->modifiers |= blink::WebInputEvent::ShiftKey; 68 if (*modifiers & 1)
69 result |= blink::WebInputEvent::AltKey;
70 if (*modifiers & 2)
71 result |= blink::WebInputEvent::ControlKey;
72 if (*modifiers & 4)
73 result |= blink::WebInputEvent::MetaKey;
74 if (*modifiers & 8)
75 result |= blink::WebInputEvent::ShiftKey;
76 }
77 return result;
69 } 78 }
70 79
71 void SetEventTimestamp(blink::WebInputEvent* event, const double* timestamp) { 80 base::TimeTicks GetEventTimeTicks(const double* timestamp) {
72 // Convert timestamp, in seconds since unix epoch, to an event timestamp 81 // Convert timestamp, in seconds since unix epoch, to an event timestamp
73 // which is time ticks since platform start time. 82 // which is time ticks since platform start time.
74 base::TimeTicks ticks = timestamp 83 return timestamp
75 ? base::TimeDelta::FromSecondsD(*timestamp) + 84 ? base::TimeDelta::FromSecondsD(*timestamp) +
76 base::TimeTicks::UnixEpoch() 85 base::TimeTicks::UnixEpoch()
77 : base::TimeTicks::Now(); 86 : base::TimeTicks::Now();
78 event->timeStampSeconds = (ticks - base::TimeTicks()).InSecondsF(); 87 }
88
89 double GetEventTimestamp(const double* timestamp) {
90 return (GetEventTimeTicks(timestamp) - base::TimeTicks()).InSecondsF();
79 } 91 }
80 92
81 bool SetKeyboardEventText(blink::WebUChar* to, const std::string* from) { 93 bool SetKeyboardEventText(blink::WebUChar* to, const std::string* from) {
82 if (!from) 94 if (!from)
83 return true; 95 return true;
84 96
85 base::string16 text16 = base::UTF8ToUTF16(*from); 97 base::string16 text16 = base::UTF8ToUTF16(*from);
86 if (text16.size() > blink::WebKeyboardEvent::textLengthCap) 98 if (text16.size() > blink::WebKeyboardEvent::textLengthCap)
87 return false; 99 return false;
88 100
89 for (size_t i = 0; i < text16.size(); ++i) 101 for (size_t i = 0; i < text16.size(); ++i)
90 to[i] = text16[i]; 102 to[i] = text16[i];
91 return true; 103 return true;
92 } 104 }
93 105
94 bool SetMouseEventButton(blink::WebMouseEvent* event, 106 bool GetMouseEventButton(const std::string* button,
95 const std::string* button) { 107 blink::WebPointerProperties::Button* event_button,
108 int* event_modifiers) {
96 if (!button) 109 if (!button)
97 return true; 110 return true;
98 111
99 if (*button == dispatch_mouse_event::kButtonNone) { 112 if (*button == dispatch_mouse_event::kButtonNone) {
100 event->button = blink::WebMouseEvent::Button::NoButton; 113 *event_button = blink::WebMouseEvent::Button::NoButton;
101 } else if (*button == dispatch_mouse_event::kButtonLeft) { 114 } else if (*button == dispatch_mouse_event::kButtonLeft) {
102 event->button = blink::WebMouseEvent::Button::Left; 115 *event_button = blink::WebMouseEvent::Button::Left;
103 event->modifiers |= blink::WebInputEvent::LeftButtonDown; 116 *event_modifiers = blink::WebInputEvent::LeftButtonDown;
104 } else if (*button == dispatch_mouse_event::kButtonMiddle) { 117 } else if (*button == dispatch_mouse_event::kButtonMiddle) {
105 event->button = blink::WebMouseEvent::Button::Middle; 118 *event_button = blink::WebMouseEvent::Button::Middle;
106 event->modifiers |= blink::WebInputEvent::MiddleButtonDown; 119 *event_modifiers = blink::WebInputEvent::MiddleButtonDown;
107 } else if (*button == dispatch_mouse_event::kButtonRight) { 120 } else if (*button == dispatch_mouse_event::kButtonRight) {
108 event->button = blink::WebMouseEvent::Button::Right; 121 *event_button = blink::WebMouseEvent::Button::Right;
109 event->modifiers |= blink::WebInputEvent::RightButtonDown; 122 *event_modifiers = blink::WebInputEvent::RightButtonDown;
110 } else { 123 } else {
111 return false; 124 return false;
112 } 125 }
113 return true; 126 return true;
114 } 127 }
115 128
116 bool SetMouseEventType(blink::WebMouseEvent* event, const std::string& type) { 129 blink::WebInputEvent::Type GetMouseEventType(const std::string& type) {
117 if (type == dispatch_mouse_event::kTypeMousePressed) { 130 if (type == dispatch_mouse_event::kTypeMousePressed)
118 event->type = blink::WebInputEvent::MouseDown; 131 return blink::WebInputEvent::MouseDown;
119 } else if (type == dispatch_mouse_event::kTypeMouseReleased) { 132 if (type == dispatch_mouse_event::kTypeMouseReleased)
120 event->type = blink::WebInputEvent::MouseUp; 133 return blink::WebInputEvent::MouseUp;
121 } else if (type == dispatch_mouse_event::kTypeMouseMoved) { 134 if (type == dispatch_mouse_event::kTypeMouseMoved)
122 event->type = blink::WebInputEvent::MouseMove; 135 return blink::WebInputEvent::MouseMove;
123 } else { 136 return blink::WebInputEvent::Undefined;
124 return false;
125 }
126 return true;
127 } 137 }
128 138
129 } // namespace 139 } // namespace
130 140
131 InputHandler::InputHandler() 141 InputHandler::InputHandler()
132 : host_(NULL), 142 : host_(NULL),
133 page_scale_factor_(1.0), 143 page_scale_factor_(1.0),
134 weak_factory_(this) { 144 weak_factory_(this) {
135 } 145 }
136 146
(...skipping 21 matching lines...) Expand all
158 const std::string* text, 168 const std::string* text,
159 const std::string* unmodified_text, 169 const std::string* unmodified_text,
160 const std::string* key_identifier, 170 const std::string* key_identifier,
161 const std::string* code, 171 const std::string* code,
162 const std::string* key, 172 const std::string* key,
163 const int* windows_virtual_key_code, 173 const int* windows_virtual_key_code,
164 const int* native_virtual_key_code, 174 const int* native_virtual_key_code,
165 const bool* auto_repeat, 175 const bool* auto_repeat,
166 const bool* is_keypad, 176 const bool* is_keypad,
167 const bool* is_system_key) { 177 const bool* is_system_key) {
168 NativeWebKeyboardEvent event; 178 blink::WebInputEvent::Type web_event_type = blink::WebInputEvent::Undefined;
169 event.skip_in_browser = true;
170
171 if (type == dispatch_key_event::kTypeKeyDown) { 179 if (type == dispatch_key_event::kTypeKeyDown) {
172 event.type = blink::WebInputEvent::KeyDown; 180 web_event_type = blink::WebInputEvent::KeyDown;
173 } else if (type == dispatch_key_event::kTypeKeyUp) { 181 } else if (type == dispatch_key_event::kTypeKeyUp) {
174 event.type = blink::WebInputEvent::KeyUp; 182 web_event_type = blink::WebInputEvent::KeyUp;
175 } else if (type == dispatch_key_event::kTypeChar) { 183 } else if (type == dispatch_key_event::kTypeChar) {
176 event.type = blink::WebInputEvent::Char; 184 web_event_type = blink::WebInputEvent::Char;
177 } else if (type == dispatch_key_event::kTypeRawKeyDown) { 185 } else if (type == dispatch_key_event::kTypeRawKeyDown) {
178 event.type = blink::WebInputEvent::RawKeyDown; 186 web_event_type = blink::WebInputEvent::RawKeyDown;
179 } else { 187 } else {
180 return Response::InvalidParams( 188 return Response::InvalidParams(
181 base::StringPrintf("Unexpected event type '%s'", type.c_str())); 189 base::StringPrintf("Unexpected event type '%s'", type.c_str()));
182 } 190 }
183 191
184 SetEventModifiers(&event, modifiers); 192 NativeWebKeyboardEvent event(
185 SetEventTimestamp(&event, timestamp); 193 web_event_type, GetEventModifiers(modifiers, auto_repeat, is_keypad),
194 GetEventTimeTicks(timestamp));
195 event.skip_in_browser = true;
186 if (!SetKeyboardEventText(event.text, text)) 196 if (!SetKeyboardEventText(event.text, text))
187 return Response::InvalidParams("Invalid 'text' parameter"); 197 return Response::InvalidParams("Invalid 'text' parameter");
188 if (!SetKeyboardEventText(event.unmodifiedText, unmodified_text)) 198 if (!SetKeyboardEventText(event.unmodifiedText, unmodified_text))
189 return Response::InvalidParams("Invalid 'unmodifiedText' parameter"); 199 return Response::InvalidParams("Invalid 'unmodifiedText' parameter");
190 200
191 if (windows_virtual_key_code) 201 if (windows_virtual_key_code)
192 event.windowsKeyCode = *windows_virtual_key_code; 202 event.windowsKeyCode = *windows_virtual_key_code;
193 if (native_virtual_key_code) 203 if (native_virtual_key_code)
194 event.nativeKeyCode = *native_virtual_key_code; 204 event.nativeKeyCode = *native_virtual_key_code;
195 if (auto_repeat && *auto_repeat)
196 event.modifiers |= blink::WebInputEvent::IsAutoRepeat;
197 if (is_keypad && *is_keypad)
198 event.modifiers |= blink::WebInputEvent::IsKeyPad;
199 if (is_system_key) 205 if (is_system_key)
200 event.isSystemKey = *is_system_key; 206 event.isSystemKey = *is_system_key;
201 207
202 if (code) { 208 if (code) {
203 event.domCode = static_cast<int>( 209 event.domCode = static_cast<int>(
204 ui::KeycodeConverter::CodeStringToDomCode(*code)); 210 ui::KeycodeConverter::CodeStringToDomCode(*code));
205 } 211 }
206 212
207 if (key) { 213 if (key) {
208 event.domKey = static_cast<int>( 214 event.domKey = static_cast<int>(
209 ui::KeycodeConverter::KeyStringToDomKey(*key)); 215 ui::KeycodeConverter::KeyStringToDomKey(*key));
210 } 216 }
211 217
212 if (!host_) 218 if (!host_)
213 return Response::ServerError("Could not connect to view"); 219 return Response::ServerError("Could not connect to view");
214 220
215 host_->Focus(); 221 host_->Focus();
216 host_->ForwardKeyboardEvent(event); 222 host_->ForwardKeyboardEvent(event);
217 return Response::OK(); 223 return Response::OK();
218 } 224 }
219 225
220 Response InputHandler::DispatchMouseEvent( 226 Response InputHandler::DispatchMouseEvent(
221 const std::string& type, 227 const std::string& type,
222 int x, 228 int x,
223 int y, 229 int y,
224 const int* modifiers, 230 const int* modifiers,
225 const double* timestamp, 231 const double* timestamp,
226 const std::string* button, 232 const std::string* button,
227 const int* click_count) { 233 const int* click_count) {
228 blink::WebMouseEvent event; 234 blink::WebInputEvent::Type event_type = GetMouseEventType(type);
229 235 if (event_type == blink::WebInputEvent::Undefined) {
230 if (!SetMouseEventType(&event, type)) {
231 return Response::InvalidParams( 236 return Response::InvalidParams(
232 base::StringPrintf("Unexpected event type '%s'", type.c_str())); 237 base::StringPrintf("Unexpected event type '%s'", type.c_str()));
233 } 238 }
234 SetEventModifiers(&event, modifiers); 239 blink::WebPointerProperties::Button event_button =
235 SetEventTimestamp(&event, timestamp); 240 blink::WebPointerProperties::Button::NoButton;
236 if (!SetMouseEventButton(&event, button)) 241 int button_modifiers = 0;
242 if (!GetMouseEventButton(button, &event_button, &button_modifiers))
237 return Response::InvalidParams("Invalid mouse button"); 243 return Response::InvalidParams("Invalid mouse button");
238 244
245 blink::WebMouseEvent event(
246 event_type,
247 GetEventModifiers(modifiers, nullptr, nullptr) | button_modifiers,
248 GetEventTimestamp(timestamp));
249
250 event.button = event_button;
239 event.x = x * page_scale_factor_; 251 event.x = x * page_scale_factor_;
240 event.y = y * page_scale_factor_; 252 event.y = y * page_scale_factor_;
241 event.windowX = x * page_scale_factor_; 253 event.windowX = x * page_scale_factor_;
242 event.windowY = y * page_scale_factor_; 254 event.windowY = y * page_scale_factor_;
243 event.globalX = x * page_scale_factor_; 255 event.globalX = x * page_scale_factor_;
244 event.globalY = y * page_scale_factor_; 256 event.globalY = y * page_scale_factor_;
245 event.clickCount = click_count ? *click_count : 0; 257 event.clickCount = click_count ? *click_count : 0;
246 event.pointerType = blink::WebPointerProperties::PointerType::Mouse; 258 event.pointerType = blink::WebPointerProperties::PointerType::Mouse;
247 259
248 if (!host_) 260 if (!host_)
249 return Response::ServerError("Could not connect to view"); 261 return Response::ServerError("Could not connect to view");
250 262
251 host_->Focus(); 263 host_->Focus();
252 host_->ForwardMouseEvent(event); 264 host_->ForwardMouseEvent(event);
253 return Response::OK(); 265 return Response::OK();
254 } 266 }
255 267
256 Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type, 268 Response InputHandler::EmulateTouchFromMouseEvent(const std::string& type,
257 int x, 269 int x,
258 int y, 270 int y,
259 double timestamp, 271 double timestamp,
260 const std::string& button, 272 const std::string& button,
261 double* delta_x, 273 double* delta_x,
262 double* delta_y, 274 double* delta_y,
263 int* modifiers, 275 int* modifiers,
264 int* click_count) { 276 int* click_count) {
265 blink::WebMouseWheelEvent wheel_event; 277 blink::WebInputEvent::Type event_type;
266 blink::WebMouseEvent mouse_event;
267 blink::WebMouseEvent* event = &mouse_event;
268
269 if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) { 278 if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) {
279 event_type = blink::WebInputEvent::MouseWheel;
270 if (!delta_x || !delta_y) { 280 if (!delta_x || !delta_y) {
271 return Response::InvalidParams( 281 return Response::InvalidParams(
272 "'deltaX' and 'deltaY' are expected for mouseWheel event"); 282 "'deltaX' and 'deltaY' are expected for mouseWheel event");
273 } 283 }
274 wheel_event.deltaX = static_cast<float>(*delta_x); 284 } else {
275 wheel_event.deltaY = static_cast<float>(*delta_y); 285 event_type = GetMouseEventType(type);
276 event = &wheel_event; 286 if (event_type == blink::WebInputEvent::Undefined) {
277 event->type = blink::WebInputEvent::MouseWheel; 287 return Response::InvalidParams(
278 } else if (!SetMouseEventType(event, type)) { 288 base::StringPrintf("Unexpected event type '%s'", type.c_str()));
279 return Response::InvalidParams( 289 }
280 base::StringPrintf("Unexpected event type '%s'", type.c_str()));
281 } 290 }
282 291
283 SetEventModifiers(event, modifiers); 292 blink::WebPointerProperties::Button event_button =
284 SetEventTimestamp(event, &timestamp); 293 blink::WebPointerProperties::Button::NoButton;
285 if (!SetMouseEventButton(event, &button)) 294 int button_modifiers = 0;
295 if (!GetMouseEventButton(&button, &event_button, &button_modifiers))
286 return Response::InvalidParams("Invalid mouse button"); 296 return Response::InvalidParams("Invalid mouse button");
287 297
288 event->x = x; 298 ui::ScopedWebInputEvent event;
289 event->y = y; 299 blink::WebMouseWheelEvent* wheel_event = nullptr;
290 event->windowX = x; 300 blink::WebMouseEvent* mouse_event = nullptr;
291 event->windowY = y; 301 if (type == emulate_touch_from_mouse_event::kTypeMouseWheel) {
292 event->globalX = x; 302 wheel_event = new blink::WebMouseWheelEvent(
293 event->globalY = y; 303 event_type,
294 event->clickCount = click_count ? *click_count : 0; 304 GetEventModifiers(modifiers, nullptr, nullptr) | button_modifiers,
295 event->pointerType = blink::WebPointerProperties::PointerType::Touch; 305 GetEventTimestamp(&timestamp));
306 mouse_event = wheel_event;
307 event.reset(wheel_event);
308 wheel_event->deltaX = static_cast<float>(*delta_x);
309 wheel_event->deltaY = static_cast<float>(*delta_y);
310 } else {
311 mouse_event = new blink::WebMouseEvent(
312 event_type,
313 GetEventModifiers(modifiers, nullptr, nullptr) | button_modifiers,
314 GetEventTimestamp(&timestamp));
315 event.reset(mouse_event);
316 }
317
318 mouse_event->x = x;
319 mouse_event->y = y;
320 mouse_event->button = event_button;
321 mouse_event->windowX = x;
322 mouse_event->windowY = y;
323 mouse_event->globalX = x;
324 mouse_event->globalY = y;
325 mouse_event->clickCount = click_count ? *click_count : 0;
326 mouse_event->pointerType = blink::WebPointerProperties::PointerType::Touch;
296 327
297 if (!host_) 328 if (!host_)
298 return Response::ServerError("Could not connect to view"); 329 return Response::ServerError("Could not connect to view");
299 330
300 if (event->type == blink::WebInputEvent::MouseWheel) 331 if (wheel_event)
301 host_->ForwardWheelEvent(wheel_event); 332 host_->ForwardWheelEvent(*wheel_event);
302 else 333 else
303 host_->ForwardMouseEvent(mouse_event); 334 host_->ForwardMouseEvent(*mouse_event);
304 return Response::OK(); 335 return Response::OK();
305 } 336 }
306 337
307 Response InputHandler::SynthesizePinchGesture( 338 Response InputHandler::SynthesizePinchGesture(
308 DevToolsCommandId command_id, 339 DevToolsCommandId command_id,
309 int x, 340 int x,
310 int y, 341 int y,
311 double scale_factor, 342 double scale_factor,
312 const int* relative_speed, 343 const int* relative_speed,
313 const std::string* gesture_source_type) { 344 const std::string* gesture_source_type) {
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 } else { 548 } else {
518 client_->SendError(command_id, 549 client_->SendError(command_id,
519 Response::InternalError(base::StringPrintf( 550 Response::InternalError(base::StringPrintf(
520 "Synthetic tap failed, result was %d", result))); 551 "Synthetic tap failed, result was %d", result)));
521 } 552 }
522 } 553 }
523 554
524 } // namespace input 555 } // namespace input
525 } // namespace devtools 556 } // namespace devtools
526 } // namespace content 557 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698