Skip to content
This repository has been archived by the owner on Jul 22, 2024. It is now read-only.

Fixes #2883 Ensure webexts are loaded when restoring sessions #3364

Merged
merged 3 commits into from
May 18, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,11 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
import java.util.function.Function;

import static org.mozilla.vrbrowser.ui.widgets.UIWidget.REMOVE_WIDGET;

Expand Down Expand Up @@ -392,6 +394,20 @@ public void onWindowVideoAvailabilityChanged(@NonNull WindowWidget aWindow) {
mWhatsNewWidget.getPlacement().parentHandle = mWindows.getFocusedWindow().getHandle();
mWhatsNewWidget.show(UIWidget.REQUEST_FOCUS);
}

EngineProvider.INSTANCE.loadExtensions()
.thenAcceptAsync(aVoid -> {
Log.d(LOGTAG, "WebExtensions loaded");
mWindows.restoreSessions();
}, getServicesProvider().getExecutors().mainThread())
.exceptionally(throwable -> {
String msg = throwable.getLocalizedMessage();
if (msg != null) {
Log.e(LOGTAG, "Extensions load error: " + msg);
}
keianhzo marked this conversation as resolved.
Show resolved Hide resolved
mWindows.restoreSessions();
return null;
});
}

private void attachToWindow(@NonNull WindowWidget aWindow, @Nullable WindowWidget aPrevWindow) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import org.mozilla.vrbrowser.browser.SettingsStore
import org.mozilla.vrbrowser.browser.content.TrackingProtectionPolicy
import org.mozilla.vrbrowser.browser.content.TrackingProtectionStore
import org.mozilla.vrbrowser.crashreporting.CrashReporterService
import java.util.concurrent.CompletableFuture

object EngineProvider {

Expand Down Expand Up @@ -54,15 +55,23 @@ object EngineProvider {
}

runtime = GeckoRuntime.create(context, builder.build())
for (extension in WEB_EXTENSIONS) {
val path = "resource://android/assets/web_extensions/$extension/"
runtime!!.registerWebExtension(WebExtension(path, runtime!!.webExtensionController))
}
}

return runtime!!
}

fun loadExtensions() : CompletableFuture<Void> {
val futures : List<CompletableFuture<Void>> = WEB_EXTENSIONS.map {
val future = CompletableFuture<Void>()
val url = "resource://android/assets/web_extensions/$it/"
runtime!!.webExtensionController.installBuiltIn(url).accept {
future.complete(null)
}
future
}
return CompletableFuture.allOf(*futures.toTypedArray())
}

fun createGeckoWebExecutor(context: Context): GeckoWebExecutor {
return GeckoWebExecutor(getOrCreateRuntime(context))
}
Expand Down
73 changes: 45 additions & 28 deletions app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand Down Expand Up @@ -134,6 +133,8 @@ class WindowsState {
private Services mServices;
private PromptDialogWidget mNoInternetDialog;
private boolean mCompositorPaused = false;
private WindowsState mWindowsState;
private boolean mIsRestoreEnabled;

public enum PanelType {
NONE,
Expand Down Expand Up @@ -182,6 +183,8 @@ public Windows(Context aContext) {

mWidgetManager.addConnectivityListener(mConnectivityDelegate);

mIsRestoreEnabled = SettingsStore.getInstance(mContext).isRestoreTabsEnabled();
mWindowsState = restoreState();
restoreWindows();
}

Expand Down Expand Up @@ -698,35 +701,12 @@ private WindowWidget getRightWindow() {
}

private void restoreWindows() {
boolean restoreEnabled = SettingsStore.getInstance(mContext).isRestoreTabsEnabled();
WindowsState windowsState = restoreState();
if (restoreEnabled && windowsState != null) {
ArrayList<Session> restoredSessions = new ArrayList<>();
if (windowsState.tabs != null) {
windowsState.tabs.forEach(state -> {
restoredSessions.add(SessionStore.get().createSuspendedSession(state));
GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.PRE_EXISTING);
});
}
mPrivateMode = false;
for (WindowState windowState : windowsState.regularWindowsState) {
if (windowState.tabIndex >= 0 && windowState.tabIndex < restoredSessions.size()) {
addRestoredWindow(windowState, restoredSessions.get(windowState.tabIndex));
} else if (windowState.tabIndex < 0) {
WindowWidget widget = addRestoredWindow(windowState, null);
if ((widget != null) && (widget.getSession() != null)) {
widget.getSession().loadHomePage();
}
}
}
mPrivateMode = !windowsState.privateMode;
if (windowsState.privateMode) {
enterPrivateMode();
} else {
exitPrivateMode();
if (mIsRestoreEnabled && mWindowsState != null) {
for (WindowState windowState : mWindowsState.regularWindowsState) {
addRestoredWindow(windowState, null);
}

WindowWidget windowToFocus = getWindowWithPlacement(windowsState.focusedWindowPlacement);
WindowWidget windowToFocus = getWindowWithPlacement(mWindowsState.focusedWindowPlacement);
if (windowToFocus == null) {
windowToFocus = getFrontWindow();
if (windowToFocus == null && getCurrentWindows().size() > 0) {
Expand All @@ -746,6 +726,43 @@ private void restoreWindows() {
updateViews();
}

public void restoreSessions() {
if (mIsRestoreEnabled && mWindowsState != null) {
ArrayList<Session> restoredSessions = new ArrayList<>();
if (mWindowsState.tabs != null) {
mWindowsState.tabs.forEach(state -> {
restoredSessions.add(SessionStore.get().createSuspendedSession(state));
GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.PRE_EXISTING);
});
}

for (WindowState windowState : mWindowsState.regularWindowsState) {
WindowWidget targetWindow = getWindowWithPlacement(windowState.placement);
if (targetWindow != null) {
if (windowState.tabIndex >= 0 && windowState.tabIndex < restoredSessions.size()) {
Session defaultSession = targetWindow.getSession();
Session session = restoredSessions.get(windowState.tabIndex);
targetWindow.setupListeners(session);
session.setActive(true);
targetWindow.setSession(session);
SessionStore.get().setActiveSession(session);
// Destroy the default blank session
SessionStore.get().destroySession(defaultSession);

} else {
targetWindow.loadHome();
}
}
}

if (mWindowsState.privateMode) {
enterPrivateMode();
} else {
exitPrivateMode();
}
}
}

private void removeWindow(@NonNull WindowWidget aWindow) {
BitmapCache.getInstance(mContext).removeBitmap(aWindow.getSession().getId());
mWidgetManager.removeWidget(aWindow);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
"name": "Firefox Reality Vimeo.com WebCompat Enhancements",
"version": "1.0",
"description": "Fixes web-site compatibility quirks for Vimeo.com when using Firefox Reality.",
"browser_specific_settings": {
"gecko": {
"id": "[email protected]"
}
},
"content_scripts": [
{
"matches": [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
"name": "Firefox Reality YouTube.com WebCompat Enhancements",
"version": "1.0",
"description": "Fixes web-site compatibility quirks for YouTube.com when using Firefox Reality.",
"browser_specific_settings": {
"gecko": {
"id": "[email protected]"
}
},
"content_scripts": [
{
"matches": [
Expand Down