Index: ui/compositor/compositor.cc |
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc |
index f050a64e1a74dede9134fcfe075fd614dcd9841c..61020135e0dac20d2498bc8d08d1887761134236 100644 |
--- a/ui/compositor/compositor.cc |
+++ b/ui/compositor/compositor.cc |
@@ -156,6 +156,8 @@ Compositor::~Compositor() { |
FOR_EACH_OBSERVER(CompositorObserver, observer_list_, |
OnCompositingShuttingDown(this)); |
+ DCHECK(begin_frame_observer_list_.empty()); |
+ |
if (root_layer_) |
root_layer_->SetCompositor(NULL); |
@@ -283,6 +285,33 @@ bool Compositor::HasAnimationObserver( |
return animation_observer_list_.HasObserver(observer); |
} |
+void Compositor::AddBeginFrameObserver(CompositorBeginFrameObserver* observer) { |
+ DCHECK(std::find(begin_frame_observer_list_.begin(), |
+ begin_frame_observer_list_.end(), observer) == |
+ begin_frame_observer_list_.end()); |
+ |
+ if (begin_frame_observer_list_.empty()) |
+ host_->SetChildrenNeedBeginFrames(true); |
+ |
+ 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); |
+ |
+ if (begin_frame_observer_list_.empty()) { |
+ host_->SetChildrenNeedBeginFrames(false); |
+ missed_begin_frame_args_ = cc::BeginFrameArgs(); |
+ } |
+} |
+ |
void Compositor::BeginMainFrame(const cc::BeginFrameArgs& args) { |
FOR_EACH_OBSERVER(CompositorAnimationObserver, |
animation_observer_list_, |
@@ -345,6 +374,14 @@ void Compositor::DidAbortSwapBuffers() { |
OnCompositingAborted(this)); |
} |
+void Compositor::SendBeginFramesToChildren(const cc::BeginFrameArgs& args) { |
+ for (auto observer : begin_frame_observer_list_) |
+ observer->OnSendBeginFrame(args); |
+ |
+ missed_begin_frame_args_ = args; |
+ missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |
+} |
+ |
const cc::LayerTreeDebugState& Compositor::GetLayerTreeDebugState() const { |
return host_->debug_state(); |
} |