Browse Source

fix: backport chromium patches to fix touchpad scrolling on windows (#20488)

Backports https://chromium-review.googlesource.com/c/chromium/src/+/1689922
and https://chromium-review.googlesource.com/c/chromium/src/+/1753661
Robo 5 years ago
parent
commit
fd0b57f219

+ 2 - 0
patches/common/chromium/.patches

@@ -84,3 +84,5 @@ fix_use_weakptr_to_detect_deletion.patch
 fix_disabling_compositor_recycling.patch
 allow_new_privileges_in_unsandboxed_child_processes.patch
 fix_add_more_checks_in_mojocdmservice.patch
+recreate_directmanipulationhelper_when_every_lrwhh_updateparent.patch
+notify_directmanipulationeventhandler_when_directmanipulationhelper.patch

+ 118 - 0
patches/common/chromium/notify_directmanipulationeventhandler_when_directmanipulationhelper.patch

@@ -0,0 +1,118 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Siye Liu <[email protected]>
+Date: Thu, 15 Aug 2019 02:30:05 +0000
+Subject: Notify DirectManipulationEventHandler when DirectManipulationHelper
+ is destructed.
+
+The crash report shows that DirectManipulation may call
+|DirectManipulationEventHandler::OnInteraction| after
+DirectManipulationHelper is destroyed. Since |OnInteraction| is relying
+on DirectManipulationHelper to add/remove animation observer, we should
+set the pointer to DirectManipulationHelper to nullptr after it is
+destroyed.
+
+In this CL, we set the pointer to DirectManipulationHelper in separate
+function |SetDirectManipulationHelper| instead of passing the pointer
+during ctor of DirectManipulationEventHandler.
+
+Bug: 993260
+Change-Id: Id781af047e72268532d861920a077a0c6b1650bb
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1753661
+Reviewed-by: Scott Violet <[email protected]>
+Commit-Queue: Siye Liu <[email protected]>
+Cr-Commit-Position: refs/heads/master@{#687125}
+
+diff --git a/content/browser/renderer_host/direct_manipulation_event_handler_win.cc b/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
+index 33ce63d8d0f59573cb4764f146b4f88008cca4a8..bae879411fb253a810034eb2cb531a54530a4183 100644
+--- a/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
++++ b/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
+@@ -28,9 +28,8 @@ bool FloatEquals(float f1, float f2) {
+ }  // namespace
+ 
+ DirectManipulationEventHandler::DirectManipulationEventHandler(
+-    DirectManipulationHelper* helper,
+     ui::WindowEventTarget* event_target)
+-    : helper_(helper), event_target_(event_target) {}
++    : event_target_(event_target) {}
+ 
+ bool DirectManipulationEventHandler::SetViewportSizeInPixels(
+     const gfx::Size& viewport_size_in_pixels) {
+@@ -45,6 +44,11 @@ void DirectManipulationEventHandler::SetDeviceScaleFactor(
+   device_scale_factor_ = device_scale_factor;
+ }
+ 
++void DirectManipulationEventHandler::SetDirectManipulationHelper(
++    DirectManipulationHelper* helper) {
++  helper_ = helper;
++}
++
+ DirectManipulationEventHandler::~DirectManipulationEventHandler() {}
+ 
+ void DirectManipulationEventHandler::TransitionToState(
+@@ -303,6 +307,9 @@ HRESULT DirectManipulationEventHandler::OnContentUpdated(
+ HRESULT DirectManipulationEventHandler::OnInteraction(
+     IDirectManipulationViewport2* viewport,
+     DIRECTMANIPULATION_INTERACTION_TYPE interaction) {
++  if (!helper_)
++    return S_OK;
++
+   if (interaction == DIRECTMANIPULATION_INTERACTION_BEGIN) {
+     DebugLogging("OnInteraction BEGIN.", S_OK);
+     helper_->AddAnimationObserver();
+diff --git a/content/browser/renderer_host/direct_manipulation_event_handler_win.h b/content/browser/renderer_host/direct_manipulation_event_handler_win.h
+index f1902085032ffc95edb2d8dcd5224f1c5ecda3d2..e654c5f1a45da9e054d2c367df6f5115fa25862c 100644
+--- a/content/browser/renderer_host/direct_manipulation_event_handler_win.h
++++ b/content/browser/renderer_host/direct_manipulation_event_handler_win.h
+@@ -38,14 +38,15 @@ class DirectManipulationEventHandler
+               IDirectManipulationViewportEventHandler,
+               IDirectManipulationInteractionEventHandler>> {
+  public:
+-  DirectManipulationEventHandler(DirectManipulationHelper* helper,
+-                                 ui::WindowEventTarget* event_target);
++  DirectManipulationEventHandler(ui::WindowEventTarget* event_target);
+ 
+   // Return true if viewport_size_in_pixels_ changed.
+   bool SetViewportSizeInPixels(const gfx::Size& viewport_size_in_pixels);
+ 
+   void SetDeviceScaleFactor(float device_scale_factor);
+ 
++  void SetDirectManipulationHelper(DirectManipulationHelper* helper);
++
+  private:
+   friend class DirectManipulationBrowserTest;
+   friend DirectManipulationUnitTest;
+diff --git a/content/browser/renderer_host/direct_manipulation_helper_win.cc b/content/browser/renderer_host/direct_manipulation_helper_win.cc
+index 9401e7f8fb1fafd0532bb1e86035701c1df2ffda..6ce09b9f7b80e94c2adb582954c90afc95fc20e4 100644
+--- a/content/browser/renderer_host/direct_manipulation_helper_win.cc
++++ b/content/browser/renderer_host/direct_manipulation_helper_win.cc
+@@ -78,8 +78,9 @@ DirectManipulationHelper::CreateInstanceForTesting(
+       base::WrapUnique(new DirectManipulationHelper(0, nullptr));
+ 
+   instance->event_handler_ =
+-      Microsoft::WRL::Make<DirectManipulationEventHandler>(instance.get(),
+-                                                           event_target);
++      Microsoft::WRL::Make<DirectManipulationEventHandler>(event_target);
++
++  instance->event_handler_->SetDirectManipulationHelper(instance.get());
+ 
+   instance->viewport_ = viewport;
+ 
+@@ -159,7 +160,9 @@ bool DirectManipulationHelper::Initialize(ui::WindowEventTarget* event_target) {
+   }
+ 
+   event_handler_ =
+-      Microsoft::WRL::Make<DirectManipulationEventHandler>(this, event_target);
++      Microsoft::WRL::Make<DirectManipulationEventHandler>(event_target);
++
++  event_handler_->SetDirectManipulationHelper(this);
+ 
+   // We got Direct Manipulation transform from
+   // IDirectManipulationViewportEventHandler.
+@@ -265,6 +268,7 @@ void DirectManipulationHelper::Destroy() {
+   if (has_animation_observer_)
+     RemoveAnimationObserver();
+   compositor_ = nullptr;
++  event_handler_->SetDirectManipulationHelper(nullptr);
+ 
+   HRESULT hr;
+   if (viewport_) {

+ 975 - 0
patches/common/chromium/recreate_directmanipulationhelper_when_every_lrwhh_updateparent.patch

@@ -0,0 +1,975 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Siye Liu <[email protected]>
+Date: Mon, 12 Aug 2019 19:26:49 +0000
+Subject: Recreate DirectManipulationHelper when every LRWHH UpdateParent
+
+This is a reland of 7da070704275ac67c95a89dd373a1dc0a1ba1256 and
+d77c5029a13a83e676833aea61966a003564e57a
+
+Compositor and window event target is associated with window's parent.
+We call LRWHH UpdateParent when window's parent update, includes
+window's parent actually update and window initialize. Recreate
+DirectManipulationHelper on every window's parent update helps keep
+DirectManipulationHelper lifecycle tracking simpler. We also make
+CompositorAnimationObserver owned by DirectManipulationHelper.
+
+With this changes, we start the DirectManipulation event polling when
+DirectManipulationHelper created and stop when it destroyed. The issue
+should be fix since event polling start no more depends on
+DM_POINTERHITTEST.
+
+This CL also includes 3 refactoring changes:
+
+1. Move CompositorAnimationObserver into DirectManipulationHelper.
+2. Call ZoomToRect to reset viewport of DirectManipulation when
+   viewport is actually transformed in RUNNING - READAY sequence.
+3. Pass the viewport size to DMEventHandler and use it to reset viewport
+   at gesture end.
+
+The original changes caused a regression that browser UI composition
+keeps ticking begin frames. We register DirectManipulationHelperWin
+as an AnimationObserver of ui::Compositor. UI compositor will ask for
+begin frames as long as it has an AnimationObserver. We should call
+OnCompositorShuttingDown() when the compositor is going Idle. Therefore,
+I added a IDirectManipulationInteractionEventHandler that adds the
+observer when a manipulation begins, and removes it when manipulation
+ends. After my fix, we start the DirectManipulation event polling when
+DirectManipulation interaction begin and stop when DirectManipulation
+interaction end.
+
+Bug: 914914
+Change-Id: I9f59381bdcc6e4ed0970003d87b26ac750bfb42d
+Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1689922
+Reviewed-by: Scott Violet <[email protected]>
+Commit-Queue: Siye Liu <[email protected]>
+Cr-Commit-Position: refs/heads/master@{#686111}
+
+diff --git a/content/browser/renderer_host/direct_manipulation_event_handler_win.cc b/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
+index eec54fcb0187cfd47286d51226057b2fc4b3204a..33ce63d8d0f59573cb4764f146b4f88008cca4a8 100644
+--- a/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
++++ b/content/browser/renderer_host/direct_manipulation_event_handler_win.cc
+@@ -28,19 +28,16 @@ bool FloatEquals(float f1, float f2) {
+ }  // namespace
+ 
+ DirectManipulationEventHandler::DirectManipulationEventHandler(
+-    DirectManipulationHelper* helper)
+-    : helper_(helper) {}
+-
+-void DirectManipulationEventHandler::SetWindowEventTarget(
+-    ui::WindowEventTarget* event_target) {
+-  if (!event_target && LoggingEnabled()) {
+-    DebugLogging("Event target is null.", S_OK);
+-    if (event_target_)
+-      DebugLogging("Previous event target is not null", S_OK);
+-    else
+-      DebugLogging("Previous event target is null", S_OK);
+-  }
+-  event_target_ = event_target;
++    DirectManipulationHelper* helper,
++    ui::WindowEventTarget* event_target)
++    : helper_(helper), event_target_(event_target) {}
++
++bool DirectManipulationEventHandler::SetViewportSizeInPixels(
++    const gfx::Size& viewport_size_in_pixels) {
++  if (viewport_size_in_pixels_ == viewport_size_in_pixels)
++    return false;
++  viewport_size_in_pixels_ = viewport_size_in_pixels;
++  return true;
+ }
+ 
+ void DirectManipulationEventHandler::SetDeviceScaleFactor(
+@@ -175,19 +172,28 @@ HRESULT DirectManipulationEventHandler::OnViewportStatusChanged(
+   if (current != DIRECTMANIPULATION_READY)
+     return S_OK;
+ 
+-  // Reset the viewport when we're idle, so the content transforms always start
+-  // at identity.
+-  // Every animation will receive 2 ready message, we should stop request
+-  // compositor animation at the second ready.
+-  first_ready_ = !first_ready_;
+-  HRESULT hr = helper_->Reset(first_ready_);
++  // Normally gesture sequence will receive 2 READY message, the first one is
++  // gesture end, the second one is from viewport reset. We don't have content
++  // transform in the second RUNNING -> READY. We should not reset on an empty
++  // RUNNING -> READY sequence.
++  if (last_scale_ != 1.0f || last_x_offset_ != 0 || last_y_offset_ != 0) {
++    HRESULT hr = viewport->ZoomToRect(
++        static_cast<float>(0), static_cast<float>(0),
++        static_cast<float>(viewport_size_in_pixels_.width()),
++        static_cast<float>(viewport_size_in_pixels_.height()), FALSE);
++    if (!SUCCEEDED(hr)) {
++      DebugLogging("Viewport zoom to rect failed.", hr);
++      return hr;
++    }
++  }
++
+   last_scale_ = 1.0f;
+   last_x_offset_ = 0.0f;
+   last_y_offset_ = 0.0f;
+ 
+   TransitionToState(GestureState::kNone);
+ 
+-  return hr;
++  return S_OK;
+ }
+ 
+ HRESULT DirectManipulationEventHandler::OnViewportUpdated(
+@@ -294,4 +300,18 @@ HRESULT DirectManipulationEventHandler::OnContentUpdated(
+   return hr;
+ }
+ 
++HRESULT DirectManipulationEventHandler::OnInteraction(
++    IDirectManipulationViewport2* viewport,
++    DIRECTMANIPULATION_INTERACTION_TYPE interaction) {
++  if (interaction == DIRECTMANIPULATION_INTERACTION_BEGIN) {
++    DebugLogging("OnInteraction BEGIN.", S_OK);
++    helper_->AddAnimationObserver();
++  } else if (interaction == DIRECTMANIPULATION_INTERACTION_END) {
++    DebugLogging("OnInteraction END.", S_OK);
++    helper_->RemoveAnimationObserver();
++  }
++
++  return S_OK;
++}
++
+ }  // namespace content
+diff --git a/content/browser/renderer_host/direct_manipulation_event_handler_win.h b/content/browser/renderer_host/direct_manipulation_event_handler_win.h
+index 270e85a09feb0add5b62afe3d9234627070ffe00..f1902085032ffc95edb2d8dcd5224f1c5ecda3d2 100644
+--- a/content/browser/renderer_host/direct_manipulation_event_handler_win.h
++++ b/content/browser/renderer_host/direct_manipulation_event_handler_win.h
+@@ -11,6 +11,7 @@
+ #include <wrl.h>
+ 
+ #include "base/macros.h"
++#include "ui/gfx/geometry/size.h"
+ 
+ namespace ui {
+ 
+@@ -21,6 +22,7 @@ class WindowEventTarget;
+ namespace content {
+ 
+ class DirectManipulationHelper;
++class DirectManipulationBrowserTest;
+ class DirectManipulationUnitTest;
+ 
+ // DirectManipulationEventHandler receives status update and gesture events from
+@@ -33,17 +35,19 @@ class DirectManipulationEventHandler
+               Microsoft::WRL::RuntimeClassFlags<
+                   Microsoft::WRL::RuntimeClassType::ClassicCom>,
+               Microsoft::WRL::FtmBase,
+-              IDirectManipulationViewportEventHandler>> {
++              IDirectManipulationViewportEventHandler,
++              IDirectManipulationInteractionEventHandler>> {
+  public:
+-  explicit DirectManipulationEventHandler(DirectManipulationHelper* helper);
++  DirectManipulationEventHandler(DirectManipulationHelper* helper,
++                                 ui::WindowEventTarget* event_target);
+ 
+-  // WindowEventTarget updates for every DM_POINTERHITTEST in case window
+-  // hierarchy changed.
+-  void SetWindowEventTarget(ui::WindowEventTarget* event_target);
++  // Return true if viewport_size_in_pixels_ changed.
++  bool SetViewportSizeInPixels(const gfx::Size& viewport_size_in_pixels);
+ 
+   void SetDeviceScaleFactor(float device_scale_factor);
+ 
+  private:
++  friend class DirectManipulationBrowserTest;
+   friend DirectManipulationUnitTest;
+ 
+   // DirectManipulationEventHandler();
+@@ -65,18 +69,23 @@ class DirectManipulationEventHandler
+   OnContentUpdated(_In_ IDirectManipulationViewport* viewport,
+                    _In_ IDirectManipulationContent* content) override;
+ 
++  HRESULT STDMETHODCALLTYPE
++  OnInteraction(_In_ IDirectManipulationViewport2* viewport,
++                _In_ DIRECTMANIPULATION_INTERACTION_TYPE interaction) override;
++
+   DirectManipulationHelper* helper_ = nullptr;
+   ui::WindowEventTarget* event_target_ = nullptr;
+   float device_scale_factor_ = 1.0f;
+   float last_scale_ = 1.0f;
+   int last_x_offset_ = 0;
+   int last_y_offset_ = 0;
+-  bool first_ready_ = false;
+   bool should_send_scroll_begin_ = false;
+ 
+   // Current recognized gesture from Direct Manipulation.
+   GestureState gesture_state_ = GestureState::kNone;
+ 
++  gfx::Size viewport_size_in_pixels_;
++
+   DISALLOW_COPY_AND_ASSIGN(DirectManipulationEventHandler);
+ };
+ 
+diff --git a/content/browser/renderer_host/direct_manipulation_helper_win.cc b/content/browser/renderer_host/direct_manipulation_helper_win.cc
+index cc62fd688711153e2930fe06550c219e4cc01173..9401e7f8fb1fafd0532bb1e86035701c1df2ffda 100644
+--- a/content/browser/renderer_host/direct_manipulation_helper_win.cc
++++ b/content/browser/renderer_host/direct_manipulation_helper_win.cc
+@@ -14,6 +14,8 @@
+ #include "base/win/windows_version.h"
+ #include "ui/base/ui_base_features.h"
+ #include "ui/base/win/window_event_target.h"
++#include "ui/compositor/compositor.h"
++#include "ui/compositor/compositor_animation_observer.h"
+ #include "ui/display/win/screen_win.h"
+ #include "ui/gfx/geometry/rect.h"
+ 
+@@ -39,8 +41,9 @@ void DebugLogging(const std::string& s, HRESULT hr) {
+ // static
+ std::unique_ptr<DirectManipulationHelper>
+ DirectManipulationHelper::CreateInstance(HWND window,
++                                         ui::Compositor* compositor,
+                                          ui::WindowEventTarget* event_target) {
+-  if (!::IsWindow(window))
++  if (!::IsWindow(window) || !compositor || !event_target)
+     return nullptr;
+ 
+   if (!base::FeatureList::IsEnabled(features::kPrecisionTouchpad))
+@@ -51,8 +54,7 @@ DirectManipulationHelper::CreateInstance(HWND window,
+     return nullptr;
+ 
+   std::unique_ptr<DirectManipulationHelper> instance =
+-      base::WrapUnique(new DirectManipulationHelper());
+-  instance->window_ = window;
++      base::WrapUnique(new DirectManipulationHelper(window, compositor));
+ 
+   if (instance->Initialize(event_target))
+     return instance;
+@@ -73,11 +75,11 @@ DirectManipulationHelper::CreateInstanceForTesting(
+     return nullptr;
+ 
+   std::unique_ptr<DirectManipulationHelper> instance =
+-      base::WrapUnique(new DirectManipulationHelper());
++      base::WrapUnique(new DirectManipulationHelper(0, nullptr));
+ 
+   instance->event_handler_ =
+-      Microsoft::WRL::Make<DirectManipulationEventHandler>(instance.get());
+-  instance->event_handler_->SetWindowEventTarget(event_target);
++      Microsoft::WRL::Make<DirectManipulationEventHandler>(instance.get(),
++                                                           event_target);
+ 
+   instance->viewport_ = viewport;
+ 
+@@ -85,11 +87,25 @@ DirectManipulationHelper::CreateInstanceForTesting(
+ }
+ 
+ DirectManipulationHelper::~DirectManipulationHelper() {
+-  if (viewport_)
+-    viewport_->Abandon();
++  Destroy();
+ }
+ 
+-DirectManipulationHelper::DirectManipulationHelper() {}
++DirectManipulationHelper::DirectManipulationHelper(HWND window,
++                                                   ui::Compositor* compositor)
++    : window_(window), compositor_(compositor) {}
++
++void DirectManipulationHelper::OnAnimationStep(base::TimeTicks timestamp) {
++  // Simulate 1 frame in update_manager_.
++  HRESULT hr = update_manager_->Update(nullptr);
++  if (!SUCCEEDED(hr))
++    DebugLogging("UpdateManager update failed.", hr);
++}
++
++void DirectManipulationHelper::OnCompositingShuttingDown(
++    ui::Compositor* compositor) {
++  DCHECK_EQ(compositor, compositor_);
++  Destroy();
++}
+ 
+ bool DirectManipulationHelper::Initialize(ui::WindowEventTarget* event_target) {
+   // IDirectManipulationUpdateManager is the first COM object created by the
+@@ -142,8 +158,8 @@ bool DirectManipulationHelper::Initialize(ui::WindowEventTarget* event_target) {
+     return false;
+   }
+ 
+-  event_handler_ = Microsoft::WRL::Make<DirectManipulationEventHandler>(this);
+-  event_handler_->SetWindowEventTarget(event_target);
++  event_handler_ =
++      Microsoft::WRL::Make<DirectManipulationEventHandler>(this, event_target);
+ 
+   // We got Direct Manipulation transform from
+   // IDirectManipulationViewportEventHandler.
+@@ -155,8 +171,9 @@ bool DirectManipulationHelper::Initialize(ui::WindowEventTarget* event_target) {
+   }
+ 
+   // Set default rect for viewport before activate.
+-  viewport_size_in_pixels_ = {1000, 1000};
+-  RECT rect = gfx::Rect(viewport_size_in_pixels_).ToRECT();
++  gfx::Size viewport_size_in_pixels = {1000, 1000};
++  event_handler_->SetViewportSizeInPixels(viewport_size_in_pixels);
++  RECT rect = gfx::Rect(viewport_size_in_pixels).ToRECT();
+   hr = viewport_->SetViewportRect(&rect);
+   if (!SUCCEEDED(hr)) {
+     DebugLogging("Viewport set rect failed.", hr);
+@@ -185,33 +202,9 @@ bool DirectManipulationHelper::Initialize(ui::WindowEventTarget* event_target) {
+   return true;
+ }
+ 
+-void DirectManipulationHelper::Activate() {
+-  HRESULT hr = viewport_->Stop();
+-  if (!SUCCEEDED(hr)) {
+-    DebugLogging("Viewport stop failed.", hr);
+-    return;
+-  }
+-
+-  hr = manager_->Activate(window_);
+-  if (!SUCCEEDED(hr))
+-    DebugLogging("DirectManipulationManager activate failed.", hr);
+-}
+-
+-void DirectManipulationHelper::Deactivate() {
+-  HRESULT hr = viewport_->Stop();
+-  if (!SUCCEEDED(hr)) {
+-    DebugLogging("Viewport stop failed.", hr);
+-    return;
+-  }
+-
+-  hr = manager_->Deactivate(window_);
+-  if (!SUCCEEDED(hr))
+-    DebugLogging("DirectManipulationManager deactivate failed.", hr);
+-}
+-
+ void DirectManipulationHelper::SetSizeInPixels(
+     const gfx::Size& size_in_pixels) {
+-  if (viewport_size_in_pixels_ == size_in_pixels)
++  if (!event_handler_->SetViewportSizeInPixels(size_in_pixels))
+     return;
+ 
+   HRESULT hr = viewport_->Stop();
+@@ -220,16 +213,13 @@ void DirectManipulationHelper::SetSizeInPixels(
+     return;
+   }
+ 
+-  viewport_size_in_pixels_ = size_in_pixels;
+-  RECT rect = gfx::Rect(viewport_size_in_pixels_).ToRECT();
++  RECT rect = gfx::Rect(size_in_pixels).ToRECT();
+   hr = viewport_->SetViewportRect(&rect);
+   if (!SUCCEEDED(hr))
+     DebugLogging("Viewport set rect failed.", hr);
+ }
+ 
+-bool DirectManipulationHelper::OnPointerHitTest(
+-    WPARAM w_param,
+-    ui::WindowEventTarget* event_target) {
++void DirectManipulationHelper::OnPointerHitTest(WPARAM w_param) {
+   // Update the device scale factor.
+   event_handler_->SetDeviceScaleFactor(
+       display::win::ScreenWin::GetScaleFactorForHWND(window_));
+@@ -240,53 +230,62 @@ bool DirectManipulationHelper::OnPointerHitTest(
+   // For WM_POINTER, the pointer type will show the event from mouse.
+   // For WM_POINTERACTIVATE, the pointer id will be different with the following
+   // message.
+-  event_handler_->SetWindowEventTarget(event_target);
+-
+   using GetPointerTypeFn = BOOL(WINAPI*)(UINT32, POINTER_INPUT_TYPE*);
+   UINT32 pointer_id = GET_POINTERID_WPARAM(w_param);
+   POINTER_INPUT_TYPE pointer_type;
+   static const auto get_pointer_type = reinterpret_cast<GetPointerTypeFn>(
+       base::win::GetUser32FunctionPointer("GetPointerType"));
+   if (get_pointer_type && get_pointer_type(pointer_id, &pointer_type) &&
+-      pointer_type == PT_TOUCHPAD && event_target) {
++      pointer_type == PT_TOUCHPAD) {
+     HRESULT hr = viewport_->SetContact(pointer_id);
+-    if (!SUCCEEDED(hr)) {
++    if (!SUCCEEDED(hr))
+       DebugLogging("Viewport set contact failed.", hr);
+-      return false;
+-    }
+-
+-    // Request begin frame for fake viewport.
+-    need_poll_events_ = true;
+   }
+-  return need_poll_events_;
+ }
+ 
+-HRESULT DirectManipulationHelper::Reset(bool need_poll_events) {
+-  // By zooming the primary content to a rect that match the viewport rect, we
+-  // reset the content's transform to identity.
+-  HRESULT hr = viewport_->ZoomToRect(
+-      static_cast<float>(0), static_cast<float>(0),
+-      static_cast<float>(viewport_size_in_pixels_.width()),
+-      static_cast<float>(viewport_size_in_pixels_.height()), FALSE);
+-  if (!SUCCEEDED(hr)) {
+-    DebugLogging("Viewport zoom to rect failed.", hr);
+-    return hr;
+-  }
+-
+-  need_poll_events_ = need_poll_events;
+-  return S_OK;
++void DirectManipulationHelper::AddAnimationObserver() {
++  DCHECK(compositor_);
++  compositor_->AddAnimationObserver(this);
++  has_animation_observer_ = true;
+ }
+ 
+-bool DirectManipulationHelper::PollForNextEvent() {
+-  // Simulate 1 frame in update_manager_.
+-  HRESULT hr = update_manager_->Update(nullptr);
+-  if (!SUCCEEDED(hr))
+-    DebugLogging("UpdateManager update failed.", hr);
+-  return need_poll_events_;
++void DirectManipulationHelper::RemoveAnimationObserver() {
++  DCHECK(compositor_);
++  compositor_->RemoveAnimationObserver(this);
++  has_animation_observer_ = false;
+ }
+ 
+ void DirectManipulationHelper::SetDeviceScaleFactorForTesting(float factor) {
+   event_handler_->SetDeviceScaleFactor(factor);
+ }
+ 
++void DirectManipulationHelper::Destroy() {
++  if (!compositor_)
++    return;
++  if (has_animation_observer_)
++    RemoveAnimationObserver();
++  compositor_ = nullptr;
++
++  HRESULT hr;
++  if (viewport_) {
++    hr = viewport_->Stop();
++    if (!SUCCEEDED(hr))
++      DebugLogging("Viewport stop failed.", hr);
++
++    hr = viewport_->RemoveEventHandler(view_port_handler_cookie_);
++    if (!SUCCEEDED(hr))
++      DebugLogging("Viewport remove event handler failed.", hr);
++
++    hr = viewport_->Abandon();
++    if (!SUCCEEDED(hr))
++      DebugLogging("Viewport abandon failed.", hr);
++  }
++
++  if (manager_) {
++    hr = manager_->Deactivate(window_);
++    if (!SUCCEEDED(hr))
++      DebugLogging("DirectManipulationManager deactivate failed.", hr);
++  }
++}
++
+ }  // namespace content
+diff --git a/content/browser/renderer_host/direct_manipulation_helper_win.h b/content/browser/renderer_host/direct_manipulation_helper_win.h
+index 76c889b35508ebd92f803a2dd723cfdc11cef1e1..adf19d6849f69b83c51b123c86600a15679da9c6 100644
+--- a/content/browser/renderer_host/direct_manipulation_helper_win.h
++++ b/content/browser/renderer_host/direct_manipulation_helper_win.h
+@@ -16,10 +16,12 @@
+ #include "base/macros.h"
+ #include "content/browser/renderer_host/direct_manipulation_event_handler_win.h"
+ #include "content/common/content_export.h"
++#include "ui/compositor/compositor_animation_observer.h"
+ #include "ui/gfx/geometry/size.h"
+ 
+ namespace ui {
+ 
++class Compositor;
+ class WindowEventTarget;
+ 
+ }  // namespace ui
+@@ -44,13 +46,15 @@ bool LoggingEnabled();
+ //    when DM_POINTERHITTEST.
+ // 3. OnViewportStatusChanged will be called when the gesture phase change.
+ //    OnContentUpdated will be called when the gesture update.
+-class CONTENT_EXPORT DirectManipulationHelper {
++class CONTENT_EXPORT DirectManipulationHelper
++    : public ui::CompositorAnimationObserver {
+  public:
+   // Creates and initializes an instance of this class if Direct Manipulation is
+   // enabled on the platform. Returns nullptr if it disabled or failed on
+   // initialization.
+   static std::unique_ptr<DirectManipulationHelper> CreateInstance(
+       HWND window,
++      ui::Compositor* compositor,
+       ui::WindowEventTarget* event_target);
+ 
+   // Creates and initializes an instance for testing.
+@@ -58,49 +62,48 @@ class CONTENT_EXPORT DirectManipulationHelper {
+       ui::WindowEventTarget* event_target,
+       Microsoft::WRL::ComPtr<IDirectManipulationViewport> viewport);
+ 
+-  ~DirectManipulationHelper();
++  ~DirectManipulationHelper() override;
+ 
+-  // Actives Direct Manipulation, call when window show.
+-  void Activate();
+-
+-  // Deactivates Direct Manipulation, call when window show.
+-  void Deactivate();
++  // CompositorAnimationObserver implements.
++  // DirectManipulation needs to poll for new events every frame while finger
++  // gesturing on touchpad.
++  void OnAnimationStep(base::TimeTicks timestamp) override;
++  void OnCompositingShuttingDown(ui::Compositor* compositor) override;
+ 
+   // Updates viewport size. Call it when window bounds updated.
+   void SetSizeInPixels(const gfx::Size& size_in_pixels);
+ 
+-  // Reset for gesture end.
+-  HRESULT Reset(bool need_animtation);
++  // Pass the pointer hit test to Direct Manipulation.
++  void OnPointerHitTest(WPARAM w_param);
+ 
+-  // Pass the pointer hit test to Direct Manipulation. Return true indicated we
+-  // need poll for new events every frame from here.
+-  bool OnPointerHitTest(WPARAM w_param, ui::WindowEventTarget* event_target);
++  // Register this as an AnimationObserver of ui::Compositor.
++  void AddAnimationObserver();
+ 
+-  // On each frame poll new Direct Manipulation events. Return true if we still
+-  // need poll for new events on next frame, otherwise stop request need begin
+-  // frame.
+-  bool PollForNextEvent();
++  // Unregister this as an AnimationObserver of ui::Compositor.
++  void RemoveAnimationObserver();
+ 
+  private:
+   friend class content::DirectManipulationBrowserTest;
+   friend class DirectManipulationUnitTest;
+ 
+-  DirectManipulationHelper();
++  DirectManipulationHelper(HWND window, ui::Compositor* compositor);
+ 
+   // This function instantiates Direct Manipulation and creates a viewport for
+-  // the passed in |window|. Return false if initialize failed.
++  // |window_|. Return false if initialize failed.
+   bool Initialize(ui::WindowEventTarget* event_target);
+ 
+   void SetDeviceScaleFactorForTesting(float factor);
+ 
++  void Destroy();
++
+   Microsoft::WRL::ComPtr<IDirectManipulationManager> manager_;
+   Microsoft::WRL::ComPtr<IDirectManipulationUpdateManager> update_manager_;
+   Microsoft::WRL::ComPtr<IDirectManipulationViewport> viewport_;
+   Microsoft::WRL::ComPtr<DirectManipulationEventHandler> event_handler_;
+   HWND window_;
++  ui::Compositor* compositor_ = nullptr;
+   DWORD view_port_handler_cookie_;
+-  bool need_poll_events_ = false;
+-  gfx::Size viewport_size_in_pixels_;
++  bool has_animation_observer_ = false;
+ 
+   DISALLOW_COPY_AND_ASSIGN(DirectManipulationHelper);
+ };
+diff --git a/content/browser/renderer_host/direct_manipulation_win_browsertest.cc b/content/browser/renderer_host/direct_manipulation_win_browsertest.cc
+index 7648cf140d0de6e82ea81c33877495c91e7a57a9..10cf453cda7110b0531854ba63bb908fdd590d50 100644
+--- a/content/browser/renderer_host/direct_manipulation_win_browsertest.cc
++++ b/content/browser/renderer_host/direct_manipulation_win_browsertest.cc
+@@ -49,33 +49,23 @@ class DirectManipulationBrowserTest : public ContentBrowserTest,
+     return rwhva->legacy_render_widget_host_HWND_;
+   }
+ 
+-  HWND GetSubWindowHWND() {
+-    LegacyRenderWidgetHostHWND* lrwhh = GetLegacyRenderWidgetHostHWND();
+-
+-    return lrwhh->hwnd();
+-  }
+-
+   ui::WindowEventTarget* GetWindowEventTarget() {
+     LegacyRenderWidgetHostHWND* lrwhh = GetLegacyRenderWidgetHostHWND();
+ 
+     return lrwhh->GetWindowEventTarget(lrwhh->GetParent());
+   }
+ 
+-  void SimulatePointerHitTest() {
+-    LegacyRenderWidgetHostHWND* lrwhh = GetLegacyRenderWidgetHostHWND();
+-
+-    lrwhh->direct_manipulation_helper_->need_poll_events_ = true;
+-    lrwhh->CreateAnimationObserver();
+-  }
+-
+-  void UpdateParent(HWND hwnd) {
++  void SetDirectManipulationInteraction(
++      DIRECTMANIPULATION_INTERACTION_TYPE type) {
+     LegacyRenderWidgetHostHWND* lrwhh = GetLegacyRenderWidgetHostHWND();
+ 
+-    lrwhh->UpdateParent(hwnd);
++    lrwhh->direct_manipulation_helper_->event_handler_->OnInteraction(nullptr,
++                                                                      type);
+   }
+ 
+-  bool HasCompositorAnimationObserver(LegacyRenderWidgetHostHWND* lrwhh) {
+-    return lrwhh->compositor_animation_observer_ != nullptr;
++  bool HasAnimationObserver(LegacyRenderWidgetHostHWND* lrwhh) {
++    return lrwhh->direct_manipulation_helper_->compositor_
++        ->HasAnimationObserver(lrwhh->direct_manipulation_helper_.get());
+   }
+ 
+  private:
+@@ -88,8 +78,10 @@ INSTANTIATE_TEST_SUITE_P(WithScrollEventPhase,
+                          DirectManipulationBrowserTest,
+                          testing::Bool());
+ 
+-// Ensure the AnimationObserver destroy when hwnd reparent to other hwnd.
+-IN_PROC_BROWSER_TEST_P(DirectManipulationBrowserTest, HWNDReparent) {
++// Ensure the AnimationObserver is only created after direct manipulation
++// interaction begin and destroyed after direct manipulation interaction end.
++IN_PROC_BROWSER_TEST_P(DirectManipulationBrowserTest,
++                       ObserverDuringInteraction) {
+   if (base::win::GetVersion() < base::win::Version::WIN10)
+     return;
+ 
+@@ -98,25 +90,20 @@ IN_PROC_BROWSER_TEST_P(DirectManipulationBrowserTest, HWNDReparent) {
+   LegacyRenderWidgetHostHWND* lrwhh = GetLegacyRenderWidgetHostHWND();
+   ASSERT_TRUE(lrwhh);
+ 
+-  // The observer should not create before it needed.
+-  ASSERT_TRUE(!HasCompositorAnimationObserver(lrwhh));
++  // The observer should not be created before it is needed.
++  EXPECT_FALSE(HasAnimationObserver(lrwhh));
+ 
+-  // Add AnimationObserver to tab to simulate direct manipulation start.
+-  SimulatePointerHitTest();
+-  ASSERT_TRUE(HasCompositorAnimationObserver(lrwhh));
++  // Begin direct manipulation interaction.
++  SetDirectManipulationInteraction(DIRECTMANIPULATION_INTERACTION_BEGIN);
++  // AnimationObserver should be added after direct manipulation interaction
++  // begin.
++  EXPECT_TRUE(HasAnimationObserver(lrwhh));
+ 
+-  // Create another browser.
+-  Shell* shell2 = CreateBrowser();
+-  NavigateToURL(shell2, GURL(url::kAboutBlankURL));
+-
+-  // Move to the tab to browser2.
+-  UpdateParent(
+-      shell2->window()->GetRootWindow()->GetHost()->GetAcceleratedWidget());
++  // End direct manipulation interaction.
++  SetDirectManipulationInteraction(DIRECTMANIPULATION_INTERACTION_END);
+ 
+   // The animation observer should be removed.
+-  EXPECT_FALSE(HasCompositorAnimationObserver(lrwhh));
+-
+-  shell2->Close();
++  EXPECT_FALSE(HasAnimationObserver(lrwhh));
+ }
+ 
+ // EventLogger is to observe the events sent from WindowEventTarget (the root
+diff --git a/content/browser/renderer_host/direct_manipulation_win_unittest.cc b/content/browser/renderer_host/direct_manipulation_win_unittest.cc
+index 3bf1b55555d0485c25575264045d415cf534323c..ccfa4d90b4e5c546c78afdac7c6b7b36f6096514 100644
+--- a/content/browser/renderer_host/direct_manipulation_win_unittest.cc
++++ b/content/browser/renderer_host/direct_manipulation_win_unittest.cc
+@@ -31,6 +31,12 @@ class MockDirectManipulationViewport
+ 
+   ~MockDirectManipulationViewport() override {}
+ 
++  bool WasZoomToRectCalled() {
++    bool called = zoom_to_rect_called_;
++    zoom_to_rect_called_ = false;
++    return called;
++  }
++
+   HRESULT STDMETHODCALLTYPE Enable() override { return S_OK; }
+ 
+   HRESULT STDMETHODCALLTYPE Disable() override { return S_OK; }
+@@ -75,6 +81,7 @@ class MockDirectManipulationViewport
+                                        _In_ const float right,
+                                        _In_ const float bottom,
+                                        _In_ BOOL animate) override {
++    zoom_to_rect_called_ = true;
+     return S_OK;
+   }
+ 
+@@ -161,6 +168,8 @@ class MockDirectManipulationViewport
+   HRESULT STDMETHODCALLTYPE Abandon() override { return S_OK; }
+ 
+  private:
++  bool zoom_to_rect_called_ = false;
++
+   DISALLOW_COPY_AND_ASSIGN(MockDirectManipulationViewport);
+ };
+ 
+@@ -397,13 +406,7 @@ class DirectManipulationUnitTest : public testing::Test {
+         viewport_.Get(), content_.Get());
+   }
+ 
+-  void SetNeedAnimation(bool need_poll_events) {
+-    direct_manipulation_helper_->need_poll_events_ = need_poll_events;
+-  }
+-
+-  bool NeedAnimation() {
+-    return direct_manipulation_helper_->need_poll_events_;
+-  }
++  bool WasZoomToRectCalled() { return viewport_->WasZoomToRectCalled(); }
+ 
+   void SetDeviceScaleFactor(float factor) {
+     direct_manipulation_helper_->SetDeviceScaleFactorForTesting(factor);
+@@ -721,21 +724,19 @@ TEST_F(DirectManipulationUnitTest,
+ }
+ 
+ TEST_F(DirectManipulationUnitTest,
+-       NeedAnimtationShouldBeFalseAfterSecondReset) {
++       ZoomToRectShouldNotBeCalledInEmptyRunningReadySequence) {
+   if (!GetDirectManipulationHelper())
+     return;
+ 
+-  // Direct Manipulation will set need_poll_events_ true when DM_POINTERTEST
+-  // from touchpad.
+-  SetNeedAnimation(true);
++  ContentUpdated(1.0f, 5, 0);
+ 
+   // Receive first ready when gesture end.
+   ViewportStatusChanged(DIRECTMANIPULATION_READY, DIRECTMANIPULATION_RUNNING);
+-  EXPECT_TRUE(NeedAnimation());
++  EXPECT_TRUE(WasZoomToRectCalled());
+ 
+   // Receive second ready from ZoomToRect.
+   ViewportStatusChanged(DIRECTMANIPULATION_READY, DIRECTMANIPULATION_RUNNING);
+-  EXPECT_FALSE(NeedAnimation());
++  EXPECT_FALSE(WasZoomToRectCalled());
+ }
+ 
+ TEST_F(DirectManipulationUnitTest, HiDPIScroll) {
+diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.cc b/content/browser/renderer_host/legacy_render_widget_host_win.cc
+index b78186969fc928468c67f0bfcc853f5d7418df95..d2dd02a743a9bc908b6f8438ccac9dd85aa0a281 100644
+--- a/content/browser/renderer_host/legacy_render_widget_host_win.cc
++++ b/content/browser/renderer_host/legacy_render_widget_host_win.cc
+@@ -27,7 +27,6 @@
+ #include "ui/base/view_prop.h"
+ #include "ui/base/win/internal_constants.h"
+ #include "ui/base/win/window_event_target.h"
+-#include "ui/compositor/compositor.h"
+ #include "ui/display/win/screen_win.h"
+ #include "ui/gfx/geometry/rect.h"
+ 
+@@ -38,47 +37,6 @@ namespace content {
+ // accessibility support.
+ const int kIdScreenReaderHoneyPot = 1;
+ 
+-// DirectManipulation needs to poll for new events every frame while finger
+-// gesturing on touchpad.
+-class CompositorAnimationObserverForDirectManipulation
+-    : public ui::CompositorAnimationObserver {
+- public:
+-  CompositorAnimationObserverForDirectManipulation(
+-      LegacyRenderWidgetHostHWND* render_widget_host_hwnd,
+-      ui::Compositor* compositor)
+-      : render_widget_host_hwnd_(render_widget_host_hwnd),
+-        compositor_(compositor) {
+-    DCHECK(compositor_);
+-    compositor_->AddAnimationObserver(this);
+-    DebugLogging("Add AnimationObserverForDirectManipulation.");
+-  }
+-
+-  ~CompositorAnimationObserverForDirectManipulation() override {
+-    if (compositor_) {
+-      compositor_->RemoveAnimationObserver(this);
+-      DebugLogging("Remove AnimationObserverForDirectManipulation.");
+-    }
+-  }
+-
+-  // ui::CompositorAnimationObserver
+-  void OnAnimationStep(base::TimeTicks timestamp) override {
+-    render_widget_host_hwnd_->PollForNextEvent();
+-  }
+-
+-  // ui::CompositorAnimationObserver
+-  void OnCompositingShuttingDown(ui::Compositor* compositor) override {
+-    DebugLogging("OnCompositingShuttingDown.");
+-    compositor->RemoveAnimationObserver(this);
+-    compositor_ = nullptr;
+-  }
+-
+- private:
+-  LegacyRenderWidgetHostHWND* render_widget_host_hwnd_;
+-  ui::Compositor* compositor_;
+-
+-  DISALLOW_COPY_AND_ASSIGN(CompositorAnimationObserverForDirectManipulation);
+-};
+-
+ // static
+ LegacyRenderWidgetHostHWND* LegacyRenderWidgetHostHWND::Create(
+     HWND parent) {
+@@ -103,8 +61,9 @@ LegacyRenderWidgetHostHWND* LegacyRenderWidgetHostHWND::Create(
+ }
+ 
+ void LegacyRenderWidgetHostHWND::Destroy() {
+-  // Stop the AnimationObserver when window close.
+-  DestroyAnimationObserver();
++  // Delete DirectManipulationHelper before the window is destroyed.
++  if (direct_manipulation_helper_)
++    direct_manipulation_helper_.reset();
+   host_ = nullptr;
+   if (::IsWindow(hwnd()))
+     ::DestroyWindow(hwnd());
+@@ -113,10 +72,16 @@ void LegacyRenderWidgetHostHWND::Destroy() {
+ void LegacyRenderWidgetHostHWND::UpdateParent(HWND parent) {
+   if (GetWindowEventTarget(GetParent()))
+     GetWindowEventTarget(GetParent())->HandleParentChanged();
+-  // Stop the AnimationObserver when window hide. eg. tab switch, move tab to
+-  // another window.
+-  DestroyAnimationObserver();
++
+   ::SetParent(hwnd(), parent);
++
++  // Direct Manipulation is enabled on Windows 10+. The CreateInstance function
++  // returns NULL if Direct Manipulation is not available. Recreate
++  // |direct_manipulation_helper_| when parent changed (compositor and window
++  // event target updated).
++  direct_manipulation_helper_ = DirectManipulationHelper::CreateInstance(
++      hwnd(), host_->GetNativeView()->GetHost()->compositor(),
++      GetWindowEventTarget(GetParent()));
+ }
+ 
+ HWND LegacyRenderWidgetHostHWND::GetParent() {
+@@ -125,14 +90,10 @@ HWND LegacyRenderWidgetHostHWND::GetParent() {
+ 
+ void LegacyRenderWidgetHostHWND::Show() {
+   ::ShowWindow(hwnd(), SW_SHOW);
+-  if (direct_manipulation_helper_)
+-    direct_manipulation_helper_->Activate();
+ }
+ 
+ void LegacyRenderWidgetHostHWND::Hide() {
+   ::ShowWindow(hwnd(), SW_HIDE);
+-  if (direct_manipulation_helper_)
+-    direct_manipulation_helper_->Deactivate();
+ }
+ 
+ void LegacyRenderWidgetHostHWND::SetBounds(const gfx::Rect& bounds) {
+@@ -191,11 +152,6 @@ bool LegacyRenderWidgetHostHWND::Init() {
+                    CHILDID_SELF);
+   }
+ 
+-  // Direct Manipulation is enabled on Windows 10+. The CreateInstance function
+-  // returns NULL if Direct Manipulation is not available.
+-  direct_manipulation_helper_ = DirectManipulationHelper::CreateInstance(
+-      hwnd(), GetWindowEventTarget(GetParent()));
+-
+   // Disable pen flicks (http://crbug.com/506977)
+   base::win::DisableFlicks(hwnd());
+ 
+@@ -501,21 +457,6 @@ LRESULT LegacyRenderWidgetHostHWND::OnSize(UINT message,
+   return 0;
+ }
+ 
+-LRESULT LegacyRenderWidgetHostHWND::OnWindowPosChanged(UINT message,
+-                                                       WPARAM w_param,
+-                                                       LPARAM l_param) {
+-  WINDOWPOS* window_pos = reinterpret_cast<WINDOWPOS*>(l_param);
+-  if (direct_manipulation_helper_) {
+-    if (window_pos->flags & SWP_SHOWWINDOW) {
+-      direct_manipulation_helper_->Activate();
+-    } else if (window_pos->flags & SWP_HIDEWINDOW) {
+-      direct_manipulation_helper_->Deactivate();
+-    }
+-  }
+-  SetMsgHandled(FALSE);
+-  return 0;
+-}
+-
+ LRESULT LegacyRenderWidgetHostHWND::OnDestroy(UINT message,
+                                               WPARAM w_param,
+                                               LPARAM l_param) {
+@@ -534,30 +475,12 @@ LRESULT LegacyRenderWidgetHostHWND::OnPointerHitTest(UINT message,
+     return 0;
+ 
+   DebugLogging("Receive DM_POINTERHITTEST.");
+-  // Update window event target for each DM_POINTERHITTEST.
+-  if (direct_manipulation_helper_->OnPointerHitTest(
+-          w_param, GetWindowEventTarget(GetParent()))) {
+-    if (compositor_animation_observer_) {
+-      // This is reach if Windows send a DM_POINTERHITTEST before the last
+-      // DM_POINTERHITTEST receive READY status. We never see this but still
+-      // worth to handle it.
+-      DebugLogging("AnimationObserverForDirectManipulation exists.");
+-      return 0;
+-    }
+ 
+-    CreateAnimationObserver();
+-  }
++  direct_manipulation_helper_->OnPointerHitTest(w_param);
+ 
+   return 0;
+ }
+ 
+-void LegacyRenderWidgetHostHWND::PollForNextEvent() {
+-  DCHECK(direct_manipulation_helper_);
+-
+-  if (!direct_manipulation_helper_->PollForNextEvent())
+-    DestroyAnimationObserver();
+-}
+-
+ gfx::NativeViewAccessible
+ LegacyRenderWidgetHostHWND::GetOrCreateWindowRootAccessible() {
+   if (!host_)
+@@ -589,20 +512,4 @@ LegacyRenderWidgetHostHWND::GetOrCreateWindowRootAccessible() {
+   return root->GetNativeViewAccessible();
+ }
+ 
+-void LegacyRenderWidgetHostHWND::CreateAnimationObserver() {
+-  DCHECK(!compositor_animation_observer_);
+-  DCHECK(host_);
+-  DCHECK(host_->GetNativeView()->GetHost());
+-  DCHECK(host_->GetNativeView()->GetHost()->compositor());
+-
+-  compositor_animation_observer_ =
+-      std::make_unique<CompositorAnimationObserverForDirectManipulation>(
+-          this, host_->GetNativeView()->GetHost()->compositor());
+-}
+-
+-void LegacyRenderWidgetHostHWND::DestroyAnimationObserver() {
+-  DebugLogging("DestroyAnimationObserver.");
+-  compositor_animation_observer_.reset();
+-}
+-
+ }  // namespace content
+diff --git a/content/browser/renderer_host/legacy_render_widget_host_win.h b/content/browser/renderer_host/legacy_render_widget_host_win.h
+index 4f12296e3185caac685c8326192d88d32037a9d9..be0ea7bdbf460f414c94b0f2275a00424ec3198a 100644
+--- a/content/browser/renderer_host/legacy_render_widget_host_win.h
++++ b/content/browser/renderer_host/legacy_render_widget_host_win.h
+@@ -17,7 +17,6 @@
+ 
+ #include "base/macros.h"
+ #include "content/common/content_export.h"
+-#include "ui/compositor/compositor_animation_observer.h"
+ #include "ui/gfx/geometry/rect.h"
+ #include "ui/gfx/native_widget_types.h"
+ 
+@@ -99,7 +98,6 @@ class CONTENT_EXPORT LegacyRenderWidgetHostHWND
+                           OnMouseRange)
+     MESSAGE_HANDLER_EX(WM_NCCALCSIZE, OnNCCalcSize)
+     MESSAGE_HANDLER_EX(WM_SIZE, OnSize)
+-    MESSAGE_HANDLER_EX(WM_WINDOWPOSCHANGED, OnWindowPosChanged)
+     MESSAGE_HANDLER_EX(WM_DESTROY, OnDestroy)
+     MESSAGE_HANDLER_EX(DM_POINTERHITTEST, OnPointerHitTest)
+   END_MSG_MAP()
+@@ -126,10 +124,6 @@ class CONTENT_EXPORT LegacyRenderWidgetHostHWND
+     host_ = host;
+   }
+ 
+-  // DirectManipulation needs to poll for new events every frame while finger
+-  // gesturing on touchpad.
+-  void PollForNextEvent();
+-
+   // Return the root accessible object for either MSAA or UI Automation.
+   gfx::NativeViewAccessible GetOrCreateWindowRootAccessible();
+ 
+@@ -166,15 +160,10 @@ class CONTENT_EXPORT LegacyRenderWidgetHostHWND
+   LRESULT OnSetCursor(UINT message, WPARAM w_param, LPARAM l_param);
+   LRESULT OnNCCalcSize(UINT message, WPARAM w_param, LPARAM l_param);
+   LRESULT OnSize(UINT message, WPARAM w_param, LPARAM l_param);
+-  LRESULT OnWindowPosChanged(UINT message, WPARAM w_param, LPARAM l_param);
+   LRESULT OnDestroy(UINT message, WPARAM w_param, LPARAM l_param);
+ 
+   LRESULT OnPointerHitTest(UINT message, WPARAM w_param, LPARAM l_param);
+ 
+-  void CreateAnimationObserver();
+-
+-  void DestroyAnimationObserver();
+-
+   Microsoft::WRL::ComPtr<IAccessible> window_accessible_;
+ 
+   // Set to true if we turned on mouse tracking.
+@@ -193,9 +182,6 @@ class CONTENT_EXPORT LegacyRenderWidgetHostHWND
+   // in Chrome on Windows 10.
+   std::unique_ptr<DirectManipulationHelper> direct_manipulation_helper_;
+ 
+-  std::unique_ptr<ui::CompositorAnimationObserver>
+-      compositor_animation_observer_;
+-
+   DISALLOW_COPY_AND_ASSIGN(LegacyRenderWidgetHostHWND);
+ };
+