diff options
author | khushalsagar <khushalsagar@chromium.org> | 2016-01-15 12:46:48 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-01-15 20:48:00 +0000 |
commit | 376942135fb8ad3d33340c506ff251f3c3afba3d (patch) | |
tree | d65d8ccbee3ffb1555508b03035f8fa65f8746e8 | |
parent | 272ad4a2612601ae1c7cd8aca68bf8ada4f5a494 (diff) | |
download | chromium_src-376942135fb8ad3d33340c506ff251f3c3afba3d.zip chromium_src-376942135fb8ad3d33340c506ff251f3c3afba3d.tar.gz chromium_src-376942135fb8ad3d33340c506ff251f3c3afba3d.tar.bz2 |
(De)-serialize BeginMainFrameAndCommitState to protobuf.
BUG=550687
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1581773002
Cr-Commit-Position: refs/heads/master@{#369836}
-rw-r--r-- | cc/BUILD.gn | 4 | ||||
-rw-r--r-- | cc/cc.gyp | 4 | ||||
-rw-r--r-- | cc/cc_tests.gyp | 2 | ||||
-rw-r--r-- | cc/output/begin_frame_args.cc | 56 | ||||
-rw-r--r-- | cc/output/begin_frame_args.h | 9 | ||||
-rw-r--r-- | cc/output/begin_frame_args_unittest.cc | 32 | ||||
-rw-r--r-- | cc/proto/BUILD.gn | 2 | ||||
-rw-r--r-- | cc/proto/base_conversions.cc | 23 | ||||
-rw-r--r-- | cc/proto/base_conversions.h | 21 | ||||
-rw-r--r-- | cc/proto/base_conversions_unittest.cc | 30 | ||||
-rw-r--r-- | cc/proto/begin_main_frame_and_commit_state.proto | 50 | ||||
-rw-r--r-- | cc/proto/gfx_conversions.cc | 11 | ||||
-rw-r--r-- | cc/proto/gfx_conversions.h | 6 | ||||
-rw-r--r-- | cc/proto/gfx_conversions_unittest.cc | 14 | ||||
-rw-r--r-- | cc/proto/vector2d.proto | 14 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common.cc | 46 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common.h | 16 | ||||
-rw-r--r-- | cc/trees/layer_tree_host_common_unittest.cc | 39 | ||||
-rw-r--r-- | cc/trees/proxy_common.cc | 21 | ||||
-rw-r--r-- | cc/trees/proxy_common.h | 8 | ||||
-rw-r--r-- | cc/trees/proxy_common_unittest.cc | 61 |
21 files changed, 468 insertions, 1 deletions
diff --git a/cc/BUILD.gn b/cc/BUILD.gn index 353958d..50f7858 100644 --- a/cc/BUILD.gn +++ b/cc/BUILD.gn @@ -317,6 +317,8 @@ component("cc") { "playback/largest_display_item.h", "playback/transform_display_item.cc", "playback/transform_display_item.h", + "proto/base_conversions.cc", + "proto/base_conversions.h", "proto/cc_conversions.cc", "proto/cc_conversions.h", "proto/gfx_conversions.cc", @@ -838,6 +840,7 @@ test("cc_unittests") { "playback/display_item_list_unittest.cc", "playback/display_list_raster_source_unittest.cc", "playback/display_list_recording_source_unittest.cc", + "proto/base_conversions_unittest.cc", "proto/cc_conversions_unittest.cc", "proto/gfx_conversions_unittest.cc", "proto/gpu_conversions_unittest.cc", @@ -900,6 +903,7 @@ test("cc_unittests") { "trees/occlusion_tracker_unittest.cc", "trees/occlusion_unittest.cc", "trees/property_tree_unittest.cc", + "trees/proxy_common_unittest.cc", "trees/proxy_impl_unittest.cc", "trees/threaded_channel_unittest.cc", "trees/tree_synchronizer_unittest.cc", @@ -379,6 +379,8 @@ 'playback/largest_display_item.h', 'playback/transform_display_item.cc', 'playback/transform_display_item.h', + 'proto/base_conversions.cc', + 'proto/base_conversions.h', 'proto/cc_conversions.cc', 'proto/cc_conversions.h', 'proto/gfx_conversions.cc', @@ -605,6 +607,7 @@ 'target_name': 'cc_proto', 'type': '<(component)', 'sources': [ + 'proto/begin_main_frame_and_commit_state.proto', 'proto/commit_earlyout_reason.proto', 'proto/compositor_message.proto', 'proto/display_item.proto', @@ -632,6 +635,7 @@ 'proto/skrrect.proto', 'proto/skxfermode.proto', 'proto/transform.proto', + 'proto/vector2d.proto', 'proto/vector2df.proto', ], 'defines': [ diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp index 0d5f6b1..646c907 100644 --- a/cc/cc_tests.gyp +++ b/cc/cc_tests.gyp @@ -90,6 +90,7 @@ 'playback/display_item_list_unittest.cc', 'playback/display_list_raster_source_unittest.cc', 'playback/display_list_recording_source_unittest.cc', + 'proto/base_conversions_unittest.cc', 'proto/cc_conversions_unittest.cc', 'proto/gfx_conversions_unittest.cc', 'proto/gpu_conversions_unittest.cc', @@ -152,6 +153,7 @@ 'trees/occlusion_tracker_unittest.cc', 'trees/occlusion_unittest.cc', 'trees/property_tree_unittest.cc', + 'trees/proxy_common_unittest.cc', 'trees/proxy_impl_unittest.cc', 'trees/threaded_channel_unittest.cc', 'trees/tree_synchronizer_unittest.cc', diff --git a/cc/output/begin_frame_args.cc b/cc/output/begin_frame_args.cc index 216eb52..c50d5f8 100644 --- a/cc/output/begin_frame_args.cc +++ b/cc/output/begin_frame_args.cc @@ -5,6 +5,8 @@ #include "cc/output/begin_frame_args.h" #include "base/trace_event/trace_event_argument.h" +#include "cc/proto/base_conversions.h" +#include "cc/proto/begin_main_frame_and_commit_state.pb.h" namespace cc { @@ -23,6 +25,44 @@ const char* BeginFrameArgs::TypeToString(BeginFrameArgsType type) { return "???"; } +void BeginFrameArgs::BeginFrameArgsTypeToProtobuf( + proto::BeginFrameArgs* proto) const { + switch (type) { + case BeginFrameArgs::INVALID: + proto->set_type(proto::BeginFrameArgs::INVALID); + return; + case BeginFrameArgs::NORMAL: + proto->set_type(proto::BeginFrameArgs::NORMAL); + return; + case BeginFrameArgs::MISSED: + proto->set_type(proto::BeginFrameArgs::MISSED); + return; + case BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX: + proto->set_type(proto::BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX); + return; + } + NOTREACHED(); +} + +void BeginFrameArgs::BeginFrameArgsTypeFromProtobuf( + const proto::BeginFrameArgs& proto) { + switch (proto.type()) { + case proto::BeginFrameArgs::INVALID: + type = BeginFrameArgs::INVALID; + return; + case proto::BeginFrameArgs::NORMAL: + type = BeginFrameArgs::NORMAL; + return; + case proto::BeginFrameArgs::MISSED: + type = BeginFrameArgs::MISSED; + return; + case proto::BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX: + type = BeginFrameArgs::BEGIN_FRAME_ARGS_TYPE_MAX; + return; + } + NOTREACHED(); +} + BeginFrameArgs::BeginFrameArgs() : frame_time(base::TimeTicks()), deadline(base::TimeTicks()), @@ -78,6 +118,22 @@ void BeginFrameArgs::AsValueInto(base::trace_event::TracedValue* state) const { state->SetBoolean("on_critical_path", on_critical_path); } +void BeginFrameArgs::ToProtobuf(proto::BeginFrameArgs* proto) const { + proto->set_frame_time(TimeTicksToProto(frame_time)); + proto->set_deadline(TimeTicksToProto(deadline)); + proto->set_interval(interval.ToInternalValue()); + BeginFrameArgsTypeToProtobuf(proto); + proto->set_on_critical_path(on_critical_path); +} + +void BeginFrameArgs::FromProtobuf(const proto::BeginFrameArgs& proto) { + frame_time = ProtoToTimeTicks(proto.frame_time()); + deadline = ProtoToTimeTicks(proto.deadline()); + interval = base::TimeDelta::FromInternalValue(proto.interval()); + BeginFrameArgsTypeFromProtobuf(proto); + on_critical_path = proto.on_critical_path(); +} + // This is a hard-coded deadline adjustment that assumes 60Hz, to be used in // cases where a good estimated draw time is not known. Using 1/3 of the vsync // as the default adjustment gives the Browser the last 1/3 of a frame to diff --git a/cc/output/begin_frame_args.h b/cc/output/begin_frame_args.h index 1a7ae5f..1f6bc36 100644 --- a/cc/output/begin_frame_args.h +++ b/cc/output/begin_frame_args.h @@ -36,6 +36,10 @@ class TracedValue; namespace cc { +namespace proto { +class BeginFrameArgs; +} + struct CC_EXPORT BeginFrameArgs { enum BeginFrameArgsType { INVALID, @@ -46,6 +50,8 @@ struct CC_EXPORT BeginFrameArgs { BEGIN_FRAME_ARGS_TYPE_MAX, }; static const char* TypeToString(BeginFrameArgsType type); + void BeginFrameArgsTypeToProtobuf(proto::BeginFrameArgs* proto) const; + void BeginFrameArgsTypeFromProtobuf(const proto::BeginFrameArgs& proto); // Creates an invalid set of values. BeginFrameArgs(); @@ -79,6 +85,9 @@ struct CC_EXPORT BeginFrameArgs { scoped_refptr<base::trace_event::ConvertableToTraceFormat> AsValue() const; void AsValueInto(base::trace_event::TracedValue* dict) const; + void ToProtobuf(proto::BeginFrameArgs* proto) const; + void FromProtobuf(const proto::BeginFrameArgs& proto); + base::TimeTicks frame_time; base::TimeTicks deadline; base::TimeDelta interval; diff --git a/cc/output/begin_frame_args_unittest.cc b/cc/output/begin_frame_args_unittest.cc index eb63cc7..6097201 100644 --- a/cc/output/begin_frame_args_unittest.cc +++ b/cc/output/begin_frame_args_unittest.cc @@ -5,6 +5,7 @@ #include <string> #include "cc/output/begin_frame_args.h" +#include "cc/proto/begin_main_frame_and_commit_state.pb.h" #include "cc/test/begin_frame_args_test.h" #include "testing/gtest/include/gtest/gtest-spi.h" #include "testing/gtest/include/gtest/gtest.h" @@ -84,6 +85,37 @@ TEST(BeginFrameArgsTest, Create) { EXPECT_EQ(BeginFrameArgs::NORMAL, args2.type) << args2; } +TEST(BeginFrameArgsSerializationTest, BeginFrameArgsType) { + for (size_t i = 0; + i < BeginFrameArgs::BeginFrameArgsType::BEGIN_FRAME_ARGS_TYPE_MAX; ++i) { + BeginFrameArgs::BeginFrameArgsType type = + static_cast<BeginFrameArgs::BeginFrameArgsType>(i); + BeginFrameArgs args; + args.type = type; + + proto::BeginFrameArgs proto; + args.BeginFrameArgsTypeToProtobuf(&proto); + + BeginFrameArgs new_args; + new_args.BeginFrameArgsTypeFromProtobuf(proto); + EXPECT_EQ(args.type, new_args.type); + } +} + +TEST(BeginFrameArgsSerializationTest, BeginFrameArgs) { + BeginFrameArgs args = BeginFrameArgs::Create( + BEGINFRAME_FROM_HERE, base::TimeTicks::FromInternalValue(1), + base::TimeTicks::FromInternalValue(2), + base::TimeDelta::FromInternalValue(3), BeginFrameArgs::NORMAL); + proto::BeginFrameArgs proto; + args.ToProtobuf(&proto); + + BeginFrameArgs new_args; + new_args.FromProtobuf(proto); + + EXPECT_EQ(args, new_args); +} + #ifndef NDEBUG TEST(BeginFrameArgsTest, Location) { tracked_objects::Location expected_location = BEGINFRAME_FROM_HERE; diff --git a/cc/proto/BUILD.gn b/cc/proto/BUILD.gn index 60952ac..7a68e16 100644 --- a/cc/proto/BUILD.gn +++ b/cc/proto/BUILD.gn @@ -29,6 +29,7 @@ proto_library("proto_internal") { sources = [ # TODO(dtrainor): Move protos to their correct packages once it's possible # to include protos from other directories/targets (crbug.com/542423). + "begin_main_frame_and_commit_state.proto", "commit_earlyout_reason.proto", "compositor_message.proto", "display_item.proto", @@ -56,6 +57,7 @@ proto_library("proto_internal") { "skrrect.proto", "skxfermode.proto", "transform.proto", + "vector2d.proto", "vector2df.proto", ] diff --git a/cc/proto/base_conversions.cc b/cc/proto/base_conversions.cc new file mode 100644 index 0000000..119903b --- /dev/null +++ b/cc/proto/base_conversions.cc @@ -0,0 +1,23 @@ +// Copyright 2016 The Chromium 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 "cc/proto/base_conversions.h" + +namespace base { +class TimeDelta; +} + +namespace cc { + +int64_t TimeTicksToProto(base::TimeTicks ticks) { + base::TimeDelta diff = ticks - base::TimeTicks::UnixEpoch(); + return diff.InMicroseconds(); +} + +CC_EXPORT base::TimeTicks ProtoToTimeTicks(int64_t ticks) { + base::TimeDelta diff = base::TimeDelta::FromMicroseconds(ticks); + return base::TimeTicks::UnixEpoch() + diff; +} + +} // namespace cc diff --git a/cc/proto/base_conversions.h b/cc/proto/base_conversions.h new file mode 100644 index 0000000..b862e3a --- /dev/null +++ b/cc/proto/base_conversions.h @@ -0,0 +1,21 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CC_PROTO_BASE_CONVERSIONS_H_ +#define CC_PROTO_BASE_CONVERSIONS_H_ + +#include "base/time/time.h" +#include "cc/base/cc_export.h" + +namespace cc { + +// TODO(dtrainor): Move these to a class and make them static +// (crbug.com/548432). +// We should probably have a better way for sending these. +CC_EXPORT int64_t TimeTicksToProto(base::TimeTicks ticks); +CC_EXPORT base::TimeTicks ProtoToTimeTicks(int64_t ticks); + +} // namespace cc + +#endif // CC_PROTO_BASE_CONVERSIONS_H_ diff --git a/cc/proto/base_conversions_unittest.cc b/cc/proto/base_conversions_unittest.cc new file mode 100644 index 0000000..57dd807 --- /dev/null +++ b/cc/proto/base_conversions_unittest.cc @@ -0,0 +1,30 @@ +// Copyright 2016 The Chromium 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 "cc/proto/base_conversions.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace cc { +namespace { + +TEST(BaseProtoConversionsTest, SerializeTimeTicks) { + base::TimeTicks ticks; + base::TimeTicks new_ticks; + + ticks = base::TimeTicks::FromInternalValue(2); + new_ticks = ProtoToTimeTicks(TimeTicksToProto(ticks)); + EXPECT_EQ(ticks, new_ticks); + + ticks = base::TimeTicks::Now(); + new_ticks = ProtoToTimeTicks(TimeTicksToProto(ticks)); + EXPECT_EQ(ticks, new_ticks); + + ticks = base::TimeTicks::FromInternalValue(0); + new_ticks = ProtoToTimeTicks(TimeTicksToProto(ticks)); + EXPECT_EQ(ticks, new_ticks); +} + +} // namespace +} // namespace cc diff --git a/cc/proto/begin_main_frame_and_commit_state.proto b/cc/proto/begin_main_frame_and_commit_state.proto new file mode 100644 index 0000000..9881131 --- /dev/null +++ b/cc/proto/begin_main_frame_and_commit_state.proto @@ -0,0 +1,50 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; + +import "vector2d.proto"; +import "vector2df.proto"; + +option optimize_for = LITE_RUNTIME; + +package cc.proto; + +message ScrollUpdateInfo { + optional int64 layer_id = 1; + optional Vector2d scroll_delta = 2; +} + +message ScrollAndScaleSet { + repeated ScrollUpdateInfo scrolls = 1; + optional float page_scale_delta = 2; + optional Vector2dF elastic_overscroll_delta = 3; + optional float top_controls_delta = 4; + + // TODO(khushalsagar): Do we need to send swap promises? + // See crbug/576999. +} + +message BeginFrameArgs { + enum BeginFrameArgsType { + INVALID = 1; + NORMAL = 2; + MISSED = 3; + BEGIN_FRAME_ARGS_TYPE_MAX = 100; + } + + optional int64 frame_time = 1; + optional int64 deadline = 2; + optional int64 interval = 3; + optional BeginFrameArgsType type = 4; + optional bool on_critical_path = 5; +} + +message BeginMainFrameAndCommitState { + optional int64 begin_frame_id = 1; + optional BeginFrameArgs begin_frame_args = 2; + optional ScrollAndScaleSet scroll_info = 3; + optional int64 memory_allocation_limit_bytes = 4; + optional bool evicted_ui_resources = 5; +}
\ No newline at end of file diff --git a/cc/proto/gfx_conversions.cc b/cc/proto/gfx_conversions.cc index 8dac00c..3abc59f 100644 --- a/cc/proto/gfx_conversions.cc +++ b/cc/proto/gfx_conversions.cc @@ -13,6 +13,7 @@ #include "cc/proto/size.pb.h" #include "cc/proto/sizef.pb.h" #include "cc/proto/transform.pb.h" +#include "cc/proto/vector2d.pb.h" #include "cc/proto/vector2df.pb.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point3_f.h" @@ -22,6 +23,7 @@ #include "ui/gfx/geometry/scroll_offset.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size_f.h" +#include "ui/gfx/geometry/vector2d.h" #include "ui/gfx/transform.h" namespace cc { @@ -137,4 +139,13 @@ gfx::ScrollOffset ProtoToScrollOffset(const proto::ScrollOffset& proto) { return gfx::ScrollOffset(proto.x(), proto.y()); } +void Vector2dToProto(const gfx::Vector2d& vector, proto::Vector2d* proto) { + proto->set_x(vector.x()); + proto->set_y(vector.y()); +} + +gfx::Vector2d ProtoToVector2d(const proto::Vector2d& proto) { + return gfx::Vector2d(proto.x(), proto.y()); +} + } // namespace cc diff --git a/cc/proto/gfx_conversions.h b/cc/proto/gfx_conversions.h index b5caa3a..52a2c11 100644 --- a/cc/proto/gfx_conversions.h +++ b/cc/proto/gfx_conversions.h @@ -17,6 +17,7 @@ class ScrollOffset; class Size; class SizeF; class Transform; +class Vector2d; class Vector2dF; } // namespace gfx @@ -32,6 +33,7 @@ class ScrollOffset; class Size; class SizeF; class Transform; +class Vector2d; class Vector2dF; } // namespace proto @@ -71,6 +73,10 @@ CC_EXPORT void ScrollOffsetToProto(const gfx::ScrollOffset& scroll_offset, CC_EXPORT gfx::ScrollOffset ProtoToScrollOffset( const proto::ScrollOffset& proto); +CC_EXPORT void Vector2dToProto(const gfx::Vector2d& vector, + proto::Vector2d* proto); +CC_EXPORT gfx::Vector2d ProtoToVector2d(const proto::Vector2d& proto); + } // namespace cc #endif // CC_PROTO_GFX_CONVERSIONS_H_ diff --git a/cc/proto/gfx_conversions_unittest.cc b/cc/proto/gfx_conversions_unittest.cc index cf46be8..1132304 100644 --- a/cc/proto/gfx_conversions_unittest.cc +++ b/cc/proto/gfx_conversions_unittest.cc @@ -13,6 +13,7 @@ #include "cc/proto/size.pb.h" #include "cc/proto/sizef.pb.h" #include "cc/proto/transform.pb.h" +#include "cc/proto/vector2d.pb.h" #include "cc/proto/vector2df.pb.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/gfx/geometry/point.h" @@ -269,5 +270,18 @@ TEST(GfxProtoConversionsTest, SerializeDeserializeScrollOffset) { EXPECT_EQ(scroll_offset3, ProtoToScrollOffset(proto3)); } +TEST(GfxProtoConversionsTest, SerializeDeserializeVector2d) { + const gfx::Vector2d vector(5, 10); + + // Test Vector2dToProto + proto::Vector2d proto; + Vector2dToProto(vector, &proto); + EXPECT_EQ(vector.x(), proto.x()); + EXPECT_EQ(vector.y(), proto.y()); + + // Test ProtoToVector2d + EXPECT_EQ(vector, ProtoToVector2d(proto)); +} + } // namespace } // namespace cc diff --git a/cc/proto/vector2d.proto b/cc/proto/vector2d.proto new file mode 100644 index 0000000..15171844 --- /dev/null +++ b/cc/proto/vector2d.proto @@ -0,0 +1,14 @@ +// Copyright 2016 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +syntax = "proto2"; + +option optimize_for = LITE_RUNTIME; + +package cc.proto; + +message Vector2d { + optional int64 x = 1; + optional int64 y = 2; +} diff --git a/cc/trees/layer_tree_host_common.cc b/cc/trees/layer_tree_host_common.cc index 8f66145..d329041 100644 --- a/cc/trees/layer_tree_host_common.cc +++ b/cc/trees/layer_tree_host_common.cc @@ -16,6 +16,8 @@ #include "cc/layers/layer_iterator.h" #include "cc/layers/render_surface_draw_properties.h" #include "cc/layers/render_surface_impl.h" +#include "cc/proto/begin_main_frame_and_commit_state.pb.h" +#include "cc/proto/gfx_conversions.h" #include "cc/trees/draw_property_utils.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_impl.h" @@ -149,12 +151,56 @@ LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting:: render_surface_layer_list, current_render_surface_layer_list_id) {} +bool LayerTreeHostCommon::ScrollUpdateInfo::operator==( + const LayerTreeHostCommon::ScrollUpdateInfo& other) const { + return layer_id == other.layer_id && scroll_delta == other.scroll_delta; +} + +void LayerTreeHostCommon::ScrollUpdateInfo::ToProtobuf( + proto::ScrollUpdateInfo* proto) const { + proto->set_layer_id(layer_id); + Vector2dToProto(scroll_delta, proto->mutable_scroll_delta()); +} + +void LayerTreeHostCommon::ScrollUpdateInfo::FromProtobuf( + const proto::ScrollUpdateInfo& proto) { + layer_id = proto.layer_id(); + scroll_delta = ProtoToVector2d(proto.scroll_delta()); +} + ScrollAndScaleSet::ScrollAndScaleSet() : page_scale_delta(1.f), top_controls_delta(0.f) { } ScrollAndScaleSet::~ScrollAndScaleSet() {} +bool ScrollAndScaleSet::EqualsForTesting(const ScrollAndScaleSet& other) const { + return scrolls == other.scrolls && + page_scale_delta == other.page_scale_delta && + elastic_overscroll_delta == other.elastic_overscroll_delta && + top_controls_delta == other.top_controls_delta; +} + +void ScrollAndScaleSet::ToProtobuf(proto::ScrollAndScaleSet* proto) const { + for (const auto& scroll : scrolls) + scroll.ToProtobuf(proto->add_scrolls()); + proto->set_page_scale_delta(page_scale_delta); + Vector2dFToProto(elastic_overscroll_delta, + proto->mutable_elastic_overscroll_delta()); + proto->set_top_controls_delta(top_controls_delta); +} + +void ScrollAndScaleSet::FromProtobuf(const proto::ScrollAndScaleSet& proto) { + DCHECK_EQ(scrolls.size(), 0u); + for (int i = 0; i < proto.scrolls_size(); ++i) { + scrolls.push_back(LayerTreeHostCommon::ScrollUpdateInfo()); + scrolls[i].FromProtobuf(proto.scrolls(i)); + } + page_scale_delta = proto.page_scale_delta(); + elastic_overscroll_delta = ProtoToVector2dF(proto.elastic_overscroll_delta()); + top_controls_delta = proto.top_controls_delta(); +} + static gfx::Vector2dF GetEffectiveScrollDelta(LayerImpl* layer) { // Layer's scroll offset can have an integer part and fractional part. // Due to Blink's limitation, it only counter-scrolls the position-fixed diff --git a/cc/trees/layer_tree_host_common.h b/cc/trees/layer_tree_host_common.h index df74721..4a09194 100644 --- a/cc/trees/layer_tree_host_common.h +++ b/cc/trees/layer_tree_host_common.h @@ -22,6 +22,11 @@ namespace cc { +namespace proto { +class ScrollUpdateInfo; +class ScrollAndScaleSet; +} + class LayerImpl; class Layer; class SwapPromise; @@ -154,11 +159,16 @@ class CC_EXPORT LayerTreeHostCommon { return layers[index]; } - struct ScrollUpdateInfo { + struct CC_EXPORT ScrollUpdateInfo { int layer_id; // TODO(miletus): Use ScrollOffset once LayerTreeHost/Blink fully supports // franctional scroll offset. gfx::Vector2d scroll_delta; + + bool operator==(const ScrollUpdateInfo& other) const; + + void ToProtobuf(proto::ScrollUpdateInfo* proto) const; + void FromProtobuf(const proto::ScrollUpdateInfo& proto); }; }; @@ -172,6 +182,10 @@ struct CC_EXPORT ScrollAndScaleSet { float top_controls_delta; std::vector<scoped_ptr<SwapPromise>> swap_promises; + bool EqualsForTesting(const ScrollAndScaleSet& other) const; + void ToProtobuf(proto::ScrollAndScaleSet* proto) const; + void FromProtobuf(const proto::ScrollAndScaleSet& proto); + private: DISALLOW_COPY_AND_ASSIGN(ScrollAndScaleSet); }; diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index a2c41fb..c65a2cf 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc @@ -24,6 +24,8 @@ #include "cc/layers/render_surface_impl.h" #include "cc/output/copy_output_request.h" #include "cc/output/copy_output_result.h" +#include "cc/proto/begin_main_frame_and_commit_state.pb.h" +#include "cc/proto/gfx_conversions.h" #include "cc/test/animation_test_common.h" #include "cc/test/fake_content_layer_client.h" #include "cc/test/fake_impl_task_runner_provider.h" @@ -9638,5 +9640,42 @@ TEST_F(LayerTreeHostCommonTest, LargeTransformTest) { EXPECT_FALSE(render_surface2_in_rsll); } +TEST_F(LayerTreeHostCommonTest, SerializeScrollUpdateInfo) { + LayerTreeHostCommon::ScrollUpdateInfo scroll; + scroll.layer_id = 2; + scroll.scroll_delta = gfx::Vector2d(5, 10); + + proto::ScrollUpdateInfo proto; + scroll.ToProtobuf(&proto); + LayerTreeHostCommon::ScrollUpdateInfo new_scroll; + new_scroll.FromProtobuf(proto); + + EXPECT_EQ(scroll, new_scroll); +} + +TEST_F(LayerTreeHostCommonTest, SerializeScrollAndScale) { + ScrollAndScaleSet scroll_and_scale_set; + + LayerTreeHostCommon::ScrollUpdateInfo scroll1; + scroll1.layer_id = 1; + scroll1.scroll_delta = gfx::Vector2d(5, 10); + LayerTreeHostCommon::ScrollUpdateInfo scroll2; + scroll2.layer_id = 2; + scroll2.scroll_delta = gfx::Vector2d(1, 5); + scroll_and_scale_set.scrolls.push_back(scroll1); + scroll_and_scale_set.scrolls.push_back(scroll2); + + scroll_and_scale_set.page_scale_delta = 0.3f; + scroll_and_scale_set.elastic_overscroll_delta = gfx::Vector2dF(0.5f, 0.6f); + scroll_and_scale_set.top_controls_delta = 0.9f; + + proto::ScrollAndScaleSet proto; + scroll_and_scale_set.ToProtobuf(&proto); + ScrollAndScaleSet new_scroll_and_scale_set; + new_scroll_and_scale_set.FromProtobuf(proto); + + EXPECT_TRUE(scroll_and_scale_set.EqualsForTesting(new_scroll_and_scale_set)); +} + } // namespace } // namespace cc diff --git a/cc/trees/proxy_common.cc b/cc/trees/proxy_common.cc index f047e8e..c96af7b 100644 --- a/cc/trees/proxy_common.cc +++ b/cc/trees/proxy_common.cc @@ -3,6 +3,8 @@ // found in the LICENSE file. #include "cc/trees/proxy_common.h" + +#include "cc/proto/begin_main_frame_and_commit_state.pb.h" #include "cc/trees/layer_tree_host.h" namespace cc { @@ -12,4 +14,23 @@ BeginMainFrameAndCommitState::BeginMainFrameAndCommitState() BeginMainFrameAndCommitState::~BeginMainFrameAndCommitState() {} +void BeginMainFrameAndCommitState::ToProtobuf( + proto::BeginMainFrameAndCommitState* proto) const { + proto->set_begin_frame_id(begin_frame_id); + begin_frame_args.ToProtobuf(proto->mutable_begin_frame_args()); + scroll_info->ToProtobuf(proto->mutable_scroll_info()); + proto->set_memory_allocation_limit_bytes(memory_allocation_limit_bytes); + proto->set_evicted_ui_resources(evicted_ui_resources); +} + +void BeginMainFrameAndCommitState::FromProtobuf( + const proto::BeginMainFrameAndCommitState& proto) { + begin_frame_id = proto.begin_frame_id(); + begin_frame_args.FromProtobuf(proto.begin_frame_args()); + scroll_info.reset(new ScrollAndScaleSet()); + scroll_info->FromProtobuf(proto.scroll_info()); + memory_allocation_limit_bytes = proto.memory_allocation_limit_bytes(); + evicted_ui_resources = proto.evicted_ui_resources(); +} + } // namespace cc diff --git a/cc/trees/proxy_common.h b/cc/trees/proxy_common.h index a9e991c..046f105 100644 --- a/cc/trees/proxy_common.h +++ b/cc/trees/proxy_common.h @@ -12,6 +12,11 @@ #include "cc/trees/layer_tree_host_common.h" namespace cc { + +namespace proto { +class BeginMainFrameAndCommitState; +} + class LayerTreeHost; struct CC_EXPORT BeginMainFrameAndCommitState { @@ -23,6 +28,9 @@ struct CC_EXPORT BeginMainFrameAndCommitState { scoped_ptr<ScrollAndScaleSet> scroll_info; size_t memory_allocation_limit_bytes; bool evicted_ui_resources; + + void ToProtobuf(proto::BeginMainFrameAndCommitState* proto) const; + void FromProtobuf(const proto::BeginMainFrameAndCommitState& proto); }; } // namespace cc diff --git a/cc/trees/proxy_common_unittest.cc b/cc/trees/proxy_common_unittest.cc new file mode 100644 index 0000000..c0caf1d --- /dev/null +++ b/cc/trees/proxy_common_unittest.cc @@ -0,0 +1,61 @@ +// Copyright 2016 The Chromium 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 "cc/trees/proxy_common.h" + +#include "cc/proto/begin_main_frame_and_commit_state.pb.h" +#include "cc/test/begin_frame_args_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace cc { +namespace { + +TEST(ProxyCommonUnittest, SerializeBeginMainFrameAndCommitState) { + BeginMainFrameAndCommitState begin_main_frame_state; + begin_main_frame_state.begin_frame_id = 5; + + begin_main_frame_state.begin_frame_args = BeginFrameArgs::Create( + BEGINFRAME_FROM_HERE, base::TimeTicks::FromInternalValue(4), + base::TimeTicks::FromInternalValue(7), + base::TimeDelta::FromInternalValue(9), BeginFrameArgs::NORMAL); + begin_main_frame_state.begin_frame_args.on_critical_path = false; + + LayerTreeHostCommon::ScrollUpdateInfo scroll1; + scroll1.layer_id = 1; + scroll1.scroll_delta = gfx::Vector2d(5, 10); + LayerTreeHostCommon::ScrollUpdateInfo scroll2; + scroll2.layer_id = 2; + scroll2.scroll_delta = gfx::Vector2d(1, 5); + begin_main_frame_state.scroll_info.reset(new ScrollAndScaleSet()); + begin_main_frame_state.scroll_info->scrolls.push_back(scroll1); + begin_main_frame_state.scroll_info->scrolls.push_back(scroll2); + + begin_main_frame_state.scroll_info->page_scale_delta = 0.3f; + begin_main_frame_state.scroll_info->elastic_overscroll_delta = + gfx::Vector2dF(0.5f, 0.6f); + begin_main_frame_state.scroll_info->top_controls_delta = 0.9f; + + begin_main_frame_state.memory_allocation_limit_bytes = 16; + begin_main_frame_state.evicted_ui_resources = false; + + proto::BeginMainFrameAndCommitState proto; + begin_main_frame_state.ToProtobuf(&proto); + + BeginMainFrameAndCommitState new_begin_main_frame_state; + new_begin_main_frame_state.FromProtobuf(proto); + + EXPECT_EQ(new_begin_main_frame_state.begin_frame_id, + begin_main_frame_state.begin_frame_id); + EXPECT_EQ(new_begin_main_frame_state.begin_frame_args, + begin_main_frame_state.begin_frame_args); + EXPECT_TRUE(begin_main_frame_state.scroll_info->EqualsForTesting( + *new_begin_main_frame_state.scroll_info.get())); + EXPECT_EQ(new_begin_main_frame_state.memory_allocation_limit_bytes, + begin_main_frame_state.memory_allocation_limit_bytes); + EXPECT_EQ(new_begin_main_frame_state.evicted_ui_resources, + begin_main_frame_state.evicted_ui_resources); +} + +} // namespace +} // namespace cc |