From 46df150df0b0ced3e78af6e466b2284a1880f1f7 Mon Sep 17 00:00:00 2001 From: "Randall E. Barker" Date: Thu, 21 Nov 2019 06:41:53 -0800 Subject: [PATCH] Allow popup tabs to live long enough to initialize before suspending (#2338) --- .../vrbrowser/browser/engine/Session.java | 24 ++++++++++++++++--- .../browser/engine/SessionStore.java | 7 +++++- .../vrbrowser/ui/widgets/WindowWidget.java | 13 ++++++++++ .../mozilla/vrbrowser/ui/widgets/Windows.java | 9 +------ 4 files changed, 41 insertions(+), 12 deletions(-) diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java index 6020afc5d..38d07b6a4 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/Session.java @@ -62,7 +62,7 @@ public class Session implements ContentBlocking.Delegate, GeckoSession.Navigatio private static final String LOGTAG = SystemUtils.createLogtag(Session.class); private static UserAgentOverride sUserAgentOverride; - + private static final long KEEP_ALIVE_DURATION_MS = 1000; // 1 second. private transient LinkedList mNavigationListeners; private transient LinkedList mProgressListeners; @@ -83,7 +83,7 @@ public class Session implements ContentBlocking.Delegate, GeckoSession.Navigatio private transient GeckoRuntime mRuntime; private transient byte[] mPrivatePage; private transient boolean mFirstContentfulPaint; - + private transient long mKeepAlive; public interface BitmapChangedListener { void onBitmapChanged(Session aSession, Bitmap aBitmap); @@ -334,6 +334,11 @@ public void suspend() { if (mState.mSession == null) { return; } + if (mKeepAlive > System.currentTimeMillis()) { + Log.e(LOGTAG, "Unable to suspend activity with active keep alive time."); + return; + } + Log.d(LOGTAG, "Suspending Session: " + mState.mId); closeSession(mState); mState.mSession = null; @@ -688,6 +693,7 @@ public String getId() { return mState.mId; } + public boolean isPrivateMode() { if (mState.mSession != null) { return mState.mSession.getSettings().getUsePrivateMode(); @@ -916,10 +922,12 @@ public void onCanGoForward(@NonNull GeckoSession aSession, boolean aCanGoForward @Override public GeckoResult onNewSession(@NonNull GeckoSession aSession, @NonNull String aUri) { - Log.d(LOGTAG, "Session onStackSession: " + aUri); + mKeepAlive = System.currentTimeMillis() + KEEP_ALIVE_DURATION_MS; + Log.d(LOGTAG, "onNewSession: " + aUri); Session session = SessionStore.get().createSession(mState.mSettings, SESSION_DO_NOT_OPEN); session.mState.mParentId = mState.mId; + session.mKeepAlive = mKeepAlive; for (SessionChangeListener listener: new LinkedList<>(mSessionChangeListeners)) { listener.onStackSession(session); } @@ -1427,6 +1435,16 @@ public void onActiveStateChange(Session aSession, boolean aActive) { } } + @Override + public void onStackSession(Session aSession) { + if (aSession.equals(this)) { + return; + } + for (SessionChangeListener listener : mSessionChangeListeners) { + listener.onStackSession(aSession); + } + } + // Display functions public void releaseDisplay() { surfaceDestroyed(); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java index ca7f3f2ec..54fe71303 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/browser/engine/SessionStore.java @@ -229,7 +229,12 @@ public Session getActiveSession() { public ArrayList getSortedSessions(boolean aPrivateMode) { ArrayList result = new ArrayList<>(mSessions); result.removeIf(session -> session.isPrivateMode() != aPrivateMode); - result.sort((o1, o2) -> (int)(o2.getLastUse() - o1.getLastUse())); + result.sort((o1, o2) -> { + if (o2.getLastUse() < o1.getLastUse()) { + return -1; + } + return o2.getLastUse() == o1.getLastUse() ? 0 : 1; + }); return result; } diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java index a06d75b80..556477b40 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/WindowWidget.java @@ -931,6 +931,17 @@ public void removeWindowListener(WindowListener aListener) { mListeners.remove(aListener); } + public void waitForFirstPaint() { + setFirstPaintReady(false); + setFirstDrawCallback(() -> { + if (!isFirstPaintReady()) { + setFirstPaintReady(true); + mWidgetManager.updateWidget(WindowWidget.this); + } + }); + mWidgetManager.updateWidget(this); + } + @Override public void handleResizeEvent(float aWorldWidth, float aWorldHeight) { int width = getWindowWidth(aWorldWidth); @@ -1100,6 +1111,8 @@ public void onCurrentSessionChange(GeckoSession aOldSession, GeckoSession aSessi @Override public void onStackSession(Session aSession) { // e.g. tab opened via window.open() + aSession.updateLastUse(); + waitForFirstPaint(); Session current = mSession; setSession(aSession); SessionStore.get().setActiveSession(aSession); diff --git a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java index 9ba711f55..1a0d62c1d 100644 --- a/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java +++ b/app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java @@ -982,14 +982,7 @@ public void onTabsClicked() { private void setFirstPaint(@NonNull final WindowWidget aWindow, @NonNull final Session aSession) { if (aSession.getGeckoSession() == null) { - aWindow.setFirstPaintReady(false); - aWindow.setFirstDrawCallback(() -> { - if (!aWindow.isFirstPaintReady()) { - aWindow.setFirstPaintReady(true); - mWidgetManager.updateWidget(aWindow); - } - }); - mWidgetManager.updateWidget(aWindow); + aWindow.waitForFirstPaint(); } else { // If the new session has a GeckoSession there won't be a first paint event. // So trigger the first paint callback in case the window is grayed out