Skip to content

Commit

Permalink
Ensure Sessions are recreated correctly when clearing data
Browse files Browse the repository at this point in the history
- Fixes #2356
- Fixes issue where switching Multiprocess in the developer panel would freeze the session.
- Fixes default private browsing page not getting displayed when recreating a private browsing session.
  • Loading branch information
bluemarvin committed Nov 22, 2019
1 parent 7b66fb1 commit 792f24e
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 37 deletions.
Expand Up @@ -344,6 +344,24 @@ public void suspend() {
mState.mSession = null;
}

private boolean shouldLoadDefaultPage(@NonNull SessionState aState) {
if (aState.mUri != null && aState.mUri.length() != 0 && !aState.mUri.equals(mContext.getString(R.string.about_blank))) {
return false;
}
if (aState.mSessionState != null && aState.mSessionState.size() != 0) {
return false;
}
return true;
}

private void loadDefaultPage() {
if (mState.mSettings.isPrivateBrowsingEnabled()) {
loadPrivateBrowsingPage();
} else {
loadHomePage();
}
}

private void restore() {
SessionSettings settings = mState.mSettings;
if (settings == null) {
Expand All @@ -363,18 +381,17 @@ private void restore() {
mState.mUri = null;
}

if (mState.mSessionState != null) {
if (shouldLoadDefaultPage(mState)) {
loadDefaultPage();
} else if (mState.mSessionState != null) {
mState.mSession.restoreState(mState.mSessionState);
} else if (mState.mUri != null) {
mState.mSession.loadUri(mState.mUri);
} else {
loadDefaultPage();
}

if ((mState.mSessionState == null) && (mState.mUri != null)) {
mState.mSession.loadUri(mState.mUri);
} else if (mState.mSettings.isPrivateBrowsingEnabled() && mState.mUri == null) {
loadPrivateBrowsingPage();
} else if(mState.mSessionState == null || ((mState.mUri == null) || mState.mUri.equals(mContext.getResources().getString(R.string.about_blank))) ||
(mState.mSessionState != null && mState.mSessionState.size() == 0)) {
loadHomePage();
} else if (mState.mUri != null && mState.mUri.contains(".youtube.com")) {
if (mState.mUri != null && mState.mUri.contains(".youtube.com")) {
mState.mSession.loadUri(mState.mUri, GeckoSession.LOAD_FLAGS_REPLACE_HISTORY);
}

Expand Down Expand Up @@ -418,20 +435,19 @@ private GeckoSession createGeckoSession(@NonNull SessionSettings aSettings) {
return session;
}

private void recreateSession() {
public void recreateSession() {
SessionState previous = mState;
mState = mState.recreate();
restore();

mState = createSession(previous.mSettings, SESSION_OPEN);
mState.setActive(true);
if (previous.mSessionState != null) {
mState.mSession.restoreState(previous.mSessionState);
}
GeckoSession previousGeckoSession = null;
if (previous.mSession != null) {
previousGeckoSession = previous.mSession;
closeSession(previous);
}

for (SessionChangeListener listener : mSessionChangeListeners) {
listener.onCurrentSessionChange(previous.mSession, mState.mSession);
listener.onCurrentSessionChange(previousGeckoSession, mState.mSession);
}
}

Expand All @@ -443,7 +459,7 @@ private void closeSession(@NonNull SessionState aState) {
aState.mSession.setActive(false);
aState.mSession.stop();
if (aState.mDisplay != null) {
surfaceDestroyed();
aState.mDisplay.surfaceDestroyed();
aState.mSession.releaseDisplay(aState.mDisplay);
aState.mDisplay = null;
}
Expand Down Expand Up @@ -787,24 +803,6 @@ protected void setTrackingProtection(final boolean aEnabled) {
}
}

public void clearCache(final long clearFlags) {
if (mRuntime != null) {
// Per GeckoView Docs:
// Note: Any open session may re-accumulate previously cleared data.
// To ensure that no persistent data is left behind, you need to close all sessions prior to clearing data.
// https://mozilla.github.io/geckoview/javadoc/mozilla-central/org/mozilla/geckoview/StorageController.html#clearData-long-
if (mState.mSession != null) {
mState.mSession.stop();
mState.mSession.close();
}

mRuntime.getStorageController().clearData(clearFlags).then(aVoid -> {
recreateSession();
return null;
});
}
}

public void updateLastUse() {
mState.mLastUse = System.currentTimeMillis();
}
Expand Down
Expand Up @@ -41,6 +41,21 @@ public class SessionState {
public String mId = UUID.randomUUID().toString();
public String mParentId; // Parent session stack Id.

public SessionState recreate() {
SessionState result = new SessionState();
result.mUri = mUri;
result.mPreviousUri = mPreviousUri;
result.mTitle = mTitle;
result.mSettings = mSettings;
result.mSessionState = mSessionState;
result.mLastUse = mLastUse;
result.mRegion = mRegion;
result.mId = mId;
result.mParentId = mParentId;

return result;
}

public static class GeckoSessionStateAdapter extends TypeAdapter<GeckoSession.SessionState> {
@Override
public void write(JsonWriter out, GeckoSession.SessionState session) throws IOException {
Expand Down
Expand Up @@ -27,6 +27,7 @@

import java.security.KeyStore;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class SessionStore implements GeckoSession.PermissionDelegate {
Expand Down Expand Up @@ -351,9 +352,19 @@ public void setLocales(List<String> locales) {
}

public void clearCache(long clearFlags) {
LinkedList<Session> activeSession = new LinkedList<>();
for (Session session: mSessions) {
session.clearCache(clearFlags);
if (session.getGeckoSession() != null) {
session.suspend();
activeSession.add(session);
}
}
mRuntime.getStorageController().clearData(clearFlags).then(aVoid -> {
for (Session session: activeSession) {
session.recreateSession();
}
return null;
});
}

// Permission Delegate
Expand Down
Expand Up @@ -1106,13 +1106,13 @@ public void onCurrentSessionChange(GeckoSession aOldSession, GeckoSession aSessi
} else {
setPrivateBrowsingEnabled(false);
}
waitForFirstPaint();
}

@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);
Expand Down

0 comments on commit 792f24e

Please sign in to comment.