Bug 1650897 - Track active tab in a Deque in TestRunnerActivity. r=esawin

Differential Revision: https://phabricator.services.mozilla.com/D83354
This commit is contained in:
Agi Sferro 2020-07-13 18:02:11 +00:00
Родитель 4c2ab7cfdb
Коммит d8589ad28e
1 изменённых файлов: 64 добавлений и 29 удалений

Просмотреть файл

@ -27,10 +27,12 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.Surface;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Stack;
public class TestRunnerActivity extends Activity {
private static final String LOGTAG = "TestRunnerActivity";
@ -40,7 +42,6 @@ public class TestRunnerActivity extends Activity {
static GeckoRuntime sRuntime;
private GeckoSession mPopupSession;
private GeckoSession mActiveSession;
private GeckoSession mSession;
private GeckoView mView;
private boolean mKillProcessOnDestroy;
@ -79,7 +80,9 @@ public class TestRunnerActivity extends Activity {
return sRuntime.getWebExtensionController();
}
private HashSet<GeckoSession> mOwnedSessions = new HashSet<>();
// Keeps track of all sessions for this test runner. The top session in the deque is the
// current active session for extension purposes.
private ArrayDeque<GeckoSession> mOwnedSessions = new ArrayDeque<>();
private GeckoSession.PermissionDelegate mPermissionDelegate = new GeckoSession.PermissionDelegate() {
@Override
@ -108,10 +111,11 @@ public class TestRunnerActivity extends Activity {
@Override
public GeckoResult<GeckoSession> onNewSession(GeckoSession session, String uri) {
webExtensionController().setTabActive(mActiveSession, false);
mActiveSession = createBackgroundSession(session.getSettings());
webExtensionController().setTabActive(mActiveSession, true);
return GeckoResult.fromValue(mActiveSession);
webExtensionController().setTabActive(mOwnedSessions.peek(), false);
GeckoSession newSession = createBackgroundSession(session.getSettings(),
/* active */ true);
webExtensionController().setTabActive(newSession, true);
return GeckoResult.fromValue(newSession);
}
@Override
@ -144,10 +148,6 @@ public class TestRunnerActivity extends Activity {
}
};
private GeckoSession createSession() {
return createSession(null);
}
private WebExtension.ActionDelegate mActionDelegate = new WebExtension.ActionDelegate() {
@Nullable
@Override
@ -157,7 +157,7 @@ public class TestRunnerActivity extends Activity {
mPopupSession.close();
}
mPopupSession = createBackgroundSession(null);
mPopupSession = createBackgroundSession(null, /* active */ false);
mPopupSession.open(sRuntime);
return GeckoResult.fromValue(mPopupSession);
@ -176,13 +176,37 @@ public class TestRunnerActivity extends Activity {
public GeckoResult<AllowOrDeny> onUpdateTab(@NonNull WebExtension source,
@NonNull GeckoSession session,
@NonNull WebExtension.UpdateTabDetails updateDetails) {
webExtensionController().setTabActive(mActiveSession, false);
mActiveSession = session;
if (updateDetails.active == Boolean.TRUE) {
// Move session to the top since it's now the active tab
mOwnedSessions.remove(session);
mOwnedSessions.addFirst(session);
}
return GeckoResult.fromValue(AllowOrDeny.ALLOW);
}
};
private GeckoSession createSession(GeckoSessionSettings settings) {
/**
* Creates a session and adds it to the owned sessions deque.
*
* @param active Whether this session is the "active" session for extension purposes.
* The active session always sit at the top of the owned sessions deque.
* @return the newly created session.
*/
private GeckoSession createSession(boolean active) {
return createSession(null, active);
}
/**
* Creates a session and adds it to the owned sessions deque.
*
* @param settings settings for the newly created {@link GeckoSession}, could be null
* if no extra settings need to be added.
* @param active Whether this session is the "active" session for extension purposes.
* The active session always sit at the top of the owned sessions deque.
* @return the newly created session.
*/
private GeckoSession createSession(GeckoSessionSettings settings, boolean active) {
if (settings == null) {
settings = new GeckoSessionSettings();
}
@ -199,12 +223,25 @@ public class TestRunnerActivity extends Activity {
sessionController.setTabDelegate(extension, mSessionTabDelegate);
}
mOwnedSessions.add(session);
if (active) {
mOwnedSessions.addFirst(session);
} else {
mOwnedSessions.addLast(session);
}
return session;
}
private GeckoSession createBackgroundSession(final GeckoSessionSettings settings) {
final GeckoSession session = createSession(settings);
/**
* Creates a session with a display attached.
*
* @param settings settings for the newly created {@link GeckoSession}, could be null
* if no extra settings need to be added.
* @param active Whether this session is the "active" session for extension purposes.
* The active session always sit at the top of the owned sessions deque.
* @return the newly created session.
*/
private GeckoSession createBackgroundSession(final GeckoSessionSettings settings, boolean active) {
final GeckoSession session = createSession(settings, active);
final Display display = new Display(mView.getWidth(), mView.getHeight());
display.attach(session);
@ -215,9 +252,8 @@ public class TestRunnerActivity extends Activity {
}
private void closeSession(GeckoSession session) {
if (session == mActiveSession) {
webExtensionController().setTabActive(mActiveSession, false);
mActiveSession = null;
if (session == mOwnedSessions.peek()) {
webExtensionController().setTabActive(session, false);
}
if (mDisplays.containsKey(session)) {
final Display display = mDisplays.remove(session);
@ -226,9 +262,8 @@ public class TestRunnerActivity extends Activity {
mOwnedSessions.remove(session);
session.close();
if (!mOwnedSessions.isEmpty()) {
// Pick a random session to set as active
mActiveSession = mOwnedSessions.iterator().next();
webExtensionController().setTabActive(mActiveSession, true);
// Pick the top session as the current active
webExtensionController().setTabActive(mOwnedSessions.peek(), true);
}
}
@ -274,9 +309,8 @@ public class TestRunnerActivity extends Activity {
});
}
mSession = createSession();
mActiveSession = mSession;
webExtensionController().setTabActive(mActiveSession, true);
mSession = createSession(/* active */ true);
webExtensionController().setTabActive(mOwnedSessions.peek(), true);
mSession.open(sRuntime);
// If we were passed a URI in the Intent, open it
@ -306,11 +340,12 @@ public class TestRunnerActivity extends Activity {
.build();
}
GeckoSession newSession = createSession(settings);
if (details.active == Boolean.TRUE) {
webExtensionController().setTabActive(mActiveSession, false);
mActiveSession = newSession;
webExtensionController().setTabActive(mOwnedSessions.peek(), false);
}
GeckoSession newSession = createSession(
settings,
details.active == Boolean.TRUE);
return GeckoResult.fromValue(newSession);
}
});