Bug 1472140 - 1. Set first paint flag when resuming and resizing composition; r?rbarker draft
authorJim Chen <nchen@mozilla.com>
Mon, 30 Jul 2018 16:38:35 -0400
changeset 824444 49ba986379cb42acf9a1ce945f54f14db80839d1
parent 824438 38fed1c2b69d97019b2f3f5a25c7b755db1e3a79
child 824445 b99a347fbcfb6c106e28f03f06df41c7eefd6b6c
push id117906
push userbmo:nchen@mozilla.com
push dateMon, 30 Jul 2018 20:39:17 +0000
reviewersrbarker
bugs1472140
milestone63.0a1
Bug 1472140 - 1. Set first paint flag when resuming and resizing composition; r?rbarker When resuming composition in a new GeckoView, we wait for the first paint signal in order to uncover the SurfaceView. This patch makes sure that we always send the first paint signal. MozReview-Commit-ID: EZeOR80d8HY
gfx/layers/ipc/UiCompositorControllerParent.cpp
mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java
widget/android/nsWindow.cpp
--- a/gfx/layers/ipc/UiCompositorControllerParent.cpp
+++ b/gfx/layers/ipc/UiCompositorControllerParent.cpp
@@ -69,16 +69,18 @@ UiCompositorControllerParent::RecvResume
 }
 
 mozilla::ipc::IPCResult
 UiCompositorControllerParent::RecvResumeAndResize(const int32_t& aWidth,
                                                   const int32_t& aHeight)
 {
   CompositorBridgeParent* parent = CompositorBridgeParent::GetCompositorBridgeParentFromLayersId(mRootLayerTreeId);
   if (parent) {
+    // Front-end expects a first paint callback upon resume/resize.
+    parent->RecvForceIsFirstPaint();
     parent->ResumeCompositionAndResize(aWidth, aHeight);
   }
   return IPC_OK();
 }
 
 mozilla::ipc::IPCResult
 UiCompositorControllerParent::RecvInvalidateAndRender()
 {
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoView.java
@@ -203,16 +203,19 @@ public class GeckoView extends FrameLayo
         }
     }
 
     public GeckoSession releaseSession() {
         if (mSession == null) {
             return null;
         }
 
+        // Cover the view while we are not drawing to the surface.
+        coverUntilFirstPaint(Color.WHITE);
+
         GeckoSession session = mSession;
         mSession.releaseDisplay(mDisplay.release());
         mSession.getOverscrollEdgeEffect().setInvalidationCallback(null);
         mSession.getCompositorController().setFirstPaintCallback(null);
         if (session.getSelectionActionDelegate() == mSelectionActionDelegate) {
             mSession.setSelectionActionDelegate(null);
         }
         mSession = null;
--- a/widget/android/nsWindow.cpp
+++ b/widget/android/nsWindow.cpp
@@ -1259,21 +1259,16 @@ nsWindow::GeckoViewSupport::Transfer(con
                 u"GeckoView:UpdateInitData");
     }
 
     DispatchToUiThread(
             "GeckoViewSupport::Transfer",
             [compositor = LayerSession::Compositor::GlobalRef(compositor)] {
                 compositor->OnCompositorAttached();
             });
-
-    // Set the first-paint flag so that we refresh viewports, etc.
-    if (RefPtr<CompositorBridgeChild> bridge = window.GetCompositorBridgeChild()) {
-        bridge->SendForceIsFirstPaint();
-    }
 }
 
 void
 nsWindow::GeckoViewSupport::AttachEditable(const GeckoSession::Window::LocalRef& inst,
                                            jni::Object::Param aEditableParent,
                                            jni::Object::Param aEditableChild)
 {
     java::GeckoEditableChild::LocalRef editableChild(inst.Env());