Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(399)

Unified Diff: ui/compositor/compositor.cc

Issue 1414533003: Make ui::Compositor BeginFrame subscription robust (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Proper unsubscribe Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;

Powered by Google App Engine
This is Rietveld 408576698