| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/viz/common/quads/compositor_frame_metadata.h" |
| |
| #include "base/time/time.h" |
| #include "build/build_config.h" |
| #include "components/viz/common/frame_sinks/begin_frame_args.h" |
| #include "components/viz/common/quads/compositor_frame_transition_directive.h" |
| #include "components/viz/common/quads/frame_deadline.h" |
| #include "components/viz/common/surfaces/surface_id.h" |
| #include "components/viz/common/surfaces/surface_range.h" |
| #include "components/viz/common/viz_common_export.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "third_party/skia/include/core/SkColor.h" |
| #include "ui/gfx/delegated_ink_metadata.h" |
| #include "ui/gfx/display_color_spaces.h" |
| #include "ui/gfx/geometry/size_f.h" |
| #include "ui/gfx/geometry/vector2d_f.h" |
| #include "ui/gfx/overlay_transform.h" |
| #include "ui/latency/latency_info.h" |
| |
| namespace viz { |
| namespace { |
| |
| bool AreBeginFrameAcksEqual(const BeginFrameAck& a, const BeginFrameAck& b) { |
| return a.frame_id == b.frame_id && a.trace_id == b.trace_id && |
| a.has_damage == b.has_damage; |
| } |
| |
| bool AreLatencyInfosEqual(const ui::LatencyInfo& a, const ui::LatencyInfo& b) { |
| return a.began() == b.began() && a.terminated() == b.terminated() && |
| a.coalesced() == b.coalesced() && a.trace_id() == b.trace_id() && |
| a.gesture_scroll_id() == b.gesture_scroll_id(); |
| } |
| |
| bool AreDelegatedInkMetadataEqual(const gfx::DelegatedInkMetadata& a, |
| const gfx::DelegatedInkMetadata& b) { |
| return a.point() == b.point() && a.diameter() == b.diameter() && |
| a.color() == b.color() && a.timestamp() == b.timestamp() && |
| a.presentation_area() == b.presentation_area() && |
| a.frame_time() == b.frame_time() && a.is_hovering() == b.is_hovering(); |
| } |
| |
| bool AreTransitionDirectivesEqual(const CompositorFrameTransitionDirective& a, |
| const CompositorFrameTransitionDirective& b) { |
| return a.sequence_id() == b.sequence_id() && a.type() == b.type(); |
| } |
| |
| TEST(CompositorFrameMetadata, Clone) { |
| const FrameSinkId frame_sink_id(1, 2); |
| const LocalSurfaceId local_id1(1, base::UnguessableToken::Create()); |
| const LocalSurfaceId local_id2(2, base::UnguessableToken::Create()); |
| |
| CompositorFrameMetadata metadata; |
| metadata.device_scale_factor = 12.3f; |
| metadata.root_scroll_offset = gfx::PointF(4.f, 5.f); |
| metadata.page_scale_factor = 6.7f; |
| metadata.scrollable_viewport_size = gfx::SizeF(89.0f, 12.3f); |
| metadata.content_color_usage = gfx::ContentColorUsage::kHDR; |
| metadata.may_contain_video = true; |
| metadata.is_handling_interaction = true; |
| metadata.is_handling_animation = true; |
| metadata.root_background_color = SkColors::kBlue; |
| metadata.latency_info.emplace_back(); |
| metadata.referenced_surfaces.emplace_back( |
| SurfaceId(frame_sink_id, local_id1), SurfaceId(frame_sink_id, local_id2)); |
| metadata.activation_dependencies.emplace_back( |
| SurfaceId(frame_sink_id, local_id1)); |
| metadata.deadline = FrameDeadline(base::TimeTicks() + base::Seconds(123), 15, |
| base::Milliseconds(16), true); |
| metadata.begin_frame_ack = BeginFrameAck(999, 888, true, 777); |
| metadata.frame_token = 6; |
| metadata.send_frame_token_to_embedder = true; |
| metadata.min_page_scale_factor = 123.3f; |
| metadata.top_controls_visible_height.emplace(0.5); |
| metadata.display_transform_hint = gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL; |
| metadata.delegated_ink_metadata = std::make_unique<gfx::DelegatedInkMetadata>( |
| gfx::PointF(88.8, 44.4), 1.f, SK_ColorRED, |
| base::TimeTicks() + base::Seconds(125), gfx::RectF(1, 2, 3, 4), true); |
| metadata.transition_directives.emplace_back( |
| CompositorFrameTransitionDirective::CreateSave( |
| blink::ViewTransitionToken(), /*maybe_cross_frame_sink=*/false, 4u, |
| {}, {})); |
| |
| CompositorFrameMetadata clone = metadata.Clone(); |
| EXPECT_FLOAT_EQ(clone.device_scale_factor, metadata.device_scale_factor); |
| EXPECT_EQ(clone.root_scroll_offset, metadata.root_scroll_offset); |
| EXPECT_FLOAT_EQ(clone.page_scale_factor, metadata.page_scale_factor); |
| EXPECT_EQ(clone.scrollable_viewport_size, metadata.scrollable_viewport_size); |
| EXPECT_EQ(clone.content_color_usage, metadata.content_color_usage); |
| EXPECT_EQ(clone.may_contain_video, metadata.may_contain_video); |
| EXPECT_EQ(clone.is_handling_interaction, metadata.is_handling_interaction); |
| EXPECT_EQ(clone.is_handling_animation, metadata.is_handling_animation); |
| EXPECT_EQ(clone.root_background_color, metadata.root_background_color); |
| |
| EXPECT_EQ(clone.latency_info.size(), metadata.latency_info.size()); |
| EXPECT_TRUE( |
| AreLatencyInfosEqual(clone.latency_info[0], metadata.latency_info[0])); |
| |
| EXPECT_EQ(clone.referenced_surfaces, metadata.referenced_surfaces); |
| EXPECT_EQ(clone.activation_dependencies, metadata.activation_dependencies); |
| EXPECT_EQ(clone.deadline, metadata.deadline); |
| |
| EXPECT_TRUE( |
| AreBeginFrameAcksEqual(clone.begin_frame_ack, metadata.begin_frame_ack)); |
| |
| EXPECT_EQ(clone.frame_token, metadata.frame_token); |
| EXPECT_EQ(clone.send_frame_token_to_embedder, |
| metadata.send_frame_token_to_embedder); |
| EXPECT_FLOAT_EQ(clone.min_page_scale_factor, metadata.min_page_scale_factor); |
| EXPECT_EQ(clone.top_controls_visible_height, |
| metadata.top_controls_visible_height); |
| EXPECT_FLOAT_EQ(*clone.top_controls_visible_height, |
| *metadata.top_controls_visible_height); |
| EXPECT_EQ(clone.display_transform_hint, metadata.display_transform_hint); |
| |
| EXPECT_EQ(!!clone.delegated_ink_metadata, !!metadata.delegated_ink_metadata); |
| EXPECT_TRUE(AreDelegatedInkMetadataEqual(*clone.delegated_ink_metadata, |
| *metadata.delegated_ink_metadata)); |
| |
| EXPECT_EQ(clone.transition_directives.size(), |
| metadata.transition_directives.size()); |
| EXPECT_TRUE(AreTransitionDirectivesEqual(clone.transition_directives[0], |
| metadata.transition_directives[0])); |
| } |
| |
| } // namespace |
| } // namespace viz |