Revert of Enable BeginFrame scheduling on aura (patchset #15 id:270001 of https://codereview.chromium.org/1016033006/)

Reason for revert:
Making Autofill interactive tests incredibly flaky again:
http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Tests%20(1)
http://build.chromium.org/p/chromium.chromiumos/builders/Linux%20ChromiumOS%20Ozone%20Tests%20%281%29/

Original issue's description:
> Enable BeginFrame scheduling on aura
>
> This cl is last partial cl from https://codereview.chromium.org/775143003/
> for easy review.
> Until now, BeginFrame is initiated by each renderer process.
> With this cl, BeginFrame is scheduled from parent(browser) cc scheduler
> to child(renderer) cc scheduler.
> For more detailed information, please see this (http://goo.gl/D1Qxrr)
>
> Also, --enable-begin-frame-scheduling is no longer needed because all platform except Mac
> uses it as a default.
>
> R=brianderson@chromium.org, danakj@chromium.org, mithro@mithis.com
> BUG=372086
>
> Committed: https://crrev.com/17dd2f109f3155ebf183627b63df25f97f34b67f
> Cr-Commit-Position: refs/heads/master@{#322622}
>
> Committed: https://crrev.com/62a759e582743bca13f27d1ce5db3dc2fe66fbb6
> Cr-Commit-Position: refs/heads/master@{#328170}

TBR=brianderson@chromium.org,danakj@chromium.org,mithro@mithis.com,sievers@chromium.org,oshima@chromium.org,boliu@chromium.org,simonhong@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=372086

Review URL: https://codereview.chromium.org/1124523003

Cr-Commit-Position: refs/heads/master@{#328267}
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc
index 49cc4dd3..8520816 100644
--- a/android_webview/lib/main/aw_main_delegate.cc
+++ b/android_webview/lib/main/aw_main_delegate.cc
@@ -60,6 +60,7 @@
   BrowserViewRenderer::CalculateTileMemoryPolicy();
 
   base::CommandLine* cl = base::CommandLine::ForCurrentProcess();
+  cl->AppendSwitch(switches::kEnableBeginFrameScheduling);
 
   // WebView uses the Android system's scrollbars and overscroll glow.
   cl->AppendSwitch(switches::kDisableOverscrollEdgeEffect);
diff --git a/ash/display/display_controller.cc b/ash/display/display_controller.cc
index 1a8ab36..e28472e 100644
--- a/ash/display/display_controller.cc
+++ b/ash/display/display_controller.cc
@@ -37,6 +37,7 @@
 #include "ui/aura/window_tracker.h"
 #include "ui/aura/window_tree_host.h"
 #include "ui/compositor/compositor.h"
+#include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/gfx/display.h"
 #include "ui/gfx/screen.h"
 #include "ui/wm/core/coordinate_conversion.h"
@@ -150,9 +151,9 @@
   DisplayMode mode =
       GetDisplayManager()->GetActiveModeForDisplayId(display.id());
   if (mode.refresh_rate > 0.0f) {
-    host->compositor()->SetAuthoritativeVSyncInterval(
-        base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond /
-                                          mode.refresh_rate));
+    host->compositor()->vsync_manager()->SetAuthoritativeVSyncInterval(
+        base::TimeDelta::FromMicroseconds(
+            base::Time::kMicrosecondsPerSecond / mode.refresh_rate));
   }
 
   // Just movnig the display requires the full redraw.
diff --git a/chrome/browser/chromeos/login/chrome_restart_request.cc b/chrome/browser/chromeos/login/chrome_restart_request.cc
index e76c532..bf31bf3 100644
--- a/chrome/browser/chromeos/login/chrome_restart_request.cc
+++ b/chrome/browser/chromeos/login/chrome_restart_request.cc
@@ -96,6 +96,7 @@
     ::switches::kDisableThreadedScrolling,
     ::switches::kDisableTouchDragDrop,
     ::switches::kDisableTouchEditing,
+    ::switches::kEnableBeginFrameScheduling,
     ::switches::kEnableBlinkFeatures,
     ::switches::kEnableCompositorAnimationTimelines,
     ::switches::kEnableDelegatedRenderer,
diff --git a/content/browser/android/content_startup_flags.cc b/content/browser/android/content_startup_flags.cc
index 93426d8..e679825 100644
--- a/content/browser/android/content_startup_flags.cc
+++ b/content/browser/android/content_startup_flags.cc
@@ -54,6 +54,8 @@
     parsed_command_line->AppendSwitch(switches::kSingleProcess);
   }
 
+  parsed_command_line->AppendSwitch(switches::kEnableBeginFrameScheduling);
+
   parsed_command_line->AppendSwitch(switches::kEnablePinch);
   parsed_command_line->AppendSwitch(switches::kEnableOverlayFullscreenVideo);
   parsed_command_line->AppendSwitch(switches::kEnableOverlayScrollbar);
diff --git a/content/browser/compositor/browser_compositor_output_surface.cc b/content/browser/compositor/browser_compositor_output_surface.cc
index a7181842..6839457 100644
--- a/content/browser/compositor/browser_compositor_output_surface.cc
+++ b/content/browser/compositor/browser_compositor_output_surface.cc
@@ -15,17 +15,21 @@
 
 BrowserCompositorOutputSurface::BrowserCompositorOutputSurface(
     const scoped_refptr<cc::ContextProvider>& context_provider,
+    const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
     scoped_ptr<BrowserCompositorOverlayCandidateValidator>
         overlay_candidate_validator)
     : OutputSurface(context_provider),
+      vsync_manager_(vsync_manager),
       reflector_(nullptr) {
   overlay_candidate_validator_ = overlay_candidate_validator.Pass();
   Initialize();
 }
 
 BrowserCompositorOutputSurface::BrowserCompositorOutputSurface(
-    scoped_ptr<cc::SoftwareOutputDevice> software_device)
+    scoped_ptr<cc::SoftwareOutputDevice> software_device,
+    const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
     : OutputSurface(software_device.Pass()),
+      vsync_manager_(vsync_manager),
       reflector_(nullptr) {
   Initialize();
 }
@@ -34,6 +38,9 @@
   if (reflector_)
     reflector_->DetachFromOutputSurface();
   DCHECK(!reflector_);
+  if (!HasClient())
+    return;
+  vsync_manager_->RemoveObserver(this);
 }
 
 void BrowserCompositorOutputSurface::Initialize() {
@@ -41,13 +48,29 @@
   capabilities_.adjust_deadline_for_parent = false;
 }
 
-void BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu(
+bool BrowserCompositorOutputSurface::BindToClient(
+    cc::OutputSurfaceClient* client) {
+  if (!OutputSurface::BindToClient(client))
+    return false;
+  // Don't want vsync notifications until there is a client.
+  vsync_manager_->AddObserver(this);
+  return true;
+}
+
+void BrowserCompositorOutputSurface::OnUpdateVSyncParameters(
     base::TimeTicks timebase,
     base::TimeDelta interval) {
   DCHECK(HasClient());
   CommitVSyncParameters(timebase, interval);
 }
 
+void BrowserCompositorOutputSurface::OnUpdateVSyncParametersFromGpu(
+    base::TimeTicks timebase,
+    base::TimeDelta interval) {
+  DCHECK(HasClient());
+  vsync_manager_->UpdateVSyncParameters(timebase, interval);
+}
+
 void BrowserCompositorOutputSurface::SetReflector(ReflectorImpl* reflector) {
   // Software mirroring is done by doing a GL copy out of the framebuffer - if
   // we have overlays then that data will be missing.
diff --git a/content/browser/compositor/browser_compositor_output_surface.h b/content/browser/compositor/browser_compositor_output_surface.h
index dc63b68..615a54e3 100644
--- a/content/browser/compositor/browser_compositor_output_surface.h
+++ b/content/browser/compositor/browser_compositor_output_surface.h
@@ -8,6 +8,7 @@
 #include "base/threading/non_thread_safe.h"
 #include "cc/output/output_surface.h"
 #include "content/common/content_export.h"
+#include "ui/compositor/compositor_vsync_manager.h"
 
 namespace cc {
 class SoftwareOutputDevice;
@@ -20,12 +21,19 @@
 class WebGraphicsContext3DCommandBufferImpl;
 
 class CONTENT_EXPORT BrowserCompositorOutputSurface
-    : public cc::OutputSurface {
+    : public cc::OutputSurface,
+      public ui::CompositorVSyncManager::Observer {
  public:
   ~BrowserCompositorOutputSurface() override;
 
+  // cc::OutputSurface implementation.
+  bool BindToClient(cc::OutputSurfaceClient* client) override;
   cc::OverlayCandidateValidator* GetOverlayCandidateValidator() const override;
 
+  // ui::CompositorOutputSurface::Observer implementation.
+  void OnUpdateVSyncParameters(base::TimeTicks timebase,
+                               base::TimeDelta interval) override;
+
   void OnUpdateVSyncParametersFromGpu(base::TimeTicks tiembase,
                                       base::TimeDelta interval);
 
@@ -41,13 +49,16 @@
   // Constructor used by the accelerated implementation.
   BrowserCompositorOutputSurface(
       const scoped_refptr<cc::ContextProvider>& context,
+      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       scoped_ptr<BrowserCompositorOverlayCandidateValidator>
           overlay_candidate_validator);
 
   // Constructor used by the software implementation.
-  explicit BrowserCompositorOutputSurface(
-      scoped_ptr<cc::SoftwareOutputDevice> software_device);
+  BrowserCompositorOutputSurface(
+      scoped_ptr<cc::SoftwareOutputDevice> software_device,
+      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager);
 
+  scoped_refptr<ui::CompositorVSyncManager> vsync_manager_;
   ReflectorImpl* reflector_;
 
  private:
diff --git a/content/browser/compositor/delegated_frame_host.cc b/content/browser/compositor/delegated_frame_host.cc
index 98d7ac17..f45e7f4 100644
--- a/content/browser/compositor/delegated_frame_host.cc
+++ b/content/browser/compositor/delegated_frame_host.cc
@@ -888,10 +888,13 @@
   DCHECK(!compositor_);
 }
 
-void DelegatedFrameHost::SetVSyncParameters(base::TimeTicks timebase,
-                                            base::TimeDelta interval) {
+void DelegatedFrameHost::OnUpdateVSyncParameters(
+    base::TimeTicks timebase,
+    base::TimeDelta interval) {
   vsync_timebase_ = timebase;
   vsync_interval_ = interval;
+  if (client_->DelegatedFrameHostIsVisible())
+    client_->DelegatedFrameHostUpdateVSyncParameters(timebase, interval);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -917,6 +920,8 @@
     surface_factory_->Destroy(surface_id_);
   if (resource_collection_.get())
     resource_collection_->SetClient(NULL);
+
+  DCHECK(!vsync_manager_.get());
 }
 
 void DelegatedFrameHost::RunOnCommitCallbacks() {
@@ -943,6 +948,9 @@
     return;
   compositor_ = compositor;
   compositor_->AddObserver(this);
+  DCHECK(!vsync_manager_.get());
+  vsync_manager_ = compositor_->vsync_manager();
+  vsync_manager_->AddObserver(this);
 }
 
 void DelegatedFrameHost::ResetCompositor() {
@@ -955,6 +963,10 @@
   }
   if (compositor_->HasObserver(this))
     compositor_->RemoveObserver(this);
+  if (vsync_manager_.get()) {
+    vsync_manager_->RemoveObserver(this);
+    vsync_manager_ = NULL;
+  }
   compositor_ = nullptr;
 }
 
diff --git a/content/browser/compositor/delegated_frame_host.h b/content/browser/compositor/delegated_frame_host.h
index 917623e..f208c26 100644
--- a/content/browser/compositor/delegated_frame_host.h
+++ b/content/browser/compositor/delegated_frame_host.h
@@ -18,6 +18,7 @@
 #include "content/public/browser/render_process_host.h"
 #include "ui/compositor/compositor.h"
 #include "ui/compositor/compositor_observer.h"
+#include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_owner_delegate.h"
 #include "ui/gfx/geometry/rect_conversions.h"
@@ -60,6 +61,10 @@
       int output_surface_id,
       const cc::CompositorFrameAck& ack) = 0;
   virtual void DelegatedFrameHostOnLostCompositorResources() = 0;
+
+  virtual void DelegatedFrameHostUpdateVSyncParameters(
+      const base::TimeTicks& timebase,
+      const base::TimeDelta& interval) = 0;
 };
 
 // The DelegatedFrameHost is used to host all of the RenderWidgetHostView state
@@ -68,6 +73,7 @@
 // the ui::Compositor associated with its DelegatedFrameHostClient.
 class CONTENT_EXPORT DelegatedFrameHost
     : public ui::CompositorObserver,
+      public ui::CompositorVSyncManager::Observer,
       public ui::LayerOwnerDelegate,
       public ImageTransportFactoryObserver,
       public DelegatedFrameEvictorClient,
@@ -93,7 +99,6 @@
   gfx::Size GetRequestedRendererSize() const;
   void SetCompositor(ui::Compositor* compositor);
   void ResetCompositor();
-  void SetVSyncParameters(base::TimeTicks timebase, base::TimeDelta interval);
   // Note: |src_subset| is specified in DIP dimensions while |output_size|
   // expects pixels.
   void CopyFromCompositingSurface(const gfx::Rect& src_subrect,
@@ -153,6 +158,10 @@
   void OnCompositingLockStateChanged(ui::Compositor* compositor) override;
   void OnCompositingShuttingDown(ui::Compositor* compositor) override;
 
+  // Overridden from ui::CompositorVSyncManager::Observer:
+  void OnUpdateVSyncParameters(base::TimeTicks timebase,
+                               base::TimeDelta interval) override;
+
   // Overridden from ui::LayerOwnerObserver:
   void OnLayerRecreated(ui::Layer* old_layer, ui::Layer* new_layer) override;
 
@@ -234,8 +243,11 @@
 
   std::vector<base::Closure> on_compositing_did_commit_callbacks_;
 
+  // The vsync manager we are observing for changes, if any.
+  scoped_refptr<ui::CompositorVSyncManager> vsync_manager_;
+
   // The current VSync timebase and interval. These are zero until the first
-  // call to UpdateVSyncParameters().
+  // call to OnUpdateVSyncParameters().
   base::TimeTicks vsync_timebase_;
   base::TimeDelta vsync_interval_;
 
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
index b4a2596..09a8b7280 100644
--- a/content/browser/compositor/gpu_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
@@ -18,9 +18,11 @@
 
 GpuBrowserCompositorOutputSurface::GpuBrowserCompositorOutputSurface(
     const scoped_refptr<ContextProviderCommandBuffer>& context,
+    const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
     scoped_ptr<BrowserCompositorOverlayCandidateValidator>
         overlay_candidate_validator)
     : BrowserCompositorOutputSurface(context,
+                                     vsync_manager,
                                      overlay_candidate_validator.Pass()),
 #if defined(OS_MACOSX)
       should_show_frames_state_(SHOULD_SHOW_FRAMES),
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.h b/content/browser/compositor/gpu_browser_compositor_output_surface.h
index b1c8259..2b3d2b7 100644
--- a/content/browser/compositor/gpu_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_browser_compositor_output_surface.h
@@ -8,6 +8,10 @@
 #include "base/cancelable_callback.h"
 #include "content/browser/compositor/browser_compositor_output_surface.h"
 
+namespace ui {
+class CompositorVSyncManager;
+}
+
 namespace content {
 class CommandBufferProxyImpl;
 class BrowserCompositorOverlayCandidateValidator;
@@ -20,6 +24,7 @@
  public:
   GpuBrowserCompositorOutputSurface(
       const scoped_refptr<ContextProviderCommandBuffer>& context,
+      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       scoped_ptr<BrowserCompositorOverlayCandidateValidator>
           overlay_candidate_validator);
 
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index 330aaa84..151ba00 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -280,12 +280,13 @@
   scoped_ptr<BrowserCompositorOutputSurface> surface;
   if (!create_gpu_output_surface) {
     surface = make_scoped_ptr(new SoftwareBrowserCompositorOutputSurface(
-        CreateSoftwareOutputDevice(compositor.get())));
+        CreateSoftwareOutputDevice(compositor.get()),
+        compositor->vsync_manager()));
   } else {
     DCHECK(context_provider);
     if (!data->surface_id) {
       surface = make_scoped_ptr(new OffscreenBrowserCompositorOutputSurface(
-          context_provider,
+          context_provider, compositor->vsync_manager(),
           scoped_ptr<BrowserCompositorOverlayCandidateValidator>()));
     } else
 #if defined(USE_OZONE)
@@ -293,14 +294,14 @@
             ->CanShowPrimaryPlaneAsOverlay()) {
       surface =
           make_scoped_ptr(new GpuSurfacelessBrowserCompositorOutputSurface(
-              context_provider, data->surface_id,
+              context_provider, data->surface_id, compositor->vsync_manager(),
               CreateOverlayCandidateValidator(compositor->widget()), GL_RGB,
               BrowserGpuMemoryBufferManager::current()));
     } else
 #endif
     {
       surface = make_scoped_ptr(new GpuBrowserCompositorOutputSurface(
-          context_provider,
+          context_provider, compositor->vsync_manager(),
           CreateOverlayCandidateValidator(compositor->widget())));
     }
   }
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
index 041a41c..ff77fa9 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
@@ -20,11 +20,13 @@
     GpuSurfacelessBrowserCompositorOutputSurface(
         const scoped_refptr<ContextProviderCommandBuffer>& context,
         int surface_id,
+        const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
         scoped_ptr<BrowserCompositorOverlayCandidateValidator>
             overlay_candidate_validator,
         unsigned internalformat,
         BrowserGpuMemoryBufferManager* gpu_memory_buffer_manager)
     : GpuBrowserCompositorOutputSurface(context,
+                                        vsync_manager,
                                         overlay_candidate_validator.Pass()),
       internalformat_(internalformat),
       gpu_memory_buffer_manager_(gpu_memory_buffer_manager) {
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
index ff66d02..7f634dd 100644
--- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
+++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.h
@@ -19,6 +19,7 @@
   GpuSurfacelessBrowserCompositorOutputSurface(
       const scoped_refptr<ContextProviderCommandBuffer>& context,
       int surface_id,
+      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       scoped_ptr<BrowserCompositorOverlayCandidateValidator>
           overlay_candidate_validator,
       unsigned internalformat,
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
index 0e528d9..9fa5026 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
@@ -29,9 +29,11 @@
 OffscreenBrowserCompositorOutputSurface::
     OffscreenBrowserCompositorOutputSurface(
         const scoped_refptr<ContextProviderCommandBuffer>& context,
+        const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
         scoped_ptr<BrowserCompositorOverlayCandidateValidator>
             overlay_candidate_validator)
     : BrowserCompositorOutputSurface(context,
+                                     vsync_manager,
                                      overlay_candidate_validator.Pass()),
       fbo_(0),
       is_backbuffer_discarded_(false),
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.h b/content/browser/compositor/offscreen_browser_compositor_output_surface.h
index 1672101..e9fbe6d 100644
--- a/content/browser/compositor/offscreen_browser_compositor_output_surface.h
+++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.h
@@ -9,6 +9,10 @@
 #include "base/memory/weak_ptr.h"
 #include "content/browser/compositor/browser_compositor_output_surface.h"
 
+namespace ui {
+class CompositorVSyncManager;
+}
+
 namespace content {
 class CommandBufferProxyImpl;
 
@@ -17,6 +21,7 @@
  public:
   OffscreenBrowserCompositorOutputSurface(
       const scoped_refptr<ContextProviderCommandBuffer>& context,
+      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager,
       scoped_ptr<BrowserCompositorOverlayCandidateValidator>
           overlay_candidate_validator);
 
diff --git a/content/browser/compositor/reflector_impl_unittest.cc b/content/browser/compositor/reflector_impl_unittest.cc
index 231015f..867a9de1 100644
--- a/content/browser/compositor/reflector_impl_unittest.cc
+++ b/content/browser/compositor/reflector_impl_unittest.cc
@@ -69,9 +69,11 @@
 
 class TestOutputSurface : public BrowserCompositorOutputSurface {
  public:
-  explicit TestOutputSurface(
-      const scoped_refptr<cc::ContextProvider>& context_provider)
+  TestOutputSurface(
+      const scoped_refptr<cc::ContextProvider>& context_provider,
+      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
       : BrowserCompositorOutputSurface(context_provider,
+                                       vsync_manager,
                                        CreateTestValidatorOzone().Pass()) {}
 
   void SetFlip(bool flip) { capabilities_.flipped_output_surface = flip; }
@@ -111,7 +113,9 @@
     context_provider_ = cc::TestContextProvider::Create(
         cc::TestWebGraphicsContext3D::Create().Pass());
     output_surface_ =
-        scoped_ptr<TestOutputSurface>(new TestOutputSurface(context_provider_));
+        scoped_ptr<TestOutputSurface>(
+            new TestOutputSurface(context_provider_,
+                                  compositor_->vsync_manager())).Pass();
     CHECK(output_surface_->BindToClient(&output_surface_client_));
 
     mirroring_layer_.reset(new ui::Layer(ui::LAYER_SOLID_COLOR));
diff --git a/content/browser/compositor/software_browser_compositor_output_surface.cc b/content/browser/compositor/software_browser_compositor_output_surface.cc
index 5e5e9bbf..c2b70d4 100644
--- a/content/browser/compositor/software_browser_compositor_output_surface.cc
+++ b/content/browser/compositor/software_browser_compositor_output_surface.cc
@@ -17,8 +17,10 @@
 namespace content {
 
 SoftwareBrowserCompositorOutputSurface::SoftwareBrowserCompositorOutputSurface(
-    scoped_ptr<cc::SoftwareOutputDevice> software_device)
-    : BrowserCompositorOutputSurface(software_device.Pass()),
+    scoped_ptr<cc::SoftwareOutputDevice> software_device,
+    const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager)
+    : BrowserCompositorOutputSurface(software_device.Pass(),
+                                     vsync_manager),
       weak_factory_(this) {
 }
 
diff --git a/content/browser/compositor/software_browser_compositor_output_surface.h b/content/browser/compositor/software_browser_compositor_output_surface.h
index 520aca89..68776ca 100644
--- a/content/browser/compositor/software_browser_compositor_output_surface.h
+++ b/content/browser/compositor/software_browser_compositor_output_surface.h
@@ -13,13 +13,18 @@
 class SoftwareOutputDevice;
 }
 
+namespace ui {
+class CompositorVSyncManager;
+}
+
 namespace content {
 
 class CONTENT_EXPORT SoftwareBrowserCompositorOutputSurface
     : public BrowserCompositorOutputSurface {
  public:
   SoftwareBrowserCompositorOutputSurface(
-      scoped_ptr<cc::SoftwareOutputDevice> software_device);
+      scoped_ptr<cc::SoftwareOutputDevice> software_device,
+      const scoped_refptr<ui::CompositorVSyncManager>& vsync_manager);
 
   ~SoftwareBrowserCompositorOutputSurface() override;
 
diff --git a/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc b/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc
index 7dc2e28..68534f0c 100644
--- a/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc
+++ b/content/browser/compositor/software_browser_compositor_output_surface_unittest.cc
@@ -104,7 +104,9 @@
 SoftwareBrowserCompositorOutputSurfaceTest::CreateSurface(
     scoped_ptr<cc::SoftwareOutputDevice> device) {
   return scoped_ptr<content::BrowserCompositorOutputSurface>(
-      new content::SoftwareBrowserCompositorOutputSurface(device.Pass()));
+      new content::SoftwareBrowserCompositorOutputSurface(
+          device.Pass(),
+          compositor_->vsync_manager()));
 }
 
 TEST_F(SoftwareBrowserCompositorOutputSurfaceTest, NoVSyncProvider) {
diff --git a/content/browser/renderer_host/begin_frame_observer_proxy.cc b/content/browser/renderer_host/begin_frame_observer_proxy.cc
index 06baa18b..7a6651f 100644
--- a/content/browser/renderer_host/begin_frame_observer_proxy.cc
+++ b/content/browser/renderer_host/begin_frame_observer_proxy.cc
@@ -14,7 +14,6 @@
 }
 
 BeginFrameObserverProxy::~BeginFrameObserverProxy() {
-  DCHECK(!compositor_);
 }
 
 void BeginFrameObserverProxy::SetNeedsBeginFrames(bool needs_begin_frames) {
@@ -39,7 +38,6 @@
   DCHECK(compositor);
 
   compositor_ = compositor;
-  compositor_->AddObserver(this);
   if (needs_begin_frames_)
     StartObservingBeginFrames();
 }
@@ -47,7 +45,6 @@
 void BeginFrameObserverProxy::ResetCompositor() {
   if (!compositor_)
     return;
-  compositor_->RemoveObserver(this);
 
   if (needs_begin_frames_)
     StopObservingBeginFrames();
@@ -60,11 +57,6 @@
   last_sent_begin_frame_args_ = args;
 }
 
-void BeginFrameObserverProxy::OnCompositingShuttingDown(
-    ui::Compositor* compositor) {
-  ResetCompositor();
-}
-
 void BeginFrameObserverProxy::StartObservingBeginFrames() {
   DCHECK(compositor_);
   compositor_->AddBeginFrameObserver(this);
diff --git a/content/browser/renderer_host/begin_frame_observer_proxy.h b/content/browser/renderer_host/begin_frame_observer_proxy.h
index 291d8bb8..fd2aa6d 100644
--- a/content/browser/renderer_host/begin_frame_observer_proxy.h
+++ b/content/browser/renderer_host/begin_frame_observer_proxy.h
@@ -25,8 +25,7 @@
 // This class is used to manage all of the RenderWidgetHostView state and
 // functionality that is associated with BeginFrame message handling.
 class CONTENT_EXPORT BeginFrameObserverProxy
-    : public ui::CompositorBeginFrameObserver,
-      public ui::CompositorObserver {
+    : public ui::CompositorBeginFrameObserver {
  public:
   explicit BeginFrameObserverProxy(BeginFrameObserverProxyClient* client);
   ~BeginFrameObserverProxy() override;
@@ -39,17 +38,6 @@
   // Overridden from ui::CompositorBeginFrameObserver:
   void OnSendBeginFrame(const cc::BeginFrameArgs& args) override;
 
-  // Overridden from ui::CompositorObserver:
-  // TODO(simonhong): Stop overriding ui::CompositorObserver. We need to make
-  // sure that this class should be destroyed before ui::Compositor.
-  void OnCompositingDidCommit(ui::Compositor* compositor) override {}
-  void OnCompositingStarted(ui::Compositor* compositor,
-                            base::TimeTicks start_time) override {}
-  void OnCompositingEnded(ui::Compositor* compositor) override {}
-  void OnCompositingAborted(ui::Compositor* compositor) override {}
-  void OnCompositingLockStateChanged(ui::Compositor* compositor) override {}
-  void OnCompositingShuttingDown(ui::Compositor* compositor) override;
-
  private:
   void StartObservingBeginFrames();
   void StopObservingBeginFrames();
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 988e394..25a4fa3 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -1240,6 +1240,7 @@
     switches::kDisableTouchEditing,
     switches::kDisableV8IdleTasks,
     switches::kDomAutomationController,
+    switches::kEnableBeginFrameScheduling,
     switches::kEnableBleedingEdgeRenderingFastPaths,
     switches::kEnableBlinkFeatures,
     switches::kEnableBrowserSideNavigation,
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index ac035cf..fd85fcc 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -66,6 +66,7 @@
 #include "ui/base/hit_test.h"
 #include "ui/base/ime/input_method.h"
 #include "ui/base/ui_base_types.h"
+#include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/compositor/dip_util.h"
 #include "ui/events/blink/blink_event_util.h"
 #include "ui/events/event.h"
@@ -443,7 +444,6 @@
       has_snapped_to_boundary_(false),
       touch_editing_client_(NULL),
       is_guest_view_hack_(is_guest_view_hack),
-      begin_frame_observer_proxy_(this),
       weak_ptr_factory_(this) {
   if (!is_guest_view_hack_)
     host_->SetView(this);
@@ -473,8 +473,6 @@
     // RenderWidgetHostViewAndroid should also be moved at the same time.
     IPC_MESSAGE_HANDLER(ViewHostMsg_TextInputStateChanged,
                         OnTextInputStateChanged)
-    IPC_MESSAGE_HANDLER(ViewHostMsg_SetNeedsBeginFrames,
-                        OnSetNeedsBeginFrames)
     IPC_MESSAGE_UNHANDLED(handled = false)
   IPC_END_MESSAGE_MAP()
   return handled;
@@ -704,15 +702,6 @@
   return this;
 }
 
-void RenderWidgetHostViewAura::OnSetNeedsBeginFrames(bool needs_begin_frames) {
-  begin_frame_observer_proxy_.SetNeedsBeginFrames(needs_begin_frames);
-}
-
-void RenderWidgetHostViewAura::SendBeginFrame(const cc::BeginFrameArgs& args) {
-  delegated_frame_host_->SetVSyncParameters(args.frame_time, args.interval);
-  host_->Send(new ViewMsg_BeginFrame(host_->GetRoutingID(), args));
-}
-
 void RenderWidgetHostViewAura::SetKeyboardFocus() {
 #if defined(OS_WIN)
   if (CanFocus()) {
@@ -2640,8 +2629,6 @@
 #endif
 
   delegated_frame_host_->SetCompositor(window_->GetHost()->compositor());
-  if (window_->GetHost()->compositor())
-    begin_frame_observer_proxy_.SetCompositor(window_->GetHost()->compositor());
 }
 
 void RenderWidgetHostViewAura::RemovingFromRootWindow() {
@@ -2654,7 +2641,6 @@
 
   window_->GetHost()->RemoveObserver(this);
   delegated_frame_host_->ResetCompositor();
-  begin_frame_observer_proxy_.ResetCompositor();
 
 #if defined(OS_WIN)
   // Update the legacy window's parent temporarily to the desktop window. It
@@ -2766,6 +2752,12 @@
   host_->ScheduleComposite();
 }
 
+void RenderWidgetHostViewAura::DelegatedFrameHostUpdateVSyncParameters(
+    const base::TimeTicks& timebase,
+    const base::TimeDelta& interval) {
+  host_->UpdateVSyncParameters(timebase, interval);
+}
+
 void RenderWidgetHostViewAura::OnDidNavigateMainFrameToNewPage() {
   ui::GestureRecognizer::Get()->CancelActiveTouches(window_);
 }
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.h b/content/browser/renderer_host/render_widget_host_view_aura.h
index f3f6869b..69fe6612 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.h
+++ b/content/browser/renderer_host/render_widget_host_view_aura.h
@@ -20,7 +20,6 @@
 #include "content/browser/compositor/delegated_frame_host.h"
 #include "content/browser/compositor/image_transport_factory.h"
 #include "content/browser/compositor/owned_mailbox.h"
-#include "content/browser/renderer_host/begin_frame_observer_proxy.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/common/content_export.h"
 #include "content/common/cursors/webcursor.h"
@@ -81,7 +80,6 @@
 class CONTENT_EXPORT RenderWidgetHostViewAura
     : public RenderWidgetHostViewBase,
       public DelegatedFrameHostClient,
-      public BeginFrameObserverProxyClient,
       public ui::TextInputClient,
       public gfx::DisplayObserver,
       public aura::WindowTreeHostObserver,
@@ -473,9 +471,9 @@
       int output_surface_id,
       const cc::CompositorFrameAck& ack) override;
   void DelegatedFrameHostOnLostCompositorResources() override;
-
-  // BeginFrameObserverProxyClient implementation.
-  void SendBeginFrame(const cc::BeginFrameArgs& args) override;
+  void DelegatedFrameHostUpdateVSyncParameters(
+      const base::TimeTicks& timebase,
+      const base::TimeDelta& interval) override;
 
   // Detaches |this| from the input method object.
   void DetachFromInputMethod();
@@ -498,9 +496,6 @@
   // Helper function to set keyboard focus to the main window.
   void SetKeyboardFocus();
 
-  // Called when RenderWidget wants to start BeginFrame scheduling or stop.
-  void OnSetNeedsBeginFrames(bool needs_begin_frames);
-
   RenderFrameHostImpl* GetFocusedFrame();
 
   // Returns true if the |event| passed in can be forwarded to the renderer.
@@ -675,8 +670,6 @@
   // compositing surface and showing the disambiguation popup.
   gfx::Vector2dF disambiguation_scroll_offset_;
 
-  BeginFrameObserverProxy begin_frame_observer_proxy_;
-
   base::WeakPtrFactory<RenderWidgetHostViewAura> weak_ptr_factory_;
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAura);
 };
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 18fd462d..4990269 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -491,6 +491,9 @@
       int output_surface_id,
       const cc::CompositorFrameAck& ack) override;
   void DelegatedFrameHostOnLostCompositorResources() override;
+  void DelegatedFrameHostUpdateVSyncParameters(
+      const base::TimeTicks& timebase,
+      const base::TimeDelta& interval) override;
 
   // AcceleratedWidgetMacNSView implementation.
   NSView* AcceleratedWidgetGetNSView() const override;
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 0e1e67b..22707f03b 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -459,6 +459,12 @@
   render_widget_host_->ScheduleComposite();
 }
 
+void RenderWidgetHostViewMac::DelegatedFrameHostUpdateVSyncParameters(
+    const base::TimeTicks& timebase,
+    const base::TimeDelta& interval) {
+  render_widget_host_->UpdateVSyncParameters(timebase, interval);
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // AcceleratedWidgetMacNSView, public:
 
diff --git a/content/public/common/content_switches.cc b/content/public/common/content_switches.cc
index 29b713f2..43c7174f 100644
--- a/content/public/common/content_switches.cc
+++ b/content/public/common/content_switches.cc
@@ -295,6 +295,9 @@
 // Enable the experimental Credential Manager JavaScript API.
 const char kEnableCredentialManagerAPI[]    = "enable-credential-manager-api";
 
+// Use a BeginFrame signal from browser to renderer to schedule rendering.
+const char kEnableBeginFrameScheduling[]    = "enable-begin-frame-scheduling";
+
 // Enable the creation of compositing layers when it would prevent LCD text.
 const char kEnablePreferCompositingToLCDText[] =
     "enable-prefer-compositing-to-lcd-text";
diff --git a/content/public/common/content_switches.h b/content/public/common/content_switches.h
index d50bdac5..c056b6b 100644
--- a/content/public/common/content_switches.h
+++ b/content/public/common/content_switches.h
@@ -92,6 +92,7 @@
 CONTENT_EXPORT extern const char kEnableBleedingEdgeRenderingFastPaths[];
 CONTENT_EXPORT extern const char kEnableCompositorAnimationTimelines[];
 CONTENT_EXPORT extern const char kEnableCredentialManagerAPI[];
+CONTENT_EXPORT extern const char kEnableBeginFrameScheduling[];
 CONTENT_EXPORT extern const char kEnablePreferCompositingToLCDText[];
 CONTENT_EXPORT extern const char kEnableBlinkFeatures[];
 CONTENT_EXPORT extern const char kEnableBrowserSideNavigation[];
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index 6eb57c9c..f3f6489 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -233,13 +233,12 @@
     settings.use_compositor_animation_timelines = true;
     blink::WebRuntimeFeatures::enableCompositorAnimationTimelines(true);
   }
-#if !defined(OS_MACOSX)
-  if (!widget_->for_oopif()) {
+  if (cmd->HasSwitch(switches::kEnableBeginFrameScheduling) &&
+      !widget_->for_oopif()) {
     // TODO(simonhong): Apply BeginFrame scheduling for OOPIF.
     // See crbug.com/471411.
     settings.use_external_begin_frame_source = true;
   }
-#endif
 
   settings.default_tile_size = CalculateDefaultTileSize(widget_);
   if (cmd->HasSwitch(switches::kDefaultTileWidth)) {
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index 9002d5e92..a0944fe 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -20,6 +20,8 @@
     "compositor_observer.h",
     "compositor_switches.cc",
     "compositor_switches.h",
+    "compositor_vsync_manager.cc",
+    "compositor_vsync_manager.h",
     "debug_utils.cc",
     "debug_utils.h",
     "dip_util.cc",
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index 67a937e..c50f9ef 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -27,6 +27,7 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/compositor/compositor_observer.h"
 #include "ui/compositor/compositor_switches.h"
+#include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/compositor/dip_util.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/layer_animator_collection.h"
@@ -72,6 +73,7 @@
       widget_(widget),
       surface_id_allocator_(context_factory->CreateSurfaceIdAllocator()),
       task_runner_(task_runner),
+      vsync_manager_(new CompositorVSyncManager()),
       device_scale_factor_(0.0f),
       last_started_frame_(0),
       last_ended_frame_(0),
@@ -255,9 +257,8 @@
   return host_->visible();
 }
 
-void Compositor::SetAuthoritativeVSyncInterval(
-    const base::TimeDelta& interval) {
-  host_->SetAuthoritativeVSyncInterval(interval);
+scoped_refptr<CompositorVSyncManager> Compositor::vsync_manager() const {
+  return vsync_manager_;
 }
 
 void Compositor::AddObserver(CompositorObserver* observer) {
diff --git a/ui/compositor/compositor.gyp b/ui/compositor/compositor.gyp
index 41950aa..92f5ef4e 100644
--- a/ui/compositor/compositor.gyp
+++ b/ui/compositor/compositor.gyp
@@ -38,6 +38,8 @@
         'compositor_observer.h',
         'compositor_switches.cc',
         'compositor_switches.h',
+        'compositor_vsync_manager.cc',
+        'compositor_vsync_manager.h',
         'debug_utils.cc',
         'debug_utils.h',
         'dip_util.cc',
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index 7965b15e..cf115b0 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -220,17 +220,12 @@
   // Gets the visibility of the underlying compositor.
   bool IsVisible();
 
-  // The "authoritative" vsync interval, if provided, will override interval
-  // reported from 3D context. This is typically the value reported by a more
-  // reliable source, e.g, the platform display configuration.
-  // In the particular case of ChromeOS -- this is the value queried through
-  // XRandR, which is more reliable than the value queried through the 3D
-  // context.
-  void SetAuthoritativeVSyncInterval(const base::TimeDelta& interval);
-
   // Returns the widget for this compositor.
   gfx::AcceleratedWidget widget() const { return widget_; }
 
+  // Returns the vsync manager for this compositor.
+  scoped_refptr<CompositorVSyncManager> vsync_manager() const;
+
   // Returns the main thread task runner this compositor uses. Users of the
   // compositor generally shouldn't use this.
   scoped_refptr<base::SingleThreadTaskRunner> task_runner() const {
@@ -342,6 +337,9 @@
   scoped_ptr<cc::LayerTreeHost> host_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
+  // The manager of vsync parameters for this compositor.
+  scoped_refptr<CompositorVSyncManager> vsync_manager_;
+
   // The device scale factor of the monitor that this compositor is compositing
   // layers on.
   float device_scale_factor_;
diff --git a/ui/compositor/compositor_vsync_manager.cc b/ui/compositor/compositor_vsync_manager.cc
new file mode 100644
index 0000000..f51847c
--- /dev/null
+++ b/ui/compositor/compositor_vsync_manager.cc
@@ -0,0 +1,46 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/compositor/compositor_vsync_manager.h"
+
+namespace ui {
+
+CompositorVSyncManager::CompositorVSyncManager()
+    : authoritative_vsync_interval_(base::TimeDelta::FromSeconds(0)) {
+}
+
+CompositorVSyncManager::~CompositorVSyncManager() {}
+
+void CompositorVSyncManager::SetAuthoritativeVSyncInterval(
+    base::TimeDelta interval) {
+  authoritative_vsync_interval_ = interval;
+  last_interval_ = interval;
+  NotifyObservers(last_timebase_, last_interval_);
+}
+
+void CompositorVSyncManager::UpdateVSyncParameters(base::TimeTicks timebase,
+                                                   base::TimeDelta interval) {
+  if (authoritative_vsync_interval_ != base::TimeDelta::FromSeconds(0))
+    interval = authoritative_vsync_interval_;
+  last_timebase_ = timebase;
+  last_interval_ = interval;
+  NotifyObservers(timebase, interval);
+}
+
+void CompositorVSyncManager::AddObserver(Observer* observer) {
+  observer_list_.AddObserver(observer);
+  observer->OnUpdateVSyncParameters(last_timebase_, last_interval_);
+}
+
+void CompositorVSyncManager::RemoveObserver(Observer* observer) {
+  observer_list_.RemoveObserver(observer);
+}
+
+void CompositorVSyncManager::NotifyObservers(base::TimeTicks timebase,
+                                             base::TimeDelta interval) {
+  FOR_EACH_OBSERVER(CompositorVSyncManager::Observer, observer_list_,
+                    OnUpdateVSyncParameters(timebase, interval));
+}
+
+}  // namespace ui
diff --git a/ui/compositor/compositor_vsync_manager.h b/ui/compositor/compositor_vsync_manager.h
new file mode 100644
index 0000000..7e9e07b
--- /dev/null
+++ b/ui/compositor/compositor_vsync_manager.h
@@ -0,0 +1,65 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_
+#define UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_
+
+#include "base/memory/ref_counted.h"
+#include "base/observer_list.h"
+#include "base/synchronization/lock.h"
+#include "base/time/time.h"
+#include "ui/compositor/compositor_export.h"
+
+namespace ui {
+
+// This class manages vsync parameters for a compositor. It merges updates of
+// the parameters from different sources and sends the merged updates to
+// observers which register to it.
+class COMPOSITOR_EXPORT CompositorVSyncManager
+    : public base::RefCounted<CompositorVSyncManager> {
+ public:
+  class Observer {
+   public:
+    virtual void OnUpdateVSyncParameters(base::TimeTicks timebase,
+                                         base::TimeDelta interval) = 0;
+  };
+
+  CompositorVSyncManager();
+
+  // The "authoritative" vsync interval, if provided, will override |interval|
+  // as reported by UpdateVSyncParameters() whenever it is called.  This is
+  // typically the value reported by a more reliable source, e.g. the platform
+  // display configuration.  In the particular case of ChromeOS -- this is the
+  // value queried through XRandR, which is more reliable than the value
+  // queried through the 3D context.
+  void SetAuthoritativeVSyncInterval(base::TimeDelta interval);
+
+  // The vsync parameters consist of |timebase|, which is the platform timestamp
+  // of the last vsync, and |interval|, which is the interval between vsyncs.
+  // |interval| may be overriden by SetAuthoritativeVSyncInterval() above.
+  void UpdateVSyncParameters(base::TimeTicks timebase,
+                             base::TimeDelta interval);
+
+  void AddObserver(Observer* observer);
+  void RemoveObserver(Observer* observer);
+
+ private:
+  friend class base::RefCounted<CompositorVSyncManager>;
+
+  ~CompositorVSyncManager();
+
+  void NotifyObservers(base::TimeTicks timebase, base::TimeDelta interval);
+
+  ObserverList<Observer> observer_list_;
+
+  base::TimeTicks last_timebase_;
+  base::TimeDelta last_interval_;
+  base::TimeDelta authoritative_vsync_interval_;
+
+  DISALLOW_COPY_AND_ASSIGN(CompositorVSyncManager);
+};
+
+}  // namespace ui
+
+#endif  // UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_