summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkhushalsagar <khushalsagar@chromium.org>2016-01-15 12:46:48 -0800
committerCommit bot <commit-bot@chromium.org>2016-01-15 20:48:00 +0000
commit376942135fb8ad3d33340c506ff251f3c3afba3d (patch)
treed65d8ccbee3ffb1555508b03035f8fa65f8746e8
parent272ad4a2612601ae1c7cd8aca68bf8ada4f5a494 (diff)
downloadchromium_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.gn4
-rw-r--r--cc/cc.gyp4
-rw-r--r--cc/cc_tests.gyp2
-rw-r--r--cc/output/begin_frame_args.cc56
-rw-r--r--cc/output/begin_frame_args.h9
-rw-r--r--cc/output/begin_frame_args_unittest.cc32
-rw-r--r--cc/proto/BUILD.gn2
-rw-r--r--cc/proto/base_conversions.cc23
-rw-r--r--cc/proto/base_conversions.h21
-rw-r--r--cc/proto/base_conversions_unittest.cc30
-rw-r--r--cc/proto/begin_main_frame_and_commit_state.proto50
-rw-r--r--cc/proto/gfx_conversions.cc11
-rw-r--r--cc/proto/gfx_conversions.h6
-rw-r--r--cc/proto/gfx_conversions_unittest.cc14
-rw-r--r--cc/proto/vector2d.proto14
-rw-r--r--cc/trees/layer_tree_host_common.cc46
-rw-r--r--cc/trees/layer_tree_host_common.h16
-rw-r--r--cc/trees/layer_tree_host_common_unittest.cc39
-rw-r--r--cc/trees/proxy_common.cc21
-rw-r--r--cc/trees/proxy_common.h8
-rw-r--r--cc/trees/proxy_common_unittest.cc61
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",
diff --git a/cc/cc.gyp b/cc/cc.gyp
index 7ad323a..8c23643 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -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