| Index: content/renderer/gpu/compositor_external_begin_frame_source.cc | 
| diff --git a/content/renderer/gpu/compositor_external_begin_frame_source.cc b/content/renderer/gpu/compositor_external_begin_frame_source.cc | 
| index e2d13608ac781ece2ba7576d23a3ef8cade0cfb6..0538f47bdb989da90b4d67de9dfaedb65816a859 100644 | 
| --- a/content/renderer/gpu/compositor_external_begin_frame_source.cc | 
| +++ b/content/renderer/gpu/compositor_external_begin_frame_source.cc | 
| @@ -14,17 +14,18 @@ CompositorExternalBeginFrameSource::CompositorExternalBeginFrameSource( | 
| CompositorForwardingMessageFilter* filter, | 
| IPC::SyncMessageFilter* sync_message_filter, | 
| int routing_id) | 
| -    : begin_frame_source_filter_(filter), | 
| +    : external_begin_frame_source_(this), | 
| +      begin_frame_source_filter_(filter), | 
| message_sender_(sync_message_filter), | 
| routing_id_(routing_id) { | 
| -  DCHECK(begin_frame_source_filter_.get()); | 
| -  DCHECK(message_sender_.get()); | 
| +  DCHECK(begin_frame_source_filter_); | 
| +  DCHECK(message_sender_); | 
| DetachFromThread(); | 
| } | 
|  | 
| CompositorExternalBeginFrameSource::~CompositorExternalBeginFrameSource() { | 
| DCHECK(CalledOnValidThread()); | 
| -  if (begin_frame_source_proxy_.get()) { | 
| +  if (begin_frame_source_proxy_) { | 
| begin_frame_source_proxy_->ClearBeginFrameSource(); | 
| begin_frame_source_filter_->RemoveHandlerOnCompositorThread( | 
| routing_id_, | 
| @@ -35,56 +36,34 @@ CompositorExternalBeginFrameSource::~CompositorExternalBeginFrameSource() { | 
| void CompositorExternalBeginFrameSource::AddObserver( | 
| cc::BeginFrameObserver* obs) { | 
| DCHECK(CalledOnValidThread()); | 
| -  DCHECK(obs); | 
| -  DCHECK(observers_.find(obs) == observers_.end()); | 
|  | 
| -  SetClientReady(); | 
| -  bool observers_was_empty = observers_.empty(); | 
| -  observers_.insert(obs); | 
| -  obs->OnBeginFrameSourcePausedChanged(paused_); | 
| -  if (observers_was_empty) | 
| -    Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, true)); | 
| - | 
| -  // Send a MISSED begin frame if necessary. | 
| -  if (missed_begin_frame_args_.IsValid()) { | 
| -    cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); | 
| -    if (!last_args.IsValid() || | 
| -        (missed_begin_frame_args_.frame_time > last_args.frame_time)) { | 
| -      obs->OnBeginFrame(missed_begin_frame_args_); | 
| -    } | 
| +  if (!begin_frame_source_proxy_) { | 
| +    begin_frame_source_proxy_ = | 
| +        new CompositorExternalBeginFrameSourceProxy(this); | 
| +    begin_frame_source_filter_handler_ = | 
| +        base::Bind(&CompositorExternalBeginFrameSourceProxy::OnMessageReceived, | 
| +                   begin_frame_source_proxy_); | 
| +    begin_frame_source_filter_->AddHandlerOnCompositorThread( | 
| +        routing_id_, begin_frame_source_filter_handler_); | 
| } | 
| + | 
| +  external_begin_frame_source_.AddObserver(obs); | 
| } | 
|  | 
| void CompositorExternalBeginFrameSource::RemoveObserver( | 
| cc::BeginFrameObserver* obs) { | 
| -  DCHECK(obs); | 
| -  DCHECK(observers_.find(obs) != observers_.end()); | 
| - | 
| -  observers_.erase(obs); | 
| -  if (observers_.empty()) { | 
| -    missed_begin_frame_args_ = cc::BeginFrameArgs(); | 
| -    Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, false)); | 
| -  } | 
| +  external_begin_frame_source_.RemoveObserver(obs); | 
| } | 
|  | 
| -void CompositorExternalBeginFrameSource::SetClientReady() { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  if (begin_frame_source_proxy_) | 
| -    return; | 
| -  begin_frame_source_proxy_ = | 
| -      new CompositorExternalBeginFrameSourceProxy(this); | 
| -  begin_frame_source_filter_handler_ = base::Bind( | 
| -      &CompositorExternalBeginFrameSourceProxy::OnMessageReceived, | 
| -      begin_frame_source_proxy_); | 
| -  begin_frame_source_filter_->AddHandlerOnCompositorThread( | 
| -      routing_id_, | 
| -      begin_frame_source_filter_handler_); | 
| +void CompositorExternalBeginFrameSource::OnNeedsBeginFrames( | 
| +    bool needs_begin_frames) { | 
| +  Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, needs_begin_frames)); | 
| } | 
|  | 
| void CompositorExternalBeginFrameSource::OnMessageReceived( | 
| const IPC::Message& message) { | 
| DCHECK(CalledOnValidThread()); | 
| -  DCHECK(begin_frame_source_proxy_.get()); | 
| +  DCHECK(begin_frame_source_proxy_); | 
| IPC_BEGIN_MESSAGE_MAP(CompositorExternalBeginFrameSource, message) | 
| IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused, | 
| OnSetBeginFrameSourcePaused) | 
| @@ -94,22 +73,12 @@ void CompositorExternalBeginFrameSource::OnMessageReceived( | 
|  | 
| void CompositorExternalBeginFrameSource::OnSetBeginFrameSourcePaused( | 
| bool paused) { | 
| -  if (paused_ == paused) | 
| -    return; | 
| -  paused_ = paused; | 
| -  std::unordered_set<cc::BeginFrameObserver*> observers(observers_); | 
| -  for (auto* obs : observers) | 
| -    obs->OnBeginFrameSourcePausedChanged(paused_); | 
| +  external_begin_frame_source_.OnSetBeginFrameSourcePaused(paused); | 
| } | 
|  | 
| void CompositorExternalBeginFrameSource::OnBeginFrame( | 
| -  const cc::BeginFrameArgs& args) { | 
| -  DCHECK(CalledOnValidThread()); | 
| -  missed_begin_frame_args_ = args; | 
| -  missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; | 
| -  std::unordered_set<cc::BeginFrameObserver*> observers(observers_); | 
| -  for (auto* obs : observers) | 
| -    obs->OnBeginFrame(args); | 
| +    const cc::BeginFrameArgs& args) { | 
| +  external_begin_frame_source_.OnBeginFrame(args); | 
| } | 
|  | 
| bool CompositorExternalBeginFrameSource::Send(IPC::Message* message) { | 
|  |