[go: nahoru, domu]

Render to Browser metadata via SwapPromise

Prototype of using classic IPC for QueueMessageSwapPromise to notify the browser
of metadata. Keeps viz layer free of this information/dependency.

Bug: 857695
Cq-Include-Trybots: master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.android:android_optional_gpu_tests_rel
Change-Id: I194c0ef362d261c4c8fe362196362d7bbf3298ce
Reviewed-on: https://chromium-review.googlesource.com/860994
Reviewed-by: Ken Buchanan <kenrb@chromium.org>
Reviewed-by: Antoine Labour <piman@chromium.org>
Reviewed-by: Fady Samuel <fsamuel@chromium.org>
Commit-Queue: Jonathan Ross <jonross@chromium.org>
Cr-Commit-Position: refs/heads/master@{#528967}
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 300b84b..0ea429b9 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -321,6 +321,8 @@
     "trees/proxy_impl.h",
     "trees/proxy_main.cc",
     "trees/proxy_main.h",
+    "trees/render_frame_metadata.cc",
+    "trees/render_frame_metadata.h",
     "trees/scoped_abort_remaining_swap_promises.h",
     "trees/scroll_node.cc",
     "trees/scroll_node.h",
diff --git a/cc/ipc/cc_param_traits_macros.h b/cc/ipc/cc_param_traits_macros.h
index a14d36a..b3ffc93 100644
--- a/cc/ipc/cc_param_traits_macros.h
+++ b/cc/ipc/cc_param_traits_macros.h
@@ -6,6 +6,7 @@
 #define CC_IPC_CC_PARAM_TRAITS_MACROS_H_
 
 #include "cc/paint/filter_operation.h"
+#include "cc/trees/render_frame_metadata.h"
 #include "components/viz/common/frame_sinks/begin_frame_args.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "components/viz/common/quads/debug_border_draw_quad.h"
@@ -208,4 +209,8 @@
   IPC_STRUCT_TRAITS_MEMBER(frame_token)
 IPC_STRUCT_TRAITS_END()
 
+IPC_STRUCT_TRAITS_BEGIN(cc::RenderFrameMetadata)
+  IPC_STRUCT_TRAITS_MEMBER(root_scroll_offset)
+IPC_STRUCT_TRAITS_END()
+
 #endif  // CC_IPC_CC_PARAM_TRAITS_MACROS_H_
diff --git a/cc/layers/surface_layer.cc b/cc/layers/surface_layer.cc
index f5a04dc..341ce70 100644
--- a/cc/layers/surface_layer.cc
+++ b/cc/layers/surface_layer.cc
@@ -32,7 +32,8 @@
  private:
   void DidActivate() override {}
 
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override {}
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                RenderFrameMetadata* render_frame_metadata) override {}
 
   void DidSwap() override {
     main_task_runner_->PostTask(FROM_HERE, reference_returner_);
diff --git a/cc/trees/latency_info_swap_promise.cc b/cc/trees/latency_info_swap_promise.cc
index 3dcaf1e..2caa840 100644
--- a/cc/trees/latency_info_swap_promise.cc
+++ b/cc/trees/latency_info_swap_promise.cc
@@ -33,9 +33,11 @@
 
 LatencyInfoSwapPromise::~LatencyInfoSwapPromise() = default;
 
-void LatencyInfoSwapPromise::WillSwap(viz::CompositorFrameMetadata* metadata) {
+void LatencyInfoSwapPromise::WillSwap(
+    viz::CompositorFrameMetadata* compositor_frame_metadata,
+    RenderFrameMetadata* render_frame_metadata) {
   DCHECK(!latency_.terminated());
-  metadata->latency_info.push_back(latency_);
+  compositor_frame_metadata->latency_info.push_back(latency_);
 }
 
 void LatencyInfoSwapPromise::DidSwap() {}
diff --git a/cc/trees/latency_info_swap_promise.h b/cc/trees/latency_info_swap_promise.h
index 2b23d67..62a80777 100644
--- a/cc/trees/latency_info_swap_promise.h
+++ b/cc/trees/latency_info_swap_promise.h
@@ -19,7 +19,8 @@
   ~LatencyInfoSwapPromise() override;
 
   void DidActivate() override {}
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override;
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                RenderFrameMetadata* render_frame_metadata) override;
   void DidSwap() override;
   DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override;
   void OnCommit() override;
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index ad17e57..97214d7 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -71,6 +71,7 @@
 #include "cc/trees/layer_tree_host_common.h"
 #include "cc/trees/layer_tree_impl.h"
 #include "cc/trees/mutator_host.h"
+#include "cc/trees/render_frame_metadata.h"
 #include "cc/trees/scroll_node.h"
 #include "cc/trees/single_thread_proxy.h"
 #include "cc/trees/transform_node.h"
@@ -1801,6 +1802,13 @@
   return metadata;
 }
 
+RenderFrameMetadata LayerTreeHostImpl::MakeRenderFrameMetadata() {
+  RenderFrameMetadata metadata;
+  metadata.root_scroll_offset =
+      gfx::ScrollOffsetToVector2dF(active_tree_->TotalScrollOffset());
+  return metadata;
+}
+
 bool LayerTreeHostImpl::DrawLayers(FrameData* frame) {
   DCHECK(CanDraw());
   DCHECK_EQ(frame->has_no_damage, frame->render_passes.empty());
@@ -1866,7 +1874,9 @@
   metadata.may_contain_video = frame->may_contain_video;
   metadata.activation_dependencies = std::move(frame->activation_dependencies);
 
-  active_tree()->FinishSwapPromises(&metadata);
+  RenderFrameMetadata render_frame_metadata = MakeRenderFrameMetadata();
+
+  active_tree()->FinishSwapPromises(&metadata, &render_frame_metadata);
 
   metadata.latency_info.emplace_back(ui::SourceEventType::FRAME);
   ui::LatencyInfo& new_latency_info = metadata.latency_info.back();
diff --git a/cc/trees/layer_tree_host_impl.h b/cc/trees/layer_tree_host_impl.h
index 83356aa..db20a2f 100644
--- a/cc/trees/layer_tree_host_impl.h
+++ b/cc/trees/layer_tree_host_impl.h
@@ -74,6 +74,7 @@
 class PendingTreeRasterDurationHistogramTimer;
 class RasterTilePriorityQueue;
 class RasterBufferProvider;
+class RenderFrameMetadata;
 class RenderingStatsInstrumentation;
 class ResourcePool;
 class ScrollElasticityHelper;
@@ -573,6 +574,7 @@
   void ScheduleMicroBenchmark(std::unique_ptr<MicroBenchmarkImpl> benchmark);
 
   viz::CompositorFrameMetadata MakeCompositorFrameMetadata();
+  RenderFrameMetadata MakeRenderFrameMetadata();
 
   // Viewport rectangle and clip in device space.  These rects are used to
   // prioritize raster and determine what is submitted in a CompositorFrame.
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 6018511..f592f7e0 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -4927,7 +4927,8 @@
     result_->did_activate_called = true;
   }
 
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override {
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                RenderFrameMetadata* render_frame_metadata) override {
     base::AutoLock lock(result_->lock);
     EXPECT_FALSE(result_->did_swap_called);
     EXPECT_FALSE(result_->did_not_swap_called);
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index 2d65a6b..46b0ad5 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -1585,11 +1585,13 @@
   new_swap_promises.clear();
 }
 
-void LayerTreeImpl::FinishSwapPromises(viz::CompositorFrameMetadata* metadata) {
+void LayerTreeImpl::FinishSwapPromises(
+    viz::CompositorFrameMetadata* compositor_frame_metadata,
+    RenderFrameMetadata* render_frame_metadata) {
   for (const auto& swap_promise : swap_promise_list_)
-    swap_promise->WillSwap(metadata);
+    swap_promise->WillSwap(compositor_frame_metadata, render_frame_metadata);
   for (const auto& swap_promise : pinned_swap_promise_list_)
-    swap_promise->WillSwap(metadata);
+    swap_promise->WillSwap(compositor_frame_metadata, render_frame_metadata);
 }
 
 void LayerTreeImpl::ClearSwapPromises() {
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 90091ab..e3848ff 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -48,6 +48,7 @@
 class LayerTreeSettings;
 class MemoryHistory;
 class PictureLayerImpl;
+class RenderFrameMetadata;
 class TaskRunnerProvider;
 class TileManager;
 class UIResourceRequest;
@@ -443,7 +444,9 @@
       std::vector<std::unique_ptr<SwapPromise>> new_swap_promises);
   void AppendSwapPromises(
       std::vector<std::unique_ptr<SwapPromise>> new_swap_promises);
-  void FinishSwapPromises(viz::CompositorFrameMetadata* metadata);
+  void FinishSwapPromises(
+      viz::CompositorFrameMetadata* compositor_frame_metadata,
+      RenderFrameMetadata* render_frame_metadata);
   void ClearSwapPromises();
   void BreakSwapPromises(SwapPromise::DidNotSwapReason reason);
 
diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc
index 2be267a9..38029c53 100644
--- a/cc/trees/layer_tree_impl_unittest.cc
+++ b/cc/trees/layer_tree_impl_unittest.cc
@@ -2285,7 +2285,9 @@
   ~PersistentSwapPromise() override = default;
 
   void DidActivate() override {}
-  MOCK_METHOD1(WillSwap, void(viz::CompositorFrameMetadata* metadata));
+  MOCK_METHOD2(WillSwap,
+               void(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                    RenderFrameMetadata* render_frame_metadata));
   MOCK_METHOD0(DidSwap, void());
 
   DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override {
@@ -2304,7 +2306,8 @@
   ~NotPersistentSwapPromise() override = default;
 
   void DidActivate() override {}
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override {}
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                RenderFrameMetadata* render_frame_metadata) override {}
   void DidSwap() override {}
 
   DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override {
@@ -2342,9 +2345,9 @@
   for (size_t i = 0; i < persistent_promises.size(); ++i) {
     SCOPED_TRACE(testing::Message() << "While checking case #" << i);
     ASSERT_TRUE(persistent_promises[i]);
-    EXPECT_CALL(*persistent_promises[i], WillSwap(testing::_));
+    EXPECT_CALL(*persistent_promises[i], WillSwap(testing::_, testing::_));
   }
-  host_impl().active_tree()->FinishSwapPromises(nullptr);
+  host_impl().active_tree()->FinishSwapPromises(nullptr, nullptr);
 }
 
 TEST_F(LayerTreeImplTest, NotPersistentSwapPromisesAreDroppedWhenSwapFails) {
diff --git a/cc/trees/render_frame_metadata.cc b/cc/trees/render_frame_metadata.cc
new file mode 100644
index 0000000..191b28c4
--- /dev/null
+++ b/cc/trees/render_frame_metadata.cc
@@ -0,0 +1,24 @@
+// Copyright 2018 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/render_frame_metadata.h"
+
+namespace cc {
+
+RenderFrameMetadata::RenderFrameMetadata() = default;
+
+RenderFrameMetadata::RenderFrameMetadata(const RenderFrameMetadata& other) =
+    default;
+
+RenderFrameMetadata::RenderFrameMetadata(RenderFrameMetadata&& other) = default;
+
+RenderFrameMetadata::~RenderFrameMetadata() {}
+
+RenderFrameMetadata& RenderFrameMetadata::operator=(
+    const RenderFrameMetadata&) = default;
+
+RenderFrameMetadata& RenderFrameMetadata::operator=(
+    RenderFrameMetadata&& other) = default;
+
+}  // namespace cc
diff --git a/cc/trees/render_frame_metadata.h b/cc/trees/render_frame_metadata.h
new file mode 100644
index 0000000..a5653103
--- /dev/null
+++ b/cc/trees/render_frame_metadata.h
@@ -0,0 +1,30 @@
+// Copyright 2018 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_TREES_RENDER_FRAME_METADATA_H_
+#define CC_TREES_RENDER_FRAME_METADATA_H_
+
+#include "cc/cc_export.h"
+#include "ui/gfx/geometry/vector2d_f.h"
+
+namespace cc {
+
+class CC_EXPORT RenderFrameMetadata {
+ public:
+  RenderFrameMetadata();
+  RenderFrameMetadata(const RenderFrameMetadata& other);
+  RenderFrameMetadata(RenderFrameMetadata&& other);
+  ~RenderFrameMetadata();
+
+  RenderFrameMetadata& operator=(const RenderFrameMetadata&);
+  RenderFrameMetadata& operator=(RenderFrameMetadata&& other);
+
+  // Scroll offset and scale of the root layer. This can be used for tasks
+  // like positioning windowed plugins.
+  gfx::Vector2dF root_scroll_offset;
+};
+
+}  // namespace cc
+
+#endif  // CC_TREES_RENDER_FRAME_METADATA_H_
diff --git a/cc/trees/swap_promise.h b/cc/trees/swap_promise.h
index 81ec7cd0..0ab6136 100644
--- a/cc/trees/swap_promise.h
+++ b/cc/trees/swap_promise.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "cc/cc_export.h"
+#include "cc/trees/render_frame_metadata.h"
 #include "components/viz/common/quads/compositor_frame_metadata.h"
 
 namespace cc {
@@ -61,7 +62,8 @@
   virtual ~SwapPromise() {}
 
   virtual void DidActivate() = 0;
-  virtual void WillSwap(viz::CompositorFrameMetadata* metadata) = 0;
+  virtual void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                        RenderFrameMetadata* render_frame_metadata) = 0;
   virtual void DidSwap() = 0;
   // Return |KEEP_ACTIVE| if this promise should remain active (should not be
   // broken by the owner).
diff --git a/cc/trees/swap_promise_manager_unittest.cc b/cc/trees/swap_promise_manager_unittest.cc
index 59bd0980..85bfa97 100644
--- a/cc/trees/swap_promise_manager_unittest.cc
+++ b/cc/trees/swap_promise_manager_unittest.cc
@@ -31,7 +31,8 @@
   ~MockSwapPromise() override = default;
 
   void DidActivate() override {}
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override {}
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                RenderFrameMetadata* render_frame_metadata) override {}
   void DidSwap() override {}
   DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override {
     return DidNotSwapAction::BREAK_PROMISE;
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 16b5bfd..bc17a4a 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -31,6 +31,7 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "cc/base/switches.h"
+#include "cc/trees/render_frame_metadata.h"
 #include "components/viz/common/features.h"
 #include "components/viz/common/quads/compositor_frame.h"
 #include "components/viz/common/switches.h"
@@ -630,6 +631,8 @@
     IPC_MESSAGE_HANDLER(DragHostMsg_UpdateDragCursor, OnUpdateDragCursor)
     IPC_MESSAGE_HANDLER(ViewHostMsg_FrameSwapMessages,
                         OnFrameSwapMessagesReceived)
+    IPC_MESSAGE_HANDLER(ViewHostMsg_OnRenderFrameSubmitted,
+                        OnRenderFrameMetadata)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
 
@@ -2919,4 +2922,9 @@
     input_router_->ProgressFling(current_time);
 }
 
+void RenderWidgetHostImpl::OnRenderFrameMetadata(
+    const cc::RenderFrameMetadata& metadata) {
+  last_render_frame_metadata_ = metadata;
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 433ef3e0..ea9fa4f8 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -79,6 +79,7 @@
 
 namespace cc {
 struct BeginFrameAck;
+class RenderFrameMetadata;
 }  // namespace cc
 
 namespace gfx {
@@ -801,6 +802,8 @@
       uint32_t last_shared_bitmap_sequence_number) override;
   void SetupInputRouter();
 
+  void OnRenderFrameMetadata(const cc::RenderFrameMetadata& metadata);
+
 #if defined(OS_MACOSX)
   device::mojom::WakeLock* GetWakeLock();
 #endif
@@ -1019,6 +1022,7 @@
   viz::mojom::CompositorFrameSinkClientPtr renderer_compositor_frame_sink_;
 
   viz::CompositorFrameMetadata last_frame_metadata_;
+  cc::RenderFrameMetadata last_render_frame_metadata_;
 
   // Last non-zero frame token received from the renderer. Any swap messsages
   // having a token less than or equal to this value will be processed.
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 2e45c773..18173c81 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -768,6 +768,10 @@
 // Sent in reply to ViewMsg_WaitForNextFrameForTests.
 IPC_MESSAGE_ROUTED0(ViewHostMsg_WaitForNextFrameForTests_ACK)
 
+// Sent once a frame with new RenderFrameMetadata has been submitted.
+IPC_MESSAGE_ROUTED1(ViewHostMsg_OnRenderFrameSubmitted,
+                    cc::RenderFrameMetadata /* metadata */)
+
 // Acknowledges that a SelectWordAroundCaret completed with the specified
 // result and adjustments to the selection offsets.
 IPC_MESSAGE_ROUTED3(ViewHostMsg_SelectWordAroundCaretAck,
diff --git a/content/renderer/gpu/queue_message_swap_promise.cc b/content/renderer/gpu/queue_message_swap_promise.cc
index 4d4fa13..43d8fdf 100644
--- a/content/renderer/gpu/queue_message_swap_promise.cc
+++ b/content/renderer/gpu/queue_message_swap_promise.cc
@@ -44,7 +44,9 @@
   // The OutputSurface will take care of the Drain+Send.
 }
 
-void QueueMessageSwapPromise::WillSwap(viz::CompositorFrameMetadata* metadata) {
+void QueueMessageSwapPromise::WillSwap(
+    viz::CompositorFrameMetadata* compositor_frame_metadata,
+    cc::RenderFrameMetadata* render_frame_metadata) {
 #if DCHECK_IS_ON()
   DCHECK(!completed_);
 #endif
@@ -55,12 +57,17 @@
         send_message_scope = message_queue_->AcquireSendMessageScope();
     std::vector<std::unique_ptr<IPC::Message>> messages;
     message_queue_->DrainMessages(&messages);
+
+    messages.push_back(base::MakeUnique<ViewHostMsg_OnRenderFrameSubmitted>(
+        message_queue_->routing_id(), *render_frame_metadata));
+
     std::vector<IPC::Message> messages_to_send;
     FrameSwapMessageQueue::TransferMessages(&messages, &messages_to_send);
     if (!messages_to_send.empty()) {
-      metadata->frame_token = message_queue_->AllocateFrameToken();
+      compositor_frame_metadata->frame_token =
+          message_queue_->AllocateFrameToken();
       message_sender_->Send(new ViewHostMsg_FrameSwapMessages(
-          message_queue_->routing_id(), metadata->frame_token,
+          message_queue_->routing_id(), compositor_frame_metadata->frame_token,
           messages_to_send));
     }
   }
diff --git a/content/renderer/gpu/queue_message_swap_promise.h b/content/renderer/gpu/queue_message_swap_promise.h
index f888f2f..074337f 100644
--- a/content/renderer/gpu/queue_message_swap_promise.h
+++ b/content/renderer/gpu/queue_message_swap_promise.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "base/memory/ref_counted.h"
+#include "cc/trees/render_frame_metadata.h"
 #include "cc/trees/swap_promise.h"
 
 namespace IPC {
@@ -27,7 +28,8 @@
   ~QueueMessageSwapPromise() override;
 
   void DidActivate() override;
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override;
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                cc::RenderFrameMetadata* render_frame_metadata) override;
   void DidSwap() override;
   DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override;
 
diff --git a/content/renderer/gpu/queue_message_swap_promise_unittest.cc b/content/renderer/gpu/queue_message_swap_promise_unittest.cc
index 42020a9..4929bd45 100644
--- a/content/renderer/gpu/queue_message_swap_promise_unittest.cc
+++ b/content/renderer/gpu/queue_message_swap_promise_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/test/scoped_task_environment.h"
+#include "cc/trees/render_frame_metadata.h"
 #include "cc/trees/swap_promise.h"
 #include "content/common/view_messages.h"
 #include "content/renderer/gpu/frame_swap_message_queue.h"
@@ -145,7 +146,8 @@
     for (const auto& promise : promises_) {
       if (promise.get()) {
         promise->DidActivate();
-        promise->WillSwap(&dummy_metadata_);
+        promise->WillSwap(&dummy_compositor_frame_metadata_,
+                          &dummy_render_frame_metadata_);
         promise->DidSwap();
       }
     }
@@ -160,7 +162,8 @@
   scoped_refptr<TestSyncMessageFilter> sync_message_filter_;
   std::vector<IPC::Message> messages_;
   std::vector<std::unique_ptr<cc::SwapPromise>> promises_;
-  viz::CompositorFrameMetadata dummy_metadata_;
+  viz::CompositorFrameMetadata dummy_compositor_frame_metadata_;
+  cc::RenderFrameMetadata dummy_render_frame_metadata_;
 
  private:
   std::vector<std::unique_ptr<IPC::Message>> next_swap_messages_;
@@ -177,7 +180,8 @@
 
   ASSERT_TRUE(promises_[0].get());
   promises_[0]->DidActivate();
-  promises_[0]->WillSwap(&dummy_metadata_);
+  promises_[0]->WillSwap(&dummy_compositor_frame_metadata_,
+                         &dummy_render_frame_metadata_);
   promises_[0]->DidSwap();
 
   EXPECT_TRUE(DirectSendMessages().empty());
@@ -282,12 +286,13 @@
   QueueMessages(data, arraysize(data));
 
   promises_[0]->DidActivate();
-  promises_[0]->WillSwap(&dummy_metadata_);
+  promises_[0]->WillSwap(&dummy_compositor_frame_metadata_,
+                         &dummy_render_frame_metadata_);
   promises_[0]->DidSwap();
   ASSERT_FALSE(promises_[1].get());
   std::vector<std::unique_ptr<IPC::Message>> messages;
   messages.swap(LastSwapMessages());
-  EXPECT_EQ(2u, messages.size());
+  EXPECT_EQ(3u, messages.size());
   EXPECT_TRUE(ContainsMessage(messages, messages_[0]));
   EXPECT_TRUE(ContainsMessage(messages, messages_[1]));
   EXPECT_FALSE(ContainsMessage(messages, messages_[2]));
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index cebf457..31c83a4c 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -112,7 +112,8 @@
   ~ReportTimeSwapPromise() override;
 
   void DidActivate() override {}
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override {}
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                cc::RenderFrameMetadata* render_frame_metadata) override {}
   void DidSwap() override;
   DidNotSwapAction DidNotSwap(DidNotSwapReason reason) override;
 
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index c1409183..09459d2 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -451,9 +451,10 @@
 
   void DidActivate() override {}
 
-  void WillSwap(viz::CompositorFrameMetadata* metadata) override {
+  void WillSwap(viz::CompositorFrameMetadata* compositor_frame_metadata,
+                cc::RenderFrameMetadata* render_frame_metadata) override {
     DCHECK(!latency_info_.terminated());
-    metadata->latency_info.push_back(latency_info_);
+    compositor_frame_metadata->latency_info.push_back(latency_info_);
   }
 
   void DidSwap() override {}
diff --git a/content/test/layouttest_support.cc b/content/test/layouttest_support.cc
index 4f00036..1814b99 100644
--- a/content/test/layouttest_support.cc
+++ b/content/test/layouttest_support.cc
@@ -286,7 +286,8 @@
     DCHECK(layer_tree_frame_sink_from_commit_);
   }
   void DidActivate() override {}
-  void WillSwap(viz::CompositorFrameMetadata*) override {
+  void WillSwap(viz::CompositorFrameMetadata*,
+                cc::RenderFrameMetadata*) override {
     layer_tree_frame_sink_from_commit_->RequestCopyOfOutput(
         std::move(copy_request_));
   }