 Chromium Code Reviews
 Chromium Code Reviews Issue 1414533003:
  Make ui::Compositor BeginFrame subscription robust  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1414533003:
  Make ui::Compositor BeginFrame subscription robust  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| Index: ui/compositor/compositor.cc | 
| diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc | 
| index 6d1bdace3345cb8ae0d8bd054652013f694ae9cb..afe32ba7a5cbee21485cb820ee00cfaff3e0c0f1 100644 | 
| --- a/ui/compositor/compositor.cc | 
| +++ b/ui/compositor/compositor.cc | 
| @@ -194,8 +194,6 @@ Compositor::~Compositor() { | 
| FOR_EACH_OBSERVER(CompositorAnimationObserver, animation_observer_list_, | 
| OnCompositingShuttingDown(this)); | 
| - DCHECK(begin_frame_observer_list_.empty()); | 
| 
brianderson
2015/10/21 23:12:59
Why is this no longer valid?
 
jdduke (slow)
2015/10/21 23:46:16
ObserverList does that for us (the second "true" a
 | 
| - | 
| if (root_layer_) | 
| root_layer_->ResetCompositor(); | 
| @@ -359,27 +357,20 @@ bool Compositor::HasAnimationObserver( | 
| } | 
| void Compositor::AddBeginFrameObserver(CompositorBeginFrameObserver* observer) { | 
| - DCHECK(std::find(begin_frame_observer_list_.begin(), | 
| 
brianderson
2015/10/21 23:12:59
Any way to keep this check?
 
jdduke (slow)
2015/10/21 23:46:16
ObserverList also does that for us.
 | 
| - begin_frame_observer_list_.end(), observer) == | 
| - begin_frame_observer_list_.end()); | 
| - | 
| - if (begin_frame_observer_list_.empty()) | 
| + if (!begin_frame_observer_list_.might_have_observers()) | 
| host_->SetChildrenNeedBeginFrames(true); | 
| + begin_frame_observer_list_.AddObserver(observer); | 
| + | 
| if (missed_begin_frame_args_.IsValid()) | 
| observer->OnSendBeginFrame(missed_begin_frame_args_); | 
| - | 
| - begin_frame_observer_list_.push_back(observer); | 
| } | 
| void Compositor::RemoveBeginFrameObserver( | 
| CompositorBeginFrameObserver* observer) { | 
| - auto it = std::find(begin_frame_observer_list_.begin(), | 
| - begin_frame_observer_list_.end(), observer); | 
| - DCHECK(it != begin_frame_observer_list_.end()); | 
| - begin_frame_observer_list_.erase(it); | 
| + begin_frame_observer_list_.RemoveObserver(observer); | 
| - if (begin_frame_observer_list_.empty()) { | 
| + if (!begin_frame_observer_list_.might_have_observers()) { | 
| 
danakj
2015/10/22 18:35:59
Do you need to do this here still, since it is don
 
jdduke (slow)
2015/10/22 18:39:00
I considered that, I suppose it depends on the sem
 | 
| host_->SetChildrenNeedBeginFrames(false); | 
| missed_begin_frame_args_ = cc::BeginFrameArgs(); | 
| } | 
| @@ -452,8 +443,14 @@ void Compositor::DidAbortSwapBuffers() { | 
| } | 
| void Compositor::SendBeginFramesToChildren(const cc::BeginFrameArgs& args) { | 
| - for (auto observer : begin_frame_observer_list_) | 
| - observer->OnSendBeginFrame(args); | 
| + FOR_EACH_OBSERVER(CompositorBeginFrameObserver, begin_frame_observer_list_, | 
| + OnSendBeginFrame(args)); | 
| + | 
| + if (!begin_frame_observer_list_.might_have_observers()) { | 
| + host_->SetChildrenNeedBeginFrames(false); | 
| + missed_begin_frame_args_ = cc::BeginFrameArgs(); | 
| + return; | 
| + } | 
| missed_begin_frame_args_ = args; | 
| missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |