Bug 1443301 - Give the dynamic toolbar class a non-owning ref to the APZCTreeManager. r=botond
authorKartikaya Gupta <kgupta@mozilla.com>
Wed, 07 Mar 2018 17:34:10 -0500
changeset 462200 3034411c797eb0ed704743d1878567ca90574983
parent 462199 81873f9d6821e109bea9a12548e371c2323f01cb
child 462201 7fdb52108da96bc7c30ebc1583bf93f30cc1448b
push id1683
push usersfraser@mozilla.com
push dateThu, 26 Apr 2018 16:43:40 +0000
treeherdermozilla-release@5af6cb21869d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersbotond
bugs1443301
milestone60.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1443301 - Give the dynamic toolbar class a non-owning ref to the APZCTreeManager. r=botond MozReview-Commit-ID: 8lE53GEhDMI
gfx/layers/apz/src/APZCTreeManager.cpp
gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
--- a/gfx/layers/apz/src/APZCTreeManager.cpp
+++ b/gfx/layers/apz/src/APZCTreeManager.cpp
@@ -235,17 +235,17 @@ APZCTreeManager::APZCTreeManager(uint64_
   RefPtr<APZCTreeManager> self(this);
   NS_DispatchToMainThread(
     NS_NewRunnableFunction("layers::APZCTreeManager::APZCTreeManager", [self] {
       self->mFlushObserver = new CheckerboardFlushObserver(self);
     }));
   AsyncPanZoomController::InitializeGlobalState();
   mApzcTreeLog.ConditionOnPrefFunction(gfxPrefs::APZPrintTree);
 #if defined(MOZ_WIDGET_ANDROID)
-  mToolbarAnimator = new AndroidDynamicToolbarAnimator();
+  mToolbarAnimator = new AndroidDynamicToolbarAnimator(this);
 #endif // (MOZ_WIDGET_ANDROID)
 }
 
 APZCTreeManager::~APZCTreeManager()
 {
 }
 
 void
@@ -2020,16 +2020,20 @@ APZCTreeManager::AdjustScrollForSurfaceS
   }
 }
 
 void
 APZCTreeManager::ClearTree()
 {
   APZThreadUtils::AssertOnSamplerThread();
 
+#if defined(MOZ_WIDGET_ANDROID)
+  mToolbarAnimator->ClearTreeManager();
+#endif
+
   // Ensure that no references to APZCs are alive in any lingering input
   // blocks. This breaks cycles from InputBlockState::mTargetApzc back to
   // the InputQueue.
   APZThreadUtils::RunOnControllerThread(NewRunnableMethod(
     "layers::InputQueue::Clear", mInputQueue, &InputQueue::Clear));
 
   RecursiveMutexAutoLock lock(mTreeLock);
 
--- a/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
+++ b/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
@@ -34,18 +34,19 @@ static const int32_t MOVE_TOOLBAR_DOWN  
 static const int32_t MOVE_TOOLBAR_UP    = -1;    // Multiplier to move the toolbar up
 static const float   SHRINK_FACTOR      = 0.95f; // Amount to shrink the either the full content for small pages or the amount left
                                                  // See: PageTooSmallEnsureToolbarVisible()
 } // namespace
 
 namespace mozilla {
 namespace layers {
 
-AndroidDynamicToolbarAnimator::AndroidDynamicToolbarAnimator()
+AndroidDynamicToolbarAnimator::AndroidDynamicToolbarAnimator(APZCTreeManager* aApz)
   : mRootLayerTreeId(0)
+  , mApz(aApz)
   // Read/Write Compositor Thread, Read only Controller thread
   , mToolbarState(eToolbarVisible)
   , mPinnedFlags(0)
   // Controller thread only
   , mControllerScrollingRootContent(false)
   , mControllerDragThresholdReached(false)
   , mControllerCancelTouchTracking(false)
   , mControllerDragChangedDirection(false)
@@ -90,16 +91,23 @@ AndroidDynamicToolbarAnimator::Initializ
 
   // Send queued messages that were posted before Initialize() was called.
   for (QueuedMessage* message = mCompositorQueuedMessages.getFirst(); message != nullptr; message = message->getNext()) {
     uiController->ToolbarAnimatorMessageFromCompositor(message->mMessage);
   }
   mCompositorQueuedMessages.clear();
 }
 
+void
+AndroidDynamicToolbarAnimator::ClearTreeManager()
+{
+  MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
+  mApz = nullptr;
+}
+
 static bool
 GetTouchY(MultiTouchInput& multiTouch, ScreenIntCoord* value)
 {
   MOZ_ASSERT(value);
   if (multiTouch.mTouches.Length() == 1) {
     *value = multiTouch.mTouches[0].mScreenPoint.y;
     return true;
   }
@@ -338,31 +346,32 @@ AndroidDynamicToolbarAnimator::UpdateAni
   if ((mToolbarState != eToolbarAnimating) || mCompositorShutdown) {
     return false;
   }
 
   CompositorBridgeParent* parent = CompositorBridgeParent::GetCompositorBridgeParentFromLayersId(mRootLayerTreeId);
   if (!parent) {
     return false;
   }
+  MOZ_ASSERT(mApz); // because parent is non-null
 
   AsyncCompositionManager* manager = parent->GetCompositionManager(nullptr);
   if (!manager) {
     return false;
   }
 
   if (mCompositorSurfaceHeight != mCompositorCompositionSize.height) {
     // Waiting for the composition to resize
     if (mCompositorWaitForPageResize && mCompositorAnimationStarted) {
       mCompositorWaitForPageResize = false;
     } else {
       return true;
     }
   } else if (!mCompositorAnimationStarted) {
-    parent->GetAPZCTreeManager()->AdjustScrollForSurfaceShift(ScreenPoint(0.0f, (float)(-mCompositorToolbarHeight)));
+    mApz->AdjustScrollForSurfaceShift(ScreenPoint(0.0f, (float)(-mCompositorToolbarHeight)));
     manager->SetFixedLayerMargins(mCompositorToolbarHeight, 0);
     mCompositorAnimationStarted = true;
     mCompositorReceivedFirstPaint = false;
     mCompositorToolbarShowRequested = false;
     // Reset the start time so the toolbar does not jump on the first animation frame
     mCompositorAnimationStartTimeStamp = aCurrentFrame;
     // Since the delta time for this frame will be zero. Just return, the animation will start on the next frame.
     return true;
@@ -407,17 +416,17 @@ AndroidDynamicToolbarAnimator::UpdateAni
     mCompositorToolbarHeight = 0;
   }
 
   if (continueAnimating) {
     manager->SetFixedLayerMargins(mCompositorToolbarHeight, 0);
   } else {
     if (mCompositorAnimationDirection == MOVE_TOOLBAR_DOWN) {
       if (!mCompositorReceivedFirstPaint) {
-        parent->GetAPZCTreeManager()->AdjustScrollForSurfaceShift(ScreenPoint(0.0f, (float)mCompositorMaxToolbarHeight));
+        mApz->AdjustScrollForSurfaceShift(ScreenPoint(0.0f, (float)mCompositorMaxToolbarHeight));
       }
       manager->SetFixedLayerMargins(0, GetFixedLayerMarginsBottom());
     } else {
       manager->SetFixedLayerMargins(0, 0);
     }
   }
 
   if (!continueAnimating) {
@@ -628,19 +637,18 @@ AndroidDynamicToolbarAnimator::ProcessTo
     // If there was no delta left over, the event was completely consumed.
     if (deltaRemainder == 0) {
       status = nsEventStatus_eConsumeNoDefault;
     }
 
     uint32_t timeDelta = aTimeStamp - mControllerLastEventTimeStamp;
     if (mControllerLastEventTimeStamp && timeDelta && aDelta) {
       float speed = -(float)aDelta / (float)timeDelta;
-      CompositorBridgeParent* parent = CompositorBridgeParent::GetCompositorBridgeParentFromLayersId(mRootLayerTreeId);
-      if (parent) {
-        parent->GetAPZCTreeManager()->ProcessTouchVelocity(aTimeStamp, speed);
+      if (mApz) {
+        mApz->ProcessTouchVelocity(aTimeStamp, speed);
       }
     }
   }
 
   return status;
 }
 
 void
@@ -885,19 +893,18 @@ AndroidDynamicToolbarAnimator::StartComp
     mToolbarState = eToolbarAnimating;
     if (initialToolbarState != eToolbarAnimating) {
       mCompositorAnimationStarted = false;
     }
     // Let the controller know we are starting an animation so it may clear the AnimationStartPending flag.
     NotifyControllerAnimationStarted();
     // Only reset the time stamp and start compositor animation if not already animating.
     if (initialToolbarState != eToolbarAnimating) {
-      CompositorBridgeParent* parent = CompositorBridgeParent::GetCompositorBridgeParentFromLayersId(mRootLayerTreeId);
-      if (parent) {
-        mCompositorAnimationStartTimeStamp = parent->GetAPZCTreeManager()->GetFrameTime();
+      if (mApz) {
+        mCompositorAnimationStartTimeStamp = mApz->GetFrameTime();
       }
       // Kick the compositor to start the animation if we aren't already animating.
       RequestComposite();
     }
   }
 }
 
 void
@@ -928,18 +935,19 @@ AndroidDynamicToolbarAnimator::StopCompo
 
   if (mToolbarState == eToolbarAnimating) {
     if (mCompositorAnimationStarted) {
       mCompositorAnimationStarted = false;
       CompositorBridgeParent* parent = CompositorBridgeParent::GetCompositorBridgeParentFromLayersId(mRootLayerTreeId);
       if (parent) {
         AsyncCompositionManager* manager = parent->GetCompositionManager(nullptr);
         if (manager) {
-            parent->GetAPZCTreeManager()->AdjustScrollForSurfaceShift(ScreenPoint(0.0f, (float)(mCompositorToolbarHeight)));
-            RequestComposite();
+          MOZ_ASSERT(mApz);
+          mApz->AdjustScrollForSurfaceShift(ScreenPoint(0.0f, (float)(mCompositorToolbarHeight)));
+          RequestComposite();
         }
       }
     }
     mToolbarState = eToolbarUnlocked;
   }
 
   NotifyControllerAnimationStopped(mCompositorToolbarHeight);
 }
--- a/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
+++ b/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
@@ -17,16 +17,17 @@
 #include "mozilla/Maybe.h"
 #include "mozilla/TimeStamp.h"
 #include "nsISupports.h"
 
 namespace mozilla {
 namespace layers {
 
 struct FrameMetrics;
+class APZCTreeManager;
 class CompositorOGL;
 
 /*
  * The AndroidDynamicToolbarAnimator is responsible for calculating the position
  * and drawing the static snapshot of the toolbar. The animator lives in both
  * compositor thread and controller thread. It intercepts input events in the
  * controller thread and determines if the intercepted touch events will cause
  * the toolbar to move or be animated. Once the proper conditions have been met,
@@ -46,18 +47,19 @@ class CompositorOGL;
  * toolbar be hidden in order to unlock the static snapshot and begin translating it.
  *
  * See Bug 1335895 for more details.
  */
 
 class AndroidDynamicToolbarAnimator {
 public:
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AndroidDynamicToolbarAnimator);
-  AndroidDynamicToolbarAnimator();
+  explicit AndroidDynamicToolbarAnimator(APZCTreeManager* aApz);
   void Initialize(uint64_t aRootLayerTreeId);
+  void ClearTreeManager();
   // Used to intercept events to determine if the event affects the toolbar.
   // May apply translation to touch events if the toolbar is visible.
   // Returns nsEventStatus_eIgnore when the event is not consumed and
   // nsEventStatus_eConsumeNoDefault when the event was used to translate the
   // toolbar.
   nsEventStatus ReceiveInputEvent(InputData& aEvent, const ScreenPoint& aScrollOffset);
   void SetMaxToolbarHeight(ScreenIntCoord aHeight);
   // When a pinned reason is set to true, the animator will prevent
@@ -162,16 +164,17 @@ protected:
   // Returns true if the page scroll offset is near the bottom.
   bool ScrollOffsetNearBottom() const;
   // Returns true if toolbar is not completely visible nor completely hidden.
   bool ToolbarInTransition();
   void QueueMessage(int32_t aMessage);
 
   // Read only Compositor and Controller threads after Initialize()
   uint64_t mRootLayerTreeId;
+  MOZ_NON_OWNING_REF APZCTreeManager* mApz;
 
   // Read/Write Compositor Thread, Read only Controller thread
   Atomic<StaticToolbarState> mToolbarState; // Current toolbar state.
   Atomic<uint32_t> mPinnedFlags;            // The toolbar should not be moved or animated unless no flags are set
 
   // Controller thread only
   bool mControllerScrollingRootContent; // Set to true when the root content is being scrolled
   bool mControllerDragThresholdReached; // Set to true when the drag threshold has been passed in a single drag