Bug 1335895 - part 15: Update AsyncPanZoomController to notify toolbar animator when FrameMetrics have changed and when root content is scrolled r=kats,botond
--- a/gfx/layers/apz/src/AsyncPanZoomController.cpp
+++ b/gfx/layers/apz/src/AsyncPanZoomController.cpp
@@ -72,16 +72,17 @@
#include "nsThreadUtils.h" // for NS_IsMainThread
#include "nsViewportInfo.h" // for kViewportMinScale, kViewportMaxScale
#include "prsystem.h" // for PR_GetPhysicalMemorySize
#include "SharedMemoryBasic.h" // for SharedMemoryBasic
#include "ScrollSnap.h" // for ScrollSnapUtils
#include "WheelScrollAnimation.h"
#if defined(MOZ_WIDGET_ANDROID)
#include "AndroidAPZ.h"
+#include "mozilla/layers/AndroidDynamicToolbarAnimator.h"
#endif // defined(MOZ_WIDGET_ANDROID)
#define ENABLE_APZC_LOGGING 0
// #define ENABLE_APZC_LOGGING 1
#if ENABLE_APZC_LOGGING
# define APZC_LOG(...) printf_stderr("APZC: " __VA_ARGS__)
# define APZC_LOG_FM(fm, prefix, ...) \
@@ -1186,22 +1187,16 @@ nsEventStatus AsyncPanZoomController::On
break;
}
return nsEventStatus_eConsumeNoDefault;
}
nsEventStatus AsyncPanZoomController::OnTouchEnd(const MultiTouchInput& aEvent) {
APZC_LOG("%p got a touch-end in state %d\n", this, mState);
-
- RefPtr<GeckoContentController> controller = GetGeckoContentController();
- if (controller) {
- controller->SetScrollingRootContent(false);
- }
-
OnTouchEndOrCancel();
// In case no touch behavior triggered previously we can avoid sending
// scroll events or requesting content repaint. This condition is added
// to make tests consistent - in case touch-action is NONE (and therefore
// no pans/zooms can be performed) we expected neither scroll or repaint
// events.
if (mState != NOTHING) {
@@ -2432,22 +2427,25 @@ bool AsyncPanZoomController::AttemptScro
if (xChanged || yChanged) {
ScheduleComposite();
}
if (!IsZero(adjustedDisplacement)) {
ScrollBy(adjustedDisplacement / mFrameMetrics.GetZoom());
if (CancelableBlockState* block = GetCurrentInputBlock()) {
- if (block->AsTouchBlock() && (block->GetScrolledApzc() != this)) {
- RefPtr<GeckoContentController> controller = GetGeckoContentController();
- if (controller) {
- controller->SetScrollingRootContent(IsRootContent());
+#if defined(MOZ_WIDGET_ANDROID)
+ if (block->AsTouchBlock() && (block->GetScrolledApzc() != this) && IsRootContent()) {
+ if (APZCTreeManager* manager = GetApzcTreeManager()) {
+ AndroidDynamicToolbarAnimator* animator = manager->GetAndroidDynamicToolbarAnimator();
+ MOZ_ASSERT(animator);
+ animator->SetScrollingRootContent();
}
}
+#endif
block->SetScrolledApzc(this);
}
ScheduleCompositeAndMaybeRepaint();
UpdateSharedCompositorFrameMetrics();
}
// Adjust the start point to reflect the consumed portion of the scroll.
aStartPoint = aEndPoint + overscroll;
@@ -3449,16 +3447,31 @@ void AsyncPanZoomController::NotifyLayer
}
bool smoothScrollRequested = aLayerMetrics.GetDoSmoothScroll()
&& (aLayerMetrics.GetScrollGeneration() != mFrameMetrics.GetScrollGeneration());
// TODO if we're in a drag and scrollOffsetUpdated is set then we want to
// ignore it
+#if defined(MOZ_WIDGET_ANDROID)
+ if (aLayerMetrics.IsRootContent()) {
+ if (APZCTreeManager* manager = GetApzcTreeManager()) {
+ AndroidDynamicToolbarAnimator* animator = manager->GetAndroidDynamicToolbarAnimator();
+ MOZ_ASSERT(animator);
+ CSSToScreenScale scale = ViewTargetAs<ScreenPixel>(aLayerMetrics.GetZoom().ToScaleFactor(),
+ PixelCastJustification::ScreenIsParentLayerForRoot);
+ ScreenIntSize size = ScreenIntSize::Round(aLayerMetrics.GetRootCompositionSize() * scale);
+ if (animator->SetCompositionSize(size)) {
+ animator->UpdateRootFrameMetrics(aLayerMetrics);
+ }
+ }
+ }
+#endif
+
if ((aIsFirstPaint && aThisLayerTreeUpdated) || isDefault) {
// Initialize our internal state to something sane when the content
// that was just painted is something we knew nothing about previously
CancelAnimation();
mScrollMetadata = aScrollMetadata;
mExpectedGeckoMetrics = aLayerMetrics;
ShareCompositorFrameMetrics();
@@ -3821,16 +3834,27 @@ void AsyncPanZoomController::DispatchSta
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
// Let the compositor know about scroll state changes so it can manage
// windowed plugins.
if (gfxPrefs::HidePluginsForScroll() && mCompositorController) {
mCompositorController->ScheduleHideAllPluginWindows();
}
#endif
} else if (IsTransformingState(aOldState) && !IsTransformingState(aNewState)) {
+#if defined(MOZ_WIDGET_ANDROID)
+ // The Android UI thread only shows overlay UI elements when the content is not being
+ // panned or zoomed and it is in a steady state. So the FrameMetrics only need to be
+ // updated when the transform ends.
+ if (APZCTreeManager* manager = GetApzcTreeManager()) {
+ AndroidDynamicToolbarAnimator* animator = manager->GetAndroidDynamicToolbarAnimator();
+ MOZ_ASSERT(animator);
+ animator->UpdateRootFrameMetrics(mFrameMetrics);
+ }
+#endif
+
controller->NotifyAPZStateChange(
GetGuid(), APZStateChange::eTransformEnd);
#if defined(XP_WIN) || defined(MOZ_WIDGET_GTK)
if (gfxPrefs::HidePluginsForScroll() && mCompositorController) {
mCompositorController->ScheduleShowAllPluginWindows();
}
#endif
}