Index: content/browser/renderer_host/render_widget_host_view_aura.cc |
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc |
index 508ae90e472c19683073aa2263ec6d6b8b3ce764..e51b45f863680a11c24b7bab921e3ccd225b9349 100644 |
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc |
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc |
@@ -370,6 +370,7 @@ RenderWidgetHostViewAura::RenderWidgetHostViewAura(RenderWidgetHost* host, |
is_loading_(false), |
has_composition_text_(false), |
begin_frame_source_(nullptr), |
+ latest_confirmed_frame_(cc::BeginFrameArgs::kInvalidFrameNumber), |
needs_begin_frames_(false), |
needs_flush_input_(false), |
added_frame_observer_(false), |
@@ -676,8 +677,13 @@ void RenderWidgetHostViewAura::UpdateNeedsBeginFramesInternal() { |
begin_frame_source_->RemoveObserver(this); |
} |
-void RenderWidgetHostViewAura::OnBeginFrame( |
- const cc::BeginFrameArgs& args) { |
+void RenderWidgetHostViewAura::OnBeginFrame(const cc::BeginFrameArgs& args) { |
+ if (args.source_id != last_begin_frame_args_.source_id) { |
+ // Consider us up to date up to the previous BeginFrame. |
+ DCHECK_LT(cc::BeginFrameArgs::kInvalidFrameNumber, args.sequence_number); |
+ latest_confirmed_frame_ = args.sequence_number - 1; |
+ } |
+ |
needs_flush_input_ = false; |
host_->FlushInput(); |
UpdateNeedsBeginFramesInternal(); |
@@ -935,10 +941,35 @@ void RenderWidgetHostViewAura::OnSwapCompositorFrame( |
selection.end.SetEdge(end_edge_top, end_edge_bottom); |
} |
+ uint64_t begin_frame_source_id = frame.metadata.begin_frame_source_id; |
+ uint64_t begin_frame_number = frame.metadata.begin_frame_number; |
+ uint64_t latest_confirmed_frame = frame.metadata.latest_confirmed_frame; |
+ |
delegated_frame_host_->SwapDelegatedFrame(compositor_frame_sink_id, |
std::move(frame)); |
SelectionUpdated(selection.is_editable, selection.is_empty_text_form_control, |
selection.start, selection.end); |
+ |
+ // The CompositorFrame's damage was only incorporated if it wasn't skipped. |
+ bool has_damage = false; |
+ if (!delegated_frame_host_->skipped_frames()) { |
+ latest_confirmed_frame_ = latest_confirmed_frame; |
+ has_damage = true; |
+ } |
+ |
+ cc::BeginFrameAck ack(begin_frame_source_id, begin_frame_number, |
+ latest_confirmed_frame_, 0, has_damage); |
+ if (begin_frame_source_) |
+ begin_frame_source_->DidFinishFrame(this, ack); |
+} |
+ |
+void RenderWidgetHostViewAura::OnBeginFrameDidNotDraw( |
+ const cc::BeginFrameAck& ack) { |
+ // DelegatedFrameHost may have skipped the last frame(s). |
+ cc::BeginFrameAck modified_ack = ack; |
+ modified_ack.latest_confirmed_frame = latest_confirmed_frame_; |
+ if (begin_frame_source_) |
+ begin_frame_source_->DidFinishFrame(this, modified_ack); |
} |
void RenderWidgetHostViewAura::ClearCompositorFrame() { |