diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 3b4555d66fe46..1b6da8898c915 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -1762,6 +1762,7 @@ FILE: ../../../flutter/lib/ui/window/pointer_data_packet.h FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter.cc FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter.h FILE: ../../../flutter/lib/ui/window/pointer_data_packet_converter_unittests.cc +FILE: ../../../flutter/lib/ui/window/pointer_data_packet_unittests.cc FILE: ../../../flutter/lib/ui/window/viewport_metrics.cc FILE: ../../../flutter/lib/ui/window/viewport_metrics.h FILE: ../../../flutter/lib/ui/window/window.cc diff --git a/lib/ui/BUILD.gn b/lib/ui/BUILD.gn index fc6356153ee4c..a63414838b5ed 100644 --- a/lib/ui/BUILD.gn +++ b/lib/ui/BUILD.gn @@ -239,6 +239,7 @@ if (enable_unittests) { "window/platform_message_response_dart_port_unittests.cc", "window/platform_message_response_dart_unittests.cc", "window/pointer_data_packet_converter_unittests.cc", + "window/pointer_data_packet_unittests.cc", ] deps = [ diff --git a/lib/ui/window/pointer_data_packet.cc b/lib/ui/window/pointer_data_packet.cc index facdd36798219..358f052ec2d47 100644 --- a/lib/ui/window/pointer_data_packet.cc +++ b/lib/ui/window/pointer_data_packet.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "flutter/lib/ui/window/pointer_data_packet.h" +#include "flutter/fml/logging.h" #include @@ -17,7 +18,19 @@ PointerDataPacket::PointerDataPacket(uint8_t* data, size_t num_bytes) PointerDataPacket::~PointerDataPacket() = default; void PointerDataPacket::SetPointerData(size_t i, const PointerData& data) { + FML_DCHECK(i < GetLength()); memcpy(&data_[i * sizeof(PointerData)], &data, sizeof(PointerData)); } +PointerData PointerDataPacket::GetPointerData(size_t i) const { + FML_DCHECK(i < GetLength()); + PointerData result; + memcpy(&result, &data_[i * sizeof(PointerData)], sizeof(PointerData)); + return result; +} + +size_t PointerDataPacket::GetLength() const { + return data_.size() / sizeof(PointerData); +} + } // namespace flutter diff --git a/lib/ui/window/pointer_data_packet.h b/lib/ui/window/pointer_data_packet.h index c7e1066958166..47b4dda74adc8 100644 --- a/lib/ui/window/pointer_data_packet.h +++ b/lib/ui/window/pointer_data_packet.h @@ -20,6 +20,8 @@ class PointerDataPacket { ~PointerDataPacket(); void SetPointerData(size_t i, const PointerData& data); + PointerData GetPointerData(size_t i) const; + size_t GetLength() const; const std::vector& data() const { return data_; } private: diff --git a/lib/ui/window/pointer_data_packet_converter.cc b/lib/ui/window/pointer_data_packet_converter.cc index dc6681e2d0033..6750a7da22761 100644 --- a/lib/ui/window/pointer_data_packet_converter.cc +++ b/lib/ui/window/pointer_data_packet_converter.cc @@ -17,17 +17,11 @@ PointerDataPacketConverter::~PointerDataPacketConverter() = default; std::unique_ptr PointerDataPacketConverter::Convert( std::unique_ptr packet) { - size_t kBytesPerPointerData = kPointerDataFieldCount * kBytesPerField; - auto buffer = packet->data(); - size_t buffer_length = buffer.size(); - std::vector converted_pointers; // Converts each pointer data in the buffer and stores it in the // converted_pointers. - for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) { - PointerData pointer_data; - memcpy(&pointer_data, &buffer[i * kBytesPerPointerData], - sizeof(PointerData)); + for (size_t i = 0; i < packet->GetLength(); i++) { + PointerData pointer_data = packet->GetPointerData(i); ConvertPointerData(pointer_data, converted_pointers); } diff --git a/lib/ui/window/pointer_data_packet_converter_unittests.cc b/lib/ui/window/pointer_data_packet_converter_unittests.cc index bc858334e856b..97ed67aa9e242 100644 --- a/lib/ui/window/pointer_data_packet_converter_unittests.cc +++ b/lib/ui/window/pointer_data_packet_converter_unittests.cc @@ -133,14 +133,8 @@ void CreateSimulatedTrackpadGestureData(PointerData& data, // NOLINT void UnpackPointerPacket(std::vector& output, // NOLINT std::unique_ptr packet) { - size_t kBytesPerPointerData = kPointerDataFieldCount * kBytesPerField; - auto buffer = packet->data(); - size_t buffer_length = buffer.size(); - - for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) { - PointerData pointer_data; - memcpy(&pointer_data, &buffer[i * kBytesPerPointerData], - sizeof(PointerData)); + for (size_t i = 0; i < packet->GetLength(); i++) { + PointerData pointer_data = packet->GetPointerData(i); output.push_back(pointer_data); } packet.reset(); diff --git a/lib/ui/window/pointer_data_packet_unittests.cc b/lib/ui/window/pointer_data_packet_unittests.cc new file mode 100644 index 0000000000000..3c6d0adaa4354 --- /dev/null +++ b/lib/ui/window/pointer_data_packet_unittests.cc @@ -0,0 +1,69 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "flutter/lib/ui/window/pointer_data.h" + +#include + +#include "gtest/gtest.h" +#include "pointer_data_packet.h" + +namespace flutter { +namespace testing { + +void CreateSimpleSimulatedPointerData(PointerData& data, // NOLINT + PointerData::Change change, + int64_t device, + double dx, + double dy, + int64_t buttons) { + data.time_stamp = 0; + data.change = change; + data.kind = PointerData::DeviceKind::kTouch; + data.signal_kind = PointerData::SignalKind::kNone; + data.device = device; + data.pointer_identifier = 0; + data.physical_x = dx; + data.physical_y = dy; + data.physical_delta_x = 0.0; + data.physical_delta_y = 0.0; + data.buttons = buttons; + data.obscured = 0; + data.synthesized = 0; + data.pressure = 0.0; + data.pressure_min = 0.0; + data.pressure_max = 0.0; + data.distance = 0.0; + data.distance_max = 0.0; + data.size = 0.0; + data.radius_major = 0.0; + data.radius_minor = 0.0; + data.radius_min = 0.0; + data.radius_max = 0.0; + data.orientation = 0.0; + data.tilt = 0.0; + data.platformData = 0; + data.scroll_delta_x = 0.0; + data.scroll_delta_y = 0.0; +} + +TEST(PointerDataPacketTest, CanGetPointerData) { + auto packet = std::make_unique(1); + PointerData data; + CreateSimpleSimulatedPointerData(data, PointerData::Change::kAdd, 1, 2.0, 3.0, + 4); + packet->SetPointerData(0, data); + + PointerData data_recovered = packet->GetPointerData(0); + ASSERT_EQ(data_recovered.physical_x, 2.0); + ASSERT_EQ(data_recovered.physical_y, 3.0); +} + +TEST(PointerDataPacketTest, CanGetLength) { + auto packet = std::make_unique(6); + ASSERT_EQ(packet->GetLength(), (size_t)6); +} + +} // namespace testing +} // namespace flutter diff --git a/shell/platform/fuchsia/flutter/platform_view_unittest.cc b/shell/platform/fuchsia/flutter/platform_view_unittest.cc index 3d7eb7977f5c0..ca77fcc9433e0 100644 --- a/shell/platform/fuchsia/flutter/platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/platform_view_unittest.cc @@ -379,15 +379,8 @@ std::string ToString(const fml::Mapping& mapping) { // Stolen from pointer_data_packet_converter_unittests.cc. void UnpackPointerPacket(std::vector& output, // NOLINT std::unique_ptr packet) { - size_t kBytesPerPointerData = - flutter::kPointerDataFieldCount * flutter::kBytesPerField; - auto buffer = packet->data(); - size_t buffer_length = buffer.size(); - - for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) { - flutter::PointerData pointer_data; - memcpy(&pointer_data, &buffer[i * kBytesPerPointerData], - sizeof(flutter::PointerData)); + for (size_t i = 0; i < packet->GetLength(); i++) { + flutter::PointerData pointer_data = packet->GetPointerData(i); output.push_back(pointer_data); } packet.reset(); diff --git a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc index cde88fd84d0d4..91dcb577fe6a8 100644 --- a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc @@ -484,15 +484,8 @@ std::string ToString(const fml::Mapping& mapping) { // Stolen from pointer_data_packet_converter_unittests.cc. void UnpackPointerPacket(std::vector& output, // NOLINT std::unique_ptr packet) { - size_t kBytesPerPointerData = - flutter::kPointerDataFieldCount * flutter::kBytesPerField; - auto buffer = packet->data(); - size_t buffer_length = buffer.size(); - - for (size_t i = 0; i < buffer_length / kBytesPerPointerData; i++) { - flutter::PointerData pointer_data; - memcpy(&pointer_data, &buffer[i * kBytesPerPointerData], - sizeof(flutter::PointerData)); + for (size_t i = 0; i < packet->GetLength(); i++) { + flutter::PointerData pointer_data = packet->GetPointerData(i); output.push_back(pointer_data); } packet.reset();