Bug 1467915 - Connect a display to background windows in TestRunnerActivity r=esawin draft
authorJames Willcox <snorp@snorp.net>
Fri, 01 Jun 2018 08:54:19 -0500
changeset 811560 2e24ce1a322fda4f30e60cddaf37b600ae282b00
parent 811559 faace64c7aa70d8e39c3d8cc23b64fc6f3b7f806
child 811561 c553255d56c2d5b1bf7c7bcd1aad912b03d0fd75
push id114351
push userbmo:snorp@snorp.net
push dateWed, 27 Jun 2018 20:46:47 +0000
reviewersesawin
bugs1467915
milestone63.0a1
Bug 1467915 - Connect a display to background windows in TestRunnerActivity r=esawin This is needed to make some tests pass that rely on the Compositor to work as expected. MozReview-Commit-ID: J6fHXYt3ySw
mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestRunnerActivity.java
--- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestRunnerActivity.java
+++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/TestRunnerActivity.java
@@ -1,36 +1,43 @@
 /* -*- Mode: Java; c-basic-offset: 4; tab-width: 4; indent-tabs-mode: nil; -*-
  * This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.geckoview.test;
 
+import org.mozilla.gecko.gfx.GeckoDisplay;
 import org.mozilla.geckoview.GeckoResponse;
 import org.mozilla.geckoview.GeckoSession;
 import org.mozilla.geckoview.GeckoSessionSettings;
 import org.mozilla.geckoview.GeckoView;
 import org.mozilla.geckoview.GeckoRuntime;
 import org.mozilla.geckoview.GeckoRuntimeSettings;
 
 import android.app.Activity;
 import android.content.Intent;
+import android.graphics.SurfaceTexture;
 import android.net.Uri;
 import android.os.Bundle;
+import android.view.Surface;
+
+import java.util.HashMap;
 
 public class TestRunnerActivity extends Activity {
     private static final String LOGTAG = "TestRunnerActivity";
 
     static GeckoRuntime sRuntime;
 
     private GeckoSession mSession;
     private GeckoView mView;
     private boolean mKillProcessOnDestroy;
 
+    private HashMap<GeckoSession, GeckoDisplay> mDisplays = new HashMap<>();
+
     private GeckoSession.NavigationDelegate mNavigationDelegate = new GeckoSession.NavigationDelegate() {
         @Override
         public void onLocationChange(GeckoSession session, String url) {
             getActionBar().setSubtitle(url);
         }
 
         @Override
         public void onCanGoBack(GeckoSession session, boolean canGoBack) {
@@ -47,34 +54,34 @@ public class TestRunnerActivity extends 
                                   int flags,
                                   GeckoResponse<Boolean> response) {
             // Allow Gecko to load all URIs
             response.respond(false);
         }
 
         @Override
         public void onNewSession(GeckoSession session, String uri, GeckoResponse<GeckoSession> response) {
-            response.respond(createSession(session.getSettings()));
+            response.respond(createBackgroundSession(session.getSettings()));
         }
     };
 
     private GeckoSession.ContentDelegate mContentDelegate = new GeckoSession.ContentDelegate() {
         @Override
         public void onTitleChange(GeckoSession session, String title) {
 
         }
 
         @Override
         public void onFocusRequest(GeckoSession session) {
 
         }
 
         @Override
         public void onCloseRequest(GeckoSession session) {
-            session.close();
+            closeSession(session);
         }
 
         @Override
         public void onFullScreen(GeckoSession session, boolean fullScreen) {
 
         }
 
         @Override
@@ -100,16 +107,39 @@ public class TestRunnerActivity extends 
             settings = new GeckoSessionSettings();
         }
 
         final GeckoSession session = new GeckoSession(settings);
         session.setNavigationDelegate(mNavigationDelegate);
         return session;
     }
 
+    private GeckoSession createBackgroundSession(GeckoSessionSettings settings) {
+        final GeckoSession session = createSession(settings);
+
+        final SurfaceTexture texture  = new SurfaceTexture(0);
+        final Surface surface = new Surface(texture);
+
+        final GeckoDisplay display = session.acquireDisplay();
+        display.surfaceChanged(surface, mView.getWidth(), mView.getHeight());
+        mDisplays.put(session, display);
+
+        return session;
+    }
+
+    private void closeSession(GeckoSession session) {
+        if (mDisplays.containsKey(session)) {
+            final GeckoDisplay display = mDisplays.remove(session);
+            display.surfaceDestroyed();
+
+            session.releaseDisplay(display);
+        }
+        session.close();
+    }
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
         final Intent intent = getIntent();
 
         if (sRuntime == null) {
             final GeckoRuntimeSettings.Builder runtimeSettingsBuilder =