mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-22 01:35:35 +00:00
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:
parent
ece2bc6665
commit
3d29d74088
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user