| Index: cc/scheduler/scheduler.cc | 
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc | 
| index 14d5e69e6a0b6521be64398bb0755aca1ce5e559..8d3686277e9b3378728d8158b719542d5e2f6b67 100644 | 
| --- a/cc/scheduler/scheduler.cc | 
| +++ b/cc/scheduler/scheduler.cc | 
| @@ -322,7 +322,11 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) { | 
| // Discard missed begin frames if they are too late. | 
| if (adjusted_args.type == BeginFrameArgs::MISSED && | 
| now > adjusted_args.deadline) { | 
| -    begin_frame_source_->DidFinishFrame(this, 0); | 
| +    BeginFrameAck ack( | 
| +        adjusted_args.source_id, adjusted_args.sequence_number, | 
| +        state_machine_.last_frame_number_compositor_frame_was_fresh(), 0, | 
| +        false); | 
| +    begin_frame_source_->DidFinishFrame(this, ack); | 
| return; | 
| } | 
|  | 
| @@ -332,7 +336,11 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) { | 
| OnBeginImplFrameDeadline(); | 
| // We may not need begin frames any longer. | 
| if (!observing_begin_frame_source_) { | 
| -      begin_frame_source_->DidFinishFrame(this, 0); | 
| +      BeginFrameAck ack( | 
| +          adjusted_args.source_id, adjusted_args.sequence_number, | 
| +          state_machine_.last_frame_number_compositor_frame_was_fresh(), 0, | 
| +          false); | 
| +      begin_frame_source_->DidFinishFrame(this, ack); | 
| return; | 
| } | 
| } | 
| @@ -391,8 +399,13 @@ void Scheduler::BeginImplFrameWithDeadline(const BeginFrameArgs& args) { | 
| can_activate_before_deadline)) { | 
| TRACE_EVENT_INSTANT0("cc", "SkipBeginImplFrameToReduceLatency", | 
| TRACE_EVENT_SCOPE_THREAD); | 
| -    if (begin_frame_source_) | 
| -      begin_frame_source_->DidFinishFrame(this, 0); | 
| +    if (begin_frame_source_) { | 
| +      BeginFrameAck ack( | 
| +          adjusted_args.source_id, adjusted_args.sequence_number, | 
| +          state_machine_.last_frame_number_compositor_frame_was_fresh(), 0, | 
| +          false); | 
| +      begin_frame_source_->DidFinishFrame(this, ack); | 
| +    } | 
| return; | 
| } | 
|  | 
| @@ -420,8 +433,14 @@ void Scheduler::FinishImplFrame() { | 
| ProcessScheduledActions(); | 
|  | 
| client_->DidFinishImplFrame(); | 
| -  if (begin_frame_source_) | 
| -    begin_frame_source_->DidFinishFrame(this, 0); | 
| +  if (begin_frame_source_) { | 
| +    BeginFrameAck ack( | 
| +        begin_main_frame_args_.source_id, | 
| +        begin_main_frame_args_.sequence_number, | 
| +        state_machine_.last_frame_number_compositor_frame_was_fresh(), 0, | 
| +        state_machine_.did_submit_in_last_frame()); | 
| +    begin_frame_source_->DidFinishFrame(this, ack); | 
| +  } | 
| begin_impl_frame_tracker_.Finish(); | 
| } | 
|  | 
| @@ -435,7 +454,7 @@ void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { | 
| DCHECK(state_machine_.HasInitializedCompositorFrameSink()); | 
|  | 
| begin_impl_frame_tracker_.Start(args); | 
| -  state_machine_.OnBeginImplFrame(); | 
| +  state_machine_.OnBeginImplFrame(args.source_id, args.sequence_number); | 
| devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); | 
| compositor_timing_history_->WillBeginImplFrame( | 
| state_machine_.NewActiveTreeLikely()); | 
| @@ -757,4 +776,16 @@ bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 
| SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_STARTED); | 
| } | 
|  | 
| +uint64_t Scheduler::CurrentBeginFrameSourceId() { | 
| +  return begin_main_frame_args_.source_id; | 
| +} | 
| + | 
| +uint64_t Scheduler::CurrentBeginFrameNumber() { | 
| +  return begin_main_frame_args_.sequence_number; | 
| +} | 
| + | 
| +uint64_t Scheduler::OldestIncorporatedFrameForActiveTree() { | 
| +  return state_machine_.last_frame_number_active_tree_was_fresh(); | 
| +} | 
| + | 
| }  // namespace cc | 
|  |