Bug 1358805 - part 5: Update the dynamic toolbar animator to gracefully handle toolbar snapshot generation failure r=kats draft
authorRandall Barker <rbarker@mozilla.com>
Tue, 25 Apr 2017 12:55:53 -0700
changeset 568268 3b59bb4bd83d225b321f4a559d595983520a07a3
parent 568267 ee832013e07d691e77c4aea9f1f9e74ef86e463f
child 625868 abfff35ea904421c928950c556e0f3b1fbfb8e95
push id55808
push userbmo:rbarker@mozilla.com
push dateTue, 25 Apr 2017 22:12:34 +0000
reviewerskats
bugs1358805
milestone55.0a1
Bug 1358805 - part 5: Update the dynamic toolbar animator to gracefully handle toolbar snapshot generation failure r=kats MozReview-Commit-ID: B3t6l5ZqhC5
gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
--- a/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
+++ b/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.cpp
@@ -273,16 +273,20 @@ AndroidDynamicToolbarAnimator::ToolbarAn
     NotifyControllerPendingAnimation(MOVE_TOOLBAR_DOWN, eAnimate);
     break;
   case REQUEST_HIDE_TOOLBAR_IMMEDIATELY:
     NotifyControllerPendingAnimation(MOVE_TOOLBAR_UP, eImmediate);
     break;
   case REQUEST_HIDE_TOOLBAR_ANIMATED:
     NotifyControllerPendingAnimation(MOVE_TOOLBAR_UP, eAnimate);
     break;
+  case TOOLBAR_SNAPSHOT_FAILED:
+    mToolbarState = eToolbarVisible;
+    NotifyControllerSnapshotFailed();
+    break;
   default:
     break;
   }
 }
 
 bool
 AndroidDynamicToolbarAnimator::UpdateAnimation(const TimeStamp& aCurrentFrame)
 {
@@ -888,10 +892,23 @@ AndroidDynamicToolbarAnimator::Translate
 
 ScreenIntCoord
 AndroidDynamicToolbarAnimator::GetFixedLayerMarginsBottom()
 {
   MOZ_ASSERT(CompositorThreadHolder::IsInCompositorThread());
   return mCompositorToolbarHeight - (mCompositorSurfaceHeight - mCompositorCompositionSize.height);
 }
 
+void
+AndroidDynamicToolbarAnimator::NotifyControllerSnapshotFailed()
+{
+  if (!APZThreadUtils::IsControllerThread()) {
+    APZThreadUtils::RunOnControllerThread(NewRunnableMethod(this, &AndroidDynamicToolbarAnimator::NotifyControllerSnapshotFailed));
+    return;
+  }
+
+  mControllerToolbarHeight = 0;
+  mControllerState = eNothingPending;
+  UpdateCompositorToolbarHeight(mControllerToolbarHeight);
+}
+
 } // namespace layers
 } // namespace mozilla
--- a/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
+++ b/gfx/layers/apz/src/AndroidDynamicToolbarAnimator.h
@@ -144,16 +144,17 @@ protected:
   void PostToolbarReady();
   void UpdateFrameMetrics(ScreenPoint aScrollOffset,
                           CSSToScreenScale aScale,
                           CSSRect aCssPageRect);
   bool IsEnoughPageToHideToolbar(ScreenIntCoord delta);
   void ShowToolbarIfNotVisible(StaticToolbarState aCurrentToolbarState);
   void TranslateTouchEvent(MultiTouchInput& aTouchEvent);
   ScreenIntCoord GetFixedLayerMarginsBottom();
+  void NotifyControllerSnapshotFailed();
 
   // Read only Compositor and Controller threads after Initialize()
   uint64_t mRootLayerTreeId;
 
   // 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
 
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/gfx/LayerView.java
@@ -203,16 +203,17 @@ public class LayerView extends FrameLayo
     }
 
     /* package */ void handleToolbarAnimatorMessage(int message) {
         switch(message) {
             case STATIC_TOOLBAR_NEEDS_UPDATE:
                 // Send updated toolbar image to compositor.
                 Bitmap bm = mToolbarAnimator.getBitmapOfToolbarChrome();
                 if (bm == null) {
+                    postCompositorMessage(TOOLBAR_SNAPSHOT_FAILED);
                     break;
                 }
                 final int width = bm.getWidth();
                 final int height = bm.getHeight();
                 int[] pixels = new int[bm.getByteCount() / 4];
                 try {
                     bm.getPixels(pixels, /* offset */ 0, /* stride */ width, /* x */ 0, /* y */ 0, width, height);
                     mCompositor.sendToolbarPixelsToCompositor(width, height, pixels);