Index: content/browser/renderer_host/delegated_frame_host.cc |
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc |
index 085fd44c7b5ec52c6b00654e12193380e92a48cc..2f97166ea678d77f93fb6dd0187550c45b39ff24 100644 |
--- a/content/browser/renderer_host/delegated_frame_host.cc |
+++ b/content/browser/renderer_host/delegated_frame_host.cc |
@@ -831,7 +831,31 @@ void DelegatedFrameHost::OnNeedsBeginFrames(bool needs_begin_frames) { |
support_->SetNeedsBeginFrame(needs_begin_frames); |
} |
-void DelegatedFrameHost::OnDidFinishFrame(const cc::BeginFrameAck& ack) {} |
+void DelegatedFrameHost::OnDidFinishFrame(const cc::BeginFrameAck& ack) { |
+ if (ack.source_id != latest_confirmed_begin_frame_source_id_) { |
+ // Source changed, we don't know our freshness anymore. |
+ latest_confirmed_begin_frame_sequence_number_ = |
+ cc::BeginFrameArgs::kInvalidFrameNumber; |
+ } |
+ |
+ cc::BeginFrameAck modified_ack = ack; |
+ if (skipped_frames_) { |
+ // If we skipped the last frame(s), we didn't incorporate the last |
+ // CompositorFrame's damage, so need to wait for the next one before |
+ // confirming newer sequence numbers. |
+ modified_ack.has_damage = false; |
+ modified_ack.latest_confirmed_sequence_number = |
+ latest_confirmed_begin_frame_sequence_number_; |
+ } else { |
+ latest_confirmed_begin_frame_source_id_ = modified_ack.source_id; |
+ latest_confirmed_begin_frame_sequence_number_ = |
+ modified_ack.latest_confirmed_sequence_number; |
+ } |
+ |
+ // TODO(eseckler): The interface to CompositorFrameSinkSupport should use |
+ // SubmitCompositorFrame and BeginFrameDidNotSwap instead of DidFinishFrame. |
+ support_->DidFinishFrame(modified_ack); |
+} |
void DelegatedFrameHost::CreateCompositorFrameSinkSupport() { |
DCHECK(!support_); |