Index: ui/compositor/compositor.cc |
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc |
index f3a3c8bd74c6830c0db843127f5beefd70db0e18..91e550344182a924ded8f8ba601f6e3cd95b546b 100644 |
--- a/ui/compositor/compositor.cc |
+++ b/ui/compositor/compositor.cc |
@@ -8,9 +8,11 @@ |
#include <deque> |
#include "base/bind.h" |
+#include "base/cancelable_callback.h" |
#include "base/command_line.h" |
#include "base/memory/singleton.h" |
#include "base/message_loop.h" |
+#include "base/run_loop.h" |
#include "base/string_util.h" |
#include "base/threading/thread.h" |
#include "base/threading/thread_restrictions.h" |
@@ -104,6 +106,51 @@ void ResetImplicitFactory() { |
namespace ui { |
+class DrawWaiter : public ui::CompositorObserver { |
+ public: |
+ DrawWaiter() : did_draw_(false) {} |
+ |
+ bool Wait(ui::Compositor* compositor) { |
+ did_draw_ = false; |
+ compositor->AddObserver(this); |
+ wait_run_loop_.reset(new base::RunLoop()); |
+ base::CancelableClosure timeout( |
+ base::Bind(&DrawWaiter::TimedOutWhileWaiting, |
+ base::Unretained(this))); |
+ MessageLoop::current()->PostDelayedTask( |
+ FROM_HERE, timeout.callback(), |
+ base::TimeDelta::FromMilliseconds(compositor->kDrawWaitTimeOutMs)); |
+ wait_run_loop_->Run(); |
+ compositor->RemoveObserver(this); |
+ return did_draw_; |
+ } |
+ |
+ private: |
+ void TimedOutWhileWaiting() { |
+ LOG(ERROR) << "Timed out waiting for draw."; |
+ wait_run_loop_->Quit(); |
+ } |
+ |
+ // ui::CompositorObserver implementation. |
+ virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE {} |
+ virtual void OnCompositingStarted(Compositor* compositor, |
+ base::TimeTicks start_time) OVERRIDE {} |
+ virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE { |
+ did_draw_ = true; |
+ wait_run_loop_->Quit(); |
+ } |
+ virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE {} |
+ virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE {} |
+ virtual void OnUpdateVSyncParameters(Compositor* compositor, |
+ base::TimeTicks timebase, |
+ base::TimeDelta interval) OVERRIDE {} |
+ |
+ scoped_ptr<base::RunLoop> wait_run_loop_; |
+ bool did_draw_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(DrawWaiter); |
+}; |
+ |
// static |
ContextFactory* ContextFactory::GetInstance() { |
if (!g_context_factory) |
@@ -697,6 +744,11 @@ scoped_refptr<CompositorLock> Compositor::GetCompositorLock() { |
return compositor_lock_; |
} |
+bool Compositor::WaitForDraw() { |
+ DrawWaiter draw_waiter; |
+ return draw_waiter.Wait(this); |
+} |
+ |
void Compositor::UnlockCompositor() { |
DCHECK(compositor_lock_); |
compositor_lock_ = NULL; |