| 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 a762af3d07b90ffde7aa976afbd69d9776720f49..d7cda48a169faeb917428028b0519ca18cd09dda 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 damages were only incorporated if it wasn't skipped.
|
| + bool has_damages = false;
|
| + if (!delegated_frame_host_->skipped_frames()) {
|
| + latest_confirmed_frame_ = latest_confirmed_frame;
|
| + has_damages = true;
|
| + }
|
| +
|
| + cc::BeginFrameAck ack(begin_frame_source_id, begin_frame_number,
|
| + latest_confirmed_frame_, 0, has_damages);
|
| + 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() {
|
|
|