event_mojom_traits.cc 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ui/events/mojom/event_mojom_traits.h"
  5. #include "base/time/time.h"
  6. #include "mojo/public/cpp/base/time_mojom_traits.h"
  7. #include "ui/events/event.h"
  8. #include "ui/events/event_utils.h"
  9. #include "ui/events/gesture_event_details.h"
  10. #include "ui/events/ipc/ui_events_param_traits_macros.h"
  11. #include "ui/events/keycodes/dom/dom_code.h"
  12. #include "ui/events/keycodes/dom/keycode_converter.h"
  13. #include "ui/events/mojom/event_constants.mojom.h"
  14. #include "ui/latency/mojom/latency_info_mojom_traits.h"
  15. namespace mojo {
  16. namespace {
  17. ui::mojom::LocationDataPtr CreateLocationData(const ui::LocatedEvent* event) {
  18. ui::mojom::LocationDataPtr location_data(ui::mojom::LocationData::New());
  19. location_data->relative_location = event->location_f();
  20. location_data->root_location = event->root_location_f();
  21. return location_data;
  22. }
  23. bool ReadScrollData(ui::mojom::EventDataView* event,
  24. base::TimeTicks time_stamp,
  25. EventUniquePtr* out) {
  26. ui::mojom::ScrollDataPtr scroll_data;
  27. if (!event->ReadScrollData<ui::mojom::ScrollDataPtr>(&scroll_data))
  28. return false;
  29. *out = std::make_unique<ui::ScrollEvent>(
  30. mojo::ConvertTo<ui::EventType>(event->action()),
  31. scroll_data->location->relative_location,
  32. scroll_data->location->root_location, time_stamp, event->flags(),
  33. scroll_data->x_offset, scroll_data->y_offset,
  34. scroll_data->x_offset_ordinal, scroll_data->y_offset_ordinal,
  35. scroll_data->finger_count, scroll_data->momentum_phase);
  36. return true;
  37. }
  38. bool ReadGestureData(ui::mojom::EventDataView* event,
  39. base::TimeTicks time_stamp,
  40. EventUniquePtr* out) {
  41. ui::mojom::GestureDataPtr gesture_data;
  42. if (!event->ReadGestureData<ui::mojom::GestureDataPtr>(&gesture_data))
  43. return false;
  44. ui::GestureEventDetails details(ConvertTo<ui::EventType>(event->action()));
  45. details.set_device_type(gesture_data->device_type);
  46. if (details.type() == ui::ET_GESTURE_PINCH_UPDATE)
  47. details.set_scale(gesture_data->scale);
  48. *out = std::make_unique<ui::GestureEvent>(
  49. gesture_data->location->relative_location.x(),
  50. gesture_data->location->relative_location.y(), event->flags(), time_stamp,
  51. details);
  52. return true;
  53. }
  54. } // namespace
  55. static_assert(ui::mojom::kEventFlagNone == static_cast<int32_t>(ui::EF_NONE),
  56. "EVENT_FLAGS must match");
  57. static_assert(ui::mojom::kEventFlagIsSynthesized ==
  58. static_cast<int32_t>(ui::EF_IS_SYNTHESIZED),
  59. "EVENT_FLAGS must match");
  60. static_assert(ui::mojom::kEventFlagShiftDown ==
  61. static_cast<int32_t>(ui::EF_SHIFT_DOWN),
  62. "EVENT_FLAGS must match");
  63. static_assert(ui::mojom::kEventFlagControlDown ==
  64. static_cast<int32_t>(ui::EF_CONTROL_DOWN),
  65. "EVENT_FLAGS must match");
  66. static_assert(ui::mojom::kEventFlagAltDown ==
  67. static_cast<int32_t>(ui::EF_ALT_DOWN),
  68. "EVENT_FLAGS must match");
  69. static_assert(ui::mojom::kEventFlagCommandDown ==
  70. static_cast<int32_t>(ui::EF_COMMAND_DOWN),
  71. "EVENT_FLAGS must match");
  72. static_assert(ui::mojom::kEventFlagAltgrDown ==
  73. static_cast<int32_t>(ui::EF_ALTGR_DOWN),
  74. "EVENT_FLAGS must match");
  75. static_assert(ui::mojom::kEventFlagMod3Down ==
  76. static_cast<int32_t>(ui::EF_MOD3_DOWN),
  77. "EVENT_FLAGS must match");
  78. static_assert(ui::mojom::kEventFlagNumLockOn ==
  79. static_cast<int32_t>(ui::EF_NUM_LOCK_ON),
  80. "EVENT_FLAGS must match");
  81. static_assert(ui::mojom::kEventFlagCapsLockOn ==
  82. static_cast<int32_t>(ui::EF_CAPS_LOCK_ON),
  83. "EVENT_FLAGS must match");
  84. static_assert(ui::mojom::kEventFlagScrollLockOn ==
  85. static_cast<int32_t>(ui::EF_SCROLL_LOCK_ON),
  86. "EVENT_FLAGS must match");
  87. static_assert(ui::mojom::kEventFlagLeftMouseButton ==
  88. static_cast<int32_t>(ui::EF_LEFT_MOUSE_BUTTON),
  89. "EVENT_FLAGS must match");
  90. static_assert(ui::mojom::kEventFlagMiddleMouseButton ==
  91. static_cast<int32_t>(ui::EF_MIDDLE_MOUSE_BUTTON),
  92. "EVENT_FLAGS must match");
  93. static_assert(ui::mojom::kEventFlagRightMouseButton ==
  94. static_cast<int32_t>(ui::EF_RIGHT_MOUSE_BUTTON),
  95. "EVENT_FLAGS must match");
  96. static_assert(ui::mojom::kEventFlagBackMouseButton ==
  97. static_cast<int32_t>(ui::EF_BACK_MOUSE_BUTTON),
  98. "EVENT_FLAGS must match");
  99. static_assert(ui::mojom::kEventFlagForwardMouseButton ==
  100. static_cast<int32_t>(ui::EF_FORWARD_MOUSE_BUTTON),
  101. "EVENT_FLAGS must match");
  102. // static
  103. ui::mojom::EventType TypeConverter<ui::mojom::EventType,
  104. ui::EventType>::Convert(ui::EventType type) {
  105. switch (type) {
  106. case ui::ET_UNKNOWN:
  107. return ui::mojom::EventType::UNKNOWN;
  108. case ui::ET_KEY_PRESSED:
  109. return ui::mojom::EventType::KEY_PRESSED;
  110. case ui::ET_KEY_RELEASED:
  111. return ui::mojom::EventType::KEY_RELEASED;
  112. case ui::ET_GESTURE_TAP:
  113. return ui::mojom::EventType::GESTURE_TAP;
  114. case ui::ET_GESTURE_SWIPE:
  115. return ui::mojom::EventType::GESTURE_SWIPE;
  116. case ui::ET_GESTURE_PINCH_BEGIN:
  117. return ui::mojom::EventType::GESTURE_PINCH_BEGIN;
  118. case ui::ET_GESTURE_PINCH_END:
  119. return ui::mojom::EventType::GESTURE_PINCH_END;
  120. case ui::ET_GESTURE_PINCH_UPDATE:
  121. return ui::mojom::EventType::GESTURE_PINCH_UPDATE;
  122. case ui::ET_SCROLL:
  123. return ui::mojom::EventType::SCROLL;
  124. case ui::ET_SCROLL_FLING_START:
  125. return ui::mojom::EventType::SCROLL_FLING_START;
  126. case ui::ET_SCROLL_FLING_CANCEL:
  127. return ui::mojom::EventType::SCROLL_FLING_CANCEL;
  128. case ui::ET_CANCEL_MODE:
  129. return ui::mojom::EventType::CANCEL_MODE;
  130. case ui::ET_MOUSE_PRESSED:
  131. return ui::mojom::EventType::MOUSE_PRESSED_EVENT;
  132. case ui::ET_MOUSE_DRAGGED:
  133. return ui::mojom::EventType::MOUSE_DRAGGED_EVENT;
  134. case ui::ET_MOUSE_RELEASED:
  135. return ui::mojom::EventType::MOUSE_RELEASED_EVENT;
  136. case ui::ET_MOUSE_MOVED:
  137. return ui::mojom::EventType::MOUSE_MOVED_EVENT;
  138. case ui::ET_MOUSE_ENTERED:
  139. return ui::mojom::EventType::MOUSE_ENTERED_EVENT;
  140. case ui::ET_MOUSE_EXITED:
  141. return ui::mojom::EventType::MOUSE_EXITED_EVENT;
  142. case ui::ET_MOUSEWHEEL:
  143. return ui::mojom::EventType::MOUSE_WHEEL_EVENT;
  144. case ui::ET_MOUSE_CAPTURE_CHANGED:
  145. return ui::mojom::EventType::MOUSE_CAPTURE_CHANGED_EVENT;
  146. case ui::ET_TOUCH_RELEASED:
  147. return ui::mojom::EventType::TOUCH_RELEASED;
  148. case ui::ET_TOUCH_PRESSED:
  149. return ui::mojom::EventType::TOUCH_PRESSED;
  150. case ui::ET_TOUCH_MOVED:
  151. return ui::mojom::EventType::TOUCH_MOVED;
  152. case ui::ET_TOUCH_CANCELLED:
  153. return ui::mojom::EventType::TOUCH_CANCELLED;
  154. default:
  155. NOTREACHED() << "Using unknown event types closes connections:"
  156. << ui::EventTypeName(type);
  157. break;
  158. }
  159. return ui::mojom::EventType::UNKNOWN;
  160. }
  161. // static
  162. ui::EventType TypeConverter<ui::EventType, ui::mojom::EventType>::Convert(
  163. ui::mojom::EventType type) {
  164. switch (type) {
  165. case ui::mojom::EventType::UNKNOWN:
  166. return ui::ET_UNKNOWN;
  167. case ui::mojom::EventType::KEY_PRESSED:
  168. return ui::ET_KEY_PRESSED;
  169. case ui::mojom::EventType::KEY_RELEASED:
  170. return ui::ET_KEY_RELEASED;
  171. case ui::mojom::EventType::GESTURE_TAP:
  172. return ui::ET_GESTURE_TAP;
  173. case ui::mojom::EventType::GESTURE_SWIPE:
  174. return ui::ET_GESTURE_SWIPE;
  175. case ui::mojom::EventType::GESTURE_PINCH_BEGIN:
  176. return ui::ET_GESTURE_PINCH_BEGIN;
  177. case ui::mojom::EventType::GESTURE_PINCH_END:
  178. return ui::ET_GESTURE_PINCH_END;
  179. case ui::mojom::EventType::GESTURE_PINCH_UPDATE:
  180. return ui::ET_GESTURE_PINCH_UPDATE;
  181. case ui::mojom::EventType::SCROLL:
  182. return ui::ET_SCROLL;
  183. case ui::mojom::EventType::SCROLL_FLING_START:
  184. return ui::ET_SCROLL_FLING_START;
  185. case ui::mojom::EventType::SCROLL_FLING_CANCEL:
  186. return ui::ET_SCROLL_FLING_CANCEL;
  187. case ui::mojom::EventType::MOUSE_PRESSED_EVENT:
  188. return ui::ET_MOUSE_PRESSED;
  189. case ui::mojom::EventType::MOUSE_DRAGGED_EVENT:
  190. return ui::ET_MOUSE_DRAGGED;
  191. case ui::mojom::EventType::MOUSE_RELEASED_EVENT:
  192. return ui::ET_MOUSE_RELEASED;
  193. case ui::mojom::EventType::MOUSE_MOVED_EVENT:
  194. return ui::ET_MOUSE_MOVED;
  195. case ui::mojom::EventType::MOUSE_ENTERED_EVENT:
  196. return ui::ET_MOUSE_ENTERED;
  197. case ui::mojom::EventType::MOUSE_EXITED_EVENT:
  198. return ui::ET_MOUSE_EXITED;
  199. case ui::mojom::EventType::MOUSE_WHEEL_EVENT:
  200. return ui::ET_MOUSEWHEEL;
  201. case ui::mojom::EventType::MOUSE_CAPTURE_CHANGED_EVENT:
  202. return ui::ET_MOUSE_CAPTURE_CHANGED;
  203. case ui::mojom::EventType::TOUCH_RELEASED:
  204. return ui::ET_TOUCH_RELEASED;
  205. case ui::mojom::EventType::TOUCH_PRESSED:
  206. return ui::ET_TOUCH_PRESSED;
  207. case ui::mojom::EventType::TOUCH_MOVED:
  208. return ui::ET_TOUCH_MOVED;
  209. case ui::mojom::EventType::TOUCH_CANCELLED:
  210. return ui::ET_TOUCH_CANCELLED;
  211. default:
  212. NOTREACHED();
  213. }
  214. return ui::ET_UNKNOWN;
  215. }
  216. // static
  217. ui::mojom::EventType
  218. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::action(
  219. const EventUniquePtr& event) {
  220. return mojo::ConvertTo<ui::mojom::EventType>(event->type());
  221. }
  222. // static
  223. int32_t StructTraits<ui::mojom::EventDataView, EventUniquePtr>::flags(
  224. const EventUniquePtr& event) {
  225. return event->flags();
  226. }
  227. // static
  228. base::TimeTicks
  229. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::time_stamp(
  230. const EventUniquePtr& event) {
  231. return event->time_stamp();
  232. }
  233. // static
  234. const ui::LatencyInfo&
  235. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::latency(
  236. const EventUniquePtr& event) {
  237. return *event->latency();
  238. }
  239. // static
  240. ui::mojom::KeyDataPtr
  241. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::key_data(
  242. const EventUniquePtr& event) {
  243. if (!event->IsKeyEvent())
  244. return nullptr;
  245. const ui::KeyEvent* key_event = event->AsKeyEvent();
  246. ui::mojom::KeyDataPtr key_data(ui::mojom::KeyData::New());
  247. key_data->key_code = static_cast<int32_t>(key_event->key_code());
  248. key_data->is_char = key_event->is_char();
  249. key_data->dom_code = static_cast<uint32_t>(key_event->code());
  250. key_data->dom_key = static_cast<int32_t>(key_event->GetDomKey());
  251. return key_data;
  252. }
  253. // static
  254. ui::mojom::MouseDataPtr
  255. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::mouse_data(
  256. const EventUniquePtr& event) {
  257. if (!event->IsMouseEvent())
  258. return nullptr;
  259. const ui::MouseEvent* mouse_event = event->AsMouseEvent();
  260. ui::mojom::MouseDataPtr mouse_data(ui::mojom::MouseData::New());
  261. mouse_data->changed_button_flags = mouse_event->changed_button_flags();
  262. mouse_data->pointer_details = mouse_event->pointer_details();
  263. mouse_data->location = CreateLocationData(mouse_event);
  264. if (mouse_event->IsMouseWheelEvent()) {
  265. mouse_data->wheel_offset = mouse_event->AsMouseWheelEvent()->offset();
  266. mouse_data->tick_120ths = mouse_event->AsMouseWheelEvent()->tick_120ths();
  267. }
  268. return mouse_data;
  269. }
  270. // static
  271. ui::mojom::GestureDataPtr
  272. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::gesture_data(
  273. const EventUniquePtr& event) {
  274. if (!event->IsGestureEvent())
  275. return nullptr;
  276. const ui::GestureEvent* gesture_event = event->AsGestureEvent();
  277. ui::mojom::GestureDataPtr gesture_data(ui::mojom::GestureData::New());
  278. gesture_data->location = CreateLocationData(gesture_event);
  279. gesture_data->device_type = gesture_event->details().device_type();
  280. gesture_data->scale = (event->type() == ui::ET_GESTURE_PINCH_UPDATE)
  281. ? gesture_event->details().scale()
  282. : 1.f;
  283. return gesture_data;
  284. }
  285. // static
  286. ui::mojom::ScrollDataPtr
  287. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::scroll_data(
  288. const EventUniquePtr& event) {
  289. if (!event->IsScrollEvent())
  290. return nullptr;
  291. ui::mojom::ScrollDataPtr scroll_data(ui::mojom::ScrollData::New());
  292. scroll_data->location = CreateLocationData(event->AsLocatedEvent());
  293. const ui::ScrollEvent* scroll_event = event->AsScrollEvent();
  294. scroll_data->x_offset = scroll_event->x_offset();
  295. scroll_data->y_offset = scroll_event->y_offset();
  296. scroll_data->x_offset_ordinal = scroll_event->x_offset_ordinal();
  297. scroll_data->y_offset_ordinal = scroll_event->y_offset_ordinal();
  298. scroll_data->finger_count = scroll_event->finger_count();
  299. scroll_data->momentum_phase = scroll_event->momentum_phase();
  300. return scroll_data;
  301. }
  302. // static
  303. ui::mojom::TouchDataPtr
  304. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::touch_data(
  305. const EventUniquePtr& event) {
  306. if (!event->IsTouchEvent())
  307. return nullptr;
  308. const ui::TouchEvent* touch_event = event->AsTouchEvent();
  309. ui::mojom::TouchDataPtr touch_data(ui::mojom::TouchData::New());
  310. touch_data->may_cause_scrolling = touch_event->may_cause_scrolling();
  311. touch_data->hovering = touch_event->hovering();
  312. touch_data->location = CreateLocationData(touch_event);
  313. touch_data->pointer_details = touch_event->pointer_details();
  314. return touch_data;
  315. }
  316. // static
  317. base::flat_map<std::string, std::vector<uint8_t>>
  318. StructTraits<ui::mojom::EventDataView, EventUniquePtr>::properties(
  319. const EventUniquePtr& event) {
  320. return event->properties() ? *(event->properties()) : ui::Event::Properties();
  321. }
  322. // static
  323. bool StructTraits<ui::mojom::EventDataView, EventUniquePtr>::Read(
  324. ui::mojom::EventDataView event,
  325. EventUniquePtr* out) {
  326. DCHECK(!out->get());
  327. base::TimeTicks time_stamp;
  328. if (!event.ReadTimeStamp(&time_stamp))
  329. return false;
  330. switch (event.action()) {
  331. case ui::mojom::EventType::KEY_PRESSED:
  332. case ui::mojom::EventType::KEY_RELEASED: {
  333. ui::mojom::KeyDataPtr key_data;
  334. if (!event.ReadKeyData<ui::mojom::KeyDataPtr>(&key_data))
  335. return false;
  336. absl::optional<ui::DomKey> dom_key =
  337. ui::DomKey::FromBase(key_data->dom_key);
  338. if (!dom_key)
  339. return false;
  340. if (!key_data->is_char &&
  341. (key_data->key_code < 0 || key_data->key_code > 255)) {
  342. return false;
  343. }
  344. if (event.flags() > ui::EF_MAX_KEY_EVENT_FLAGS_VALUE)
  345. return false;
  346. const ui::KeyboardCode key_code =
  347. static_cast<ui::KeyboardCode>(key_data->key_code);
  348. // Deserialization uses UsbKeycodeToDomCode() rather than a direct cast
  349. // to ensure the value is valid. Invalid values are mapped to
  350. // DomCode::NONE.
  351. const ui::DomCode dom_code =
  352. ui::KeycodeConverter::UsbKeycodeToDomCode(key_data->dom_code);
  353. const ui::EventType event_type =
  354. (event.action() == ui::mojom::EventType::KEY_PRESSED)
  355. ? ui::ET_KEY_PRESSED
  356. : ui::ET_KEY_RELEASED;
  357. *out = std::make_unique<ui::KeyEvent>(event_type, key_code, dom_code,
  358. event.flags(), *dom_key, time_stamp,
  359. key_data->is_char);
  360. break;
  361. }
  362. case ui::mojom::EventType::GESTURE_TAP:
  363. case ui::mojom::EventType::GESTURE_SWIPE:
  364. case ui::mojom::EventType::GESTURE_PINCH_BEGIN:
  365. case ui::mojom::EventType::GESTURE_PINCH_END:
  366. case ui::mojom::EventType::GESTURE_PINCH_UPDATE:
  367. if (!ReadGestureData(&event, time_stamp, out))
  368. return false;
  369. break;
  370. case ui::mojom::EventType::SCROLL:
  371. if (!ReadScrollData(&event, time_stamp, out))
  372. return false;
  373. break;
  374. case ui::mojom::EventType::SCROLL_FLING_START:
  375. case ui::mojom::EventType::SCROLL_FLING_CANCEL:
  376. // SCROLL_FLING_START/CANCEL is represented by a GestureEvent if
  377. // EF_FROM_TOUCH is set.
  378. if ((event.flags() & ui::EF_FROM_TOUCH) != 0) {
  379. if (!ReadGestureData(&event, time_stamp, out))
  380. return false;
  381. } else if (!ReadScrollData(&event, time_stamp, out)) {
  382. return false;
  383. }
  384. break;
  385. case ui::mojom::EventType::CANCEL_MODE:
  386. *out = std::make_unique<ui::CancelModeEvent>();
  387. break;
  388. case ui::mojom::EventType::MOUSE_PRESSED_EVENT:
  389. case ui::mojom::EventType::MOUSE_RELEASED_EVENT:
  390. case ui::mojom::EventType::MOUSE_DRAGGED_EVENT:
  391. case ui::mojom::EventType::MOUSE_MOVED_EVENT:
  392. case ui::mojom::EventType::MOUSE_ENTERED_EVENT:
  393. case ui::mojom::EventType::MOUSE_EXITED_EVENT:
  394. case ui::mojom::EventType::MOUSE_WHEEL_EVENT:
  395. case ui::mojom::EventType::MOUSE_CAPTURE_CHANGED_EVENT: {
  396. ui::mojom::MouseDataPtr mouse_data;
  397. if (!event.ReadMouseData(&mouse_data))
  398. return false;
  399. std::unique_ptr<ui::MouseEvent> mouse_event;
  400. if (event.action() == ui::mojom::EventType::MOUSE_WHEEL_EVENT) {
  401. mouse_event = std::make_unique<ui::MouseWheelEvent>(
  402. mouse_data->wheel_offset, mouse_data->location->relative_location,
  403. mouse_data->location->root_location, time_stamp, event.flags(),
  404. mouse_data->changed_button_flags, mouse_data->tick_120ths);
  405. } else {
  406. mouse_event = std::make_unique<ui::MouseEvent>(
  407. mojo::ConvertTo<ui::EventType>(event.action()),
  408. mouse_data->location->relative_location,
  409. mouse_data->location->root_location, time_stamp, event.flags(),
  410. mouse_data->changed_button_flags, mouse_data->pointer_details);
  411. }
  412. *out = std::move(mouse_event);
  413. break;
  414. }
  415. case ui::mojom::EventType::TOUCH_RELEASED:
  416. case ui::mojom::EventType::TOUCH_PRESSED:
  417. case ui::mojom::EventType::TOUCH_MOVED:
  418. case ui::mojom::EventType::TOUCH_CANCELLED: {
  419. ui::mojom::TouchDataPtr touch_data;
  420. if (!event.ReadTouchData(&touch_data))
  421. return false;
  422. std::unique_ptr<ui::TouchEvent> touch_event =
  423. std::make_unique<ui::TouchEvent>(
  424. mojo::ConvertTo<ui::EventType>(event.action()),
  425. touch_data->location->relative_location,
  426. touch_data->location->root_location, time_stamp,
  427. touch_data->pointer_details, event.flags());
  428. touch_event->set_may_cause_scrolling(touch_data->may_cause_scrolling);
  429. touch_event->set_hovering(touch_data->hovering);
  430. *out = std::move(touch_event);
  431. break;
  432. }
  433. case ui::mojom::EventType::UNKNOWN:
  434. NOTREACHED() << "Using unknown event types closes connections";
  435. return false;
  436. }
  437. if (!out->get())
  438. return false;
  439. if (!event.ReadLatency((*out)->latency()))
  440. return false;
  441. absl::optional<ui::Event::Properties> properties;
  442. if (!event.ReadProperties(&properties))
  443. return false;
  444. if (properties && !properties->empty())
  445. (*out)->SetProperties(std::move(*properties));
  446. return true;
  447. }
  448. // static
  449. bool StructTraits<ui::mojom::PointerDetailsDataView, ui::PointerDetails>::Read(
  450. ui::mojom::PointerDetailsDataView data,
  451. ui::PointerDetails* out) {
  452. if (!data.ReadPointerType(&out->pointer_type))
  453. return false;
  454. out->radius_x = data.radius_x();
  455. out->radius_y = data.radius_y();
  456. out->force = data.force();
  457. out->tilt_x = data.tilt_x();
  458. out->tilt_y = data.tilt_y();
  459. out->tangential_pressure = data.tangential_pressure();
  460. out->twist = data.twist();
  461. out->id = data.id();
  462. out->offset.set_x(data.offset_x());
  463. out->offset.set_y(data.offset_y());
  464. return true;
  465. }
  466. } // namespace mojo