Index: content/browser/renderer_host/render_widget_host_impl.cc |
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc |
index 093491511694b133333f9365eb3a9d905d365066..9914db5ce83b44decb9fab14cf8324256ae85c9c 100644 |
--- a/content/browser/renderer_host/render_widget_host_impl.cc |
+++ b/content/browser/renderer_host/render_widget_host_impl.cc |
@@ -1820,10 +1820,36 @@ bool RenderWidgetHostImpl::OnSwapCompositorFrame( |
ViewHostMsg_SwapCompositorFrame::Param param; |
if (!ViewHostMsg_SwapCompositorFrame::Read(&message, ¶m)) |
return false; |
- cc::CompositorFrame frame(std::move(std::get<1>(param))); |
uint32_t compositor_frame_sink_id = std::get<0>(param); |
+ cc::LocalSurfaceId local_surface_id = std::get<1>(param); |
+ cc::CompositorFrame frame(std::move(std::get<2>(param))); |
std::vector<IPC::Message> messages_to_deliver_with_frame; |
- messages_to_deliver_with_frame.swap(std::get<2>(param)); |
+ messages_to_deliver_with_frame.swap(std::get<3>(param)); |
+ |
+ // The renderer should not send empty frames. |
+ if (frame.render_pass_list.empty()) { |
+ DLOG(ERROR) << "Renderer sent an empty frame."; |
+ return false; |
+ } |
+ |
+ // The renderer must allocate a new LocalSurfaceId if frame size or device |
+ // scale factor changes. |
+ float device_scale_factor = frame.metadata.device_scale_factor; |
+ const gfx::Size& frame_size = |
+ frame.render_pass_list.back()->output_rect.size(); |
+ if (local_surface_id == last_local_surface_id_ && |
+ (frame_size != last_frame_size_ || |
+ device_scale_factor != last_device_scale_factor_)) { |
+ DLOG(ERROR) << "Renderer submitted frame of wrong size to its surface." |
+ << " Expected: size=" << last_frame_size_.ToString() |
+ << ",scale=" << last_device_scale_factor_ |
+ << " Received: size=" << frame_size.ToString() |
+ << ",scale=" << device_scale_factor; |
+ return false; |
+ } |
+ last_local_surface_id_ = local_surface_id; |
+ last_frame_size_ = frame_size; |
+ last_device_scale_factor_ = device_scale_factor; |
if (frame.metadata.begin_frame_ack.sequence_number < |
cc::BeginFrameArgs::kStartingFrameNumber) { |
@@ -1856,7 +1882,8 @@ bool RenderWidgetHostImpl::OnSwapCompositorFrame( |
// compositor frame can arrive before the navigation commit message that |
// updates that value. |
if (view_ && frame.metadata.content_source_id >= current_content_source_id_) { |
- view_->OnSwapCompositorFrame(compositor_frame_sink_id, std::move(frame)); |
+ view_->OnSwapCompositorFrame(compositor_frame_sink_id, local_surface_id, |
+ std::move(frame)); |
view_->DidReceiveRendererFrame(); |
} else { |
cc::ReturnedResourceArray resources; |