Bug 1498699 - Only create the AndroidDynamicToolbarAnimator for Fennec. r=jnicol

The bulk of this is adjusting the code that tries to use the toolbar to
have appropriate null checks instead of asserting it will exist. The
creation of the animator instance is now guarded by a IsFennec
condition.

Depends on D8658

Differential Revision: https://phabricator.services.mozilla.com/D8659

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Kartikaya Gupta 2018-10-15 14:56:35 +00:00
parent ece2bc6665
commit 3d29d74088
5 changed files with 53 additions and 54 deletions

View File

@ -22,6 +22,9 @@
#include "mozilla/gfx/GPUParent.h" // for GPUParent
#include "mozilla/gfx/Logging.h" // for gfx::TreeLog
#include "mozilla/gfx/Point.h" // for Point
#ifdef MOZ_WIDGET_ANDROID
#include "mozilla/jni/Utils.h" // for jni::IsFennec
#endif
#include "mozilla/layers/APZSampler.h" // for APZSampler
#include "mozilla/layers/APZThreadUtils.h" // for AssertOnControllerThread, etc
#include "mozilla/layers/APZUpdater.h" // for APZUpdater
@ -262,7 +265,9 @@ APZCTreeManager::APZCTreeManager(LayersId aRootLayersId)
AsyncPanZoomController::InitializeGlobalState();
mApzcTreeLog.ConditionOnPrefFunction(gfxPrefs::APZPrintTree);
#if defined(MOZ_WIDGET_ANDROID)
mToolbarAnimator = new AndroidDynamicToolbarAnimator(this);
if (jni::IsFennec()) {
mToolbarAnimator = new AndroidDynamicToolbarAnimator(this);
}
#endif // (MOZ_WIDGET_ANDROID)
}
@ -1162,22 +1167,23 @@ APZCTreeManager::ReceiveInputEvent(InputData& aEvent,
AutoFocusSequenceNumberSetter focusSetter(mFocusState, aEvent);
#if defined(MOZ_WIDGET_ANDROID)
MOZ_ASSERT(mToolbarAnimator);
ScreenPoint scrollOffset;
{
RecursiveMutexAutoLock lock(mTreeLock);
RefPtr<AsyncPanZoomController> apzc = FindRootContentOrRootApzc();
if (apzc) {
scrollOffset = ViewAs<ScreenPixel>(apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForHitTesting),
PixelCastJustification::ScreenIsParentLayerForRoot);
if (mToolbarAnimator) {
ScreenPoint scrollOffset;
{
RecursiveMutexAutoLock lock(mTreeLock);
RefPtr<AsyncPanZoomController> apzc = FindRootContentOrRootApzc();
if (apzc) {
scrollOffset = ViewAs<ScreenPixel>(apzc->GetCurrentAsyncScrollOffset(AsyncPanZoomController::eForHitTesting),
PixelCastJustification::ScreenIsParentLayerForRoot);
}
}
RefPtr<APZCTreeManager> self = this;
nsEventStatus isConsumed = mToolbarAnimator->ReceiveInputEvent(self, aEvent, scrollOffset);
// Check if the mToolbarAnimator consumed the event.
if (isConsumed == nsEventStatus_eConsumeNoDefault) {
APZCTM_LOG("Dynamic toolbar consumed event");
return isConsumed;
}
}
RefPtr<APZCTreeManager> self = this;
nsEventStatus isConsumed = mToolbarAnimator->ReceiveInputEvent(self, aEvent, scrollOffset);
// Check if the mToolbarAnimator consumed the event.
if (isConsumed == nsEventStatus_eConsumeNoDefault) {
APZCTM_LOG("Dynamic toolbar consumed event");
return isConsumed;
}
#endif // (MOZ_WIDGET_ANDROID)
@ -2189,7 +2195,9 @@ APZCTreeManager::ClearTree()
AssertOnUpdaterThread();
#if defined(MOZ_WIDGET_ANDROID)
mToolbarAnimator->ClearTreeManager();
if (mToolbarAnimator) {
mToolbarAnimator->ClearTreeManager();
}
#endif
// Ensure that no references to APZCs are alive in any lingering input

View File

@ -2959,9 +2959,9 @@ bool AsyncPanZoomController::AttemptScroll(ParentLayerPoint& aStartPoint,
#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();
if (AndroidDynamicToolbarAnimator* animator = manager->GetAndroidDynamicToolbarAnimator()) {
animator->SetScrollingRootContent();
}
}
}
#endif
@ -4269,9 +4269,9 @@ void AsyncPanZoomController::NotifyLayersUpdated(const ScrollMetadata& aScrollMe
#if defined(MOZ_WIDGET_ANDROID)
if (aLayerMetrics.IsRootContent()) {
if (APZCTreeManager* manager = GetApzcTreeManager()) {
AndroidDynamicToolbarAnimator* animator = manager->GetAndroidDynamicToolbarAnimator();
MOZ_ASSERT(animator);
animator->MaybeUpdateCompositionSizeAndRootFrameMetrics(aLayerMetrics);
if (AndroidDynamicToolbarAnimator* animator = manager->GetAndroidDynamicToolbarAnimator()) {
animator->MaybeUpdateCompositionSizeAndRootFrameMetrics(aLayerMetrics);
}
}
}
#endif
@ -4709,9 +4709,9 @@ void AsyncPanZoomController::DispatchStateChangeNotification(PanZoomState aOldSt
// 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(Metrics());
if (AndroidDynamicToolbarAnimator* animator = manager->GetAndroidDynamicToolbarAnimator()) {
animator->UpdateRootFrameMetrics(Metrics());
}
}
#endif

View File

@ -1016,10 +1016,11 @@ AsyncCompositionManager::ApplyAsyncContentTransformToTree(Layer *aLayer,
Compositor* compositor = mLayerManager->GetCompositor();
if (CompositorBridgeParent* bridge = compositor->GetCompositorBridgeParent()) {
AndroidDynamicToolbarAnimator* animator = bridge->GetAndroidDynamicToolbarAnimator();
MOZ_ASSERT(animator);
if (mIsFirstPaint) {
animator->UpdateRootFrameMetrics(metrics);
animator->FirstPaint();
if (animator) {
animator->UpdateRootFrameMetrics(metrics);
animator->FirstPaint();
}
LayersId rootLayerTreeId = bridge->RootLayerTreeId();
if (RefPtr<UiCompositorControllerParent> uiController = UiCompositorControllerParent::GetFromRootLayerTreeId(rootLayerTreeId)) {
uiController->NotifyFirstPaint();
@ -1035,7 +1036,7 @@ AsyncCompositionManager::ApplyAsyncContentTransformToTree(Layer *aLayer,
}
// If this is not actually the root content then the animator is not getting updated in AsyncPanZoomController::NotifyLayersUpdated
// because the root content document is not scrollable. So update it here so it knows if the root composition size has changed.
if (!metrics.IsRootContent()) {
if (animator && !metrics.IsRootContent()) {
animator->MaybeUpdateCompositionSizeAndRootFrameMetrics(metrics);
}
}
@ -1320,9 +1321,9 @@ AsyncCompositionManager::TransformShadowTree(
#if defined(MOZ_WIDGET_ANDROID)
Compositor* compositor = mLayerManager->GetCompositor();
if (CompositorBridgeParent* bridge = compositor->GetCompositorBridgeParent()) {
AndroidDynamicToolbarAnimator* animator = bridge->GetAndroidDynamicToolbarAnimator();
MOZ_ASSERT(animator);
wantNextFrame |= animator->UpdateAnimation(nextFrame);
if (AndroidDynamicToolbarAnimator* animator = bridge->GetAndroidDynamicToolbarAnimator()) {
wantNextFrame |= animator->UpdateAnimation(nextFrame);
}
}
#endif // defined(MOZ_WIDGET_ANDROID)

View File

@ -58,13 +58,13 @@
#if defined(MOZ_WIDGET_ANDROID)
#include <android/log.h>
#include <android/native_window.h>
#include "mozilla/jni/Utils.h"
#include "mozilla/widget/AndroidCompositorWidget.h"
#include "opengl/CompositorOGL.h"
#include "GLConsts.h"
#include "GLContextEGL.h"
#include "GLContextProvider.h"
#include "mozilla/Unused.h"
#include "mozilla/widget/AndroidCompositorWidget.h"
#include "ScopedGLHelpers.h"
#endif
#include "GeckoProfiler.h"
@ -992,7 +992,9 @@ LayerManagerComposite::Render(const nsIntRegion& aInvalidRegion, const nsIntRegi
#if defined(MOZ_WIDGET_ANDROID)
// Depending on the content shift the toolbar may be rendered on top of
// some of the content so it must be rendered after the content.
RenderToolbar();
if (jni::IsFennec()) {
RenderToolbar();
}
HandlePixelsTarget();
#endif // defined(MOZ_WIDGET_ANDROID)
@ -1013,24 +1015,6 @@ LayerManagerComposite::Render(const nsIntRegion& aInvalidRegion, const nsIntRegi
}
#if defined(MOZ_WIDGET_ANDROID)
class ScopedCompositorProjMatrix {
public:
ScopedCompositorProjMatrix(CompositorOGL* aCompositor, const Matrix4x4& aProjMatrix):
mCompositor(aCompositor),
mOriginalProjMatrix(mCompositor->GetProjMatrix())
{
mCompositor->SetProjMatrix(aProjMatrix);
}
~ScopedCompositorProjMatrix()
{
mCompositor->SetProjMatrix(mOriginalProjMatrix);
}
private:
CompositorOGL* const mCompositor;
const Matrix4x4 mOriginalProjMatrix;
};
class ScopedCompostitorSurfaceSize {
public:
ScopedCompostitorSurfaceSize(CompositorOGL* aCompositor, const gfx::IntSize& aSize) :
@ -1178,6 +1162,11 @@ ScreenCoord
LayerManagerComposite::GetContentShiftForToolbar()
{
ScreenCoord result(0.0f);
// If we're not in Fennec, we don't have a dynamic toolbar so there isn't a
// content offset.
if (!jni::IsFennec()) {
return result;
}
// If GetTargetContext return is not null we are not drawing to the screen so there will not be any content offset.
if (mCompositor->GetTargetContext() != nullptr) {
return result;

View File

@ -303,7 +303,8 @@ UiCompositorControllerParent::Initialize()
#if defined(MOZ_WIDGET_ANDROID)
AndroidDynamicToolbarAnimator* animator = state->mParent->GetAndroidDynamicToolbarAnimator();
// It is possible the compositor has already started shutting down and
// the AndroidDynamicToolbarAnimator could be a nullptr.
// the AndroidDynamicToolbarAnimator could be a nullptr. Or this could be
// non-Fennec in which case the animator is null anyway.
if (animator) {
animator->Initialize(mRootLayerTreeId);
}