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

Commit c38e039

Browse files
keianhzobluemarvin
authored andcommitted
Fixes #2883 Ensure webexts are loaded when restoring sessions (#3364)
* Ensure webexts are loaded when restoring sessions * Update to new webextensions API * Restore sessions even if the extensions loading fails.
1 parent 4aef6f4 commit c38e039

5 files changed

Lines changed: 84 additions & 32 deletions

File tree

app/src/common/shared/org/mozilla/vrbrowser/VRBrowserActivity.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,11 @@
9393
import java.util.HashMap;
9494
import java.util.HashSet;
9595
import java.util.LinkedList;
96+
import java.util.Objects;
9697
import java.util.Set;
9798
import java.util.concurrent.CopyOnWriteArrayList;
9899
import java.util.function.Consumer;
100+
import java.util.function.Function;
99101

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

@@ -392,6 +394,20 @@ public void onWindowVideoAvailabilityChanged(@NonNull WindowWidget aWindow) {
392394
mWhatsNewWidget.getPlacement().parentHandle = mWindows.getFocusedWindow().getHandle();
393395
mWhatsNewWidget.show(UIWidget.REQUEST_FOCUS);
394396
}
397+
398+
EngineProvider.INSTANCE.loadExtensions()
399+
.thenAcceptAsync(aVoid -> {
400+
Log.d(LOGTAG, "WebExtensions loaded");
401+
mWindows.restoreSessions();
402+
}, getServicesProvider().getExecutors().mainThread())
403+
.exceptionally(throwable -> {
404+
String msg = throwable.getLocalizedMessage();
405+
if (msg != null) {
406+
Log.e(LOGTAG, "Extensions load error: " + msg);
407+
}
408+
mWindows.restoreSessions();
409+
return null;
410+
});
395411
}
396412

397413
private void attachToWindow(@NonNull WindowWidget aWindow, @Nullable WindowWidget aPrevWindow) {

app/src/common/shared/org/mozilla/vrbrowser/browser/engine/EngineProvider.kt

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.mozilla.vrbrowser.browser.SettingsStore
1111
import org.mozilla.vrbrowser.browser.content.TrackingProtectionPolicy
1212
import org.mozilla.vrbrowser.browser.content.TrackingProtectionStore
1313
import org.mozilla.vrbrowser.crashreporting.CrashReporterService
14+
import java.util.concurrent.CompletableFuture
1415

1516
object EngineProvider {
1617

@@ -54,15 +55,23 @@ object EngineProvider {
5455
}
5556

5657
runtime = GeckoRuntime.create(context, builder.build())
57-
for (extension in WEB_EXTENSIONS) {
58-
val path = "resource://android/assets/web_extensions/$extension/"
59-
runtime!!.registerWebExtension(WebExtension(path, runtime!!.webExtensionController))
60-
}
6158
}
6259

6360
return runtime!!
6461
}
6562

63+
fun loadExtensions() : CompletableFuture<Void> {
64+
val futures : List<CompletableFuture<Void>> = WEB_EXTENSIONS.map {
65+
val future = CompletableFuture<Void>()
66+
val url = "resource://android/assets/web_extensions/$it/"
67+
runtime!!.webExtensionController.installBuiltIn(url).accept {
68+
future.complete(null)
69+
}
70+
future
71+
}
72+
return CompletableFuture.allOf(*futures.toTypedArray())
73+
}
74+
6675
fun createGeckoWebExecutor(context: Context): GeckoWebExecutor {
6776
return GeckoWebExecutor(getOrCreateRuntime(context))
6877
}

app/src/common/shared/org/mozilla/vrbrowser/ui/widgets/Windows.java

Lines changed: 45 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@
3939
import java.util.ArrayList;
4040
import java.util.Collections;
4141
import java.util.List;
42-
import java.util.function.Predicate;
4342
import java.util.stream.Collectors;
4443
import java.util.stream.Stream;
4544

@@ -134,6 +133,8 @@ class WindowsState {
134133
private Services mServices;
135134
private PromptDialogWidget mNoInternetDialog;
136135
private boolean mCompositorPaused = false;
136+
private WindowsState mWindowsState;
137+
private boolean mIsRestoreEnabled;
137138

138139
public enum PanelType {
139140
NONE,
@@ -182,6 +183,8 @@ public Windows(Context aContext) {
182183

183184
mWidgetManager.addConnectivityListener(mConnectivityDelegate);
184185

186+
mIsRestoreEnabled = SettingsStore.getInstance(mContext).isRestoreTabsEnabled();
187+
mWindowsState = restoreState();
185188
restoreWindows();
186189
}
187190

@@ -698,35 +701,12 @@ private WindowWidget getRightWindow() {
698701
}
699702

700703
private void restoreWindows() {
701-
boolean restoreEnabled = SettingsStore.getInstance(mContext).isRestoreTabsEnabled();
702-
WindowsState windowsState = restoreState();
703-
if (restoreEnabled && windowsState != null) {
704-
ArrayList<Session> restoredSessions = new ArrayList<>();
705-
if (windowsState.tabs != null) {
706-
windowsState.tabs.forEach(state -> {
707-
restoredSessions.add(SessionStore.get().createSuspendedSession(state));
708-
GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.PRE_EXISTING);
709-
});
710-
}
711-
mPrivateMode = false;
712-
for (WindowState windowState : windowsState.regularWindowsState) {
713-
if (windowState.tabIndex >= 0 && windowState.tabIndex < restoredSessions.size()) {
714-
addRestoredWindow(windowState, restoredSessions.get(windowState.tabIndex));
715-
} else if (windowState.tabIndex < 0) {
716-
WindowWidget widget = addRestoredWindow(windowState, null);
717-
if ((widget != null) && (widget.getSession() != null)) {
718-
widget.getSession().loadHomePage();
719-
}
720-
}
721-
}
722-
mPrivateMode = !windowsState.privateMode;
723-
if (windowsState.privateMode) {
724-
enterPrivateMode();
725-
} else {
726-
exitPrivateMode();
704+
if (mIsRestoreEnabled && mWindowsState != null) {
705+
for (WindowState windowState : mWindowsState.regularWindowsState) {
706+
addRestoredWindow(windowState, null);
727707
}
728708

729-
WindowWidget windowToFocus = getWindowWithPlacement(windowsState.focusedWindowPlacement);
709+
WindowWidget windowToFocus = getWindowWithPlacement(mWindowsState.focusedWindowPlacement);
730710
if (windowToFocus == null) {
731711
windowToFocus = getFrontWindow();
732712
if (windowToFocus == null && getCurrentWindows().size() > 0) {
@@ -746,6 +726,43 @@ private void restoreWindows() {
746726
updateViews();
747727
}
748728

729+
public void restoreSessions() {
730+
if (mIsRestoreEnabled && mWindowsState != null) {
731+
ArrayList<Session> restoredSessions = new ArrayList<>();
732+
if (mWindowsState.tabs != null) {
733+
mWindowsState.tabs.forEach(state -> {
734+
restoredSessions.add(SessionStore.get().createSuspendedSession(state));
735+
GleanMetricsService.Tabs.openedCounter(GleanMetricsService.Tabs.TabSource.PRE_EXISTING);
736+
});
737+
}
738+
739+
for (WindowState windowState : mWindowsState.regularWindowsState) {
740+
WindowWidget targetWindow = getWindowWithPlacement(windowState.placement);
741+
if (targetWindow != null) {
742+
if (windowState.tabIndex >= 0 && windowState.tabIndex < restoredSessions.size()) {
743+
Session defaultSession = targetWindow.getSession();
744+
Session session = restoredSessions.get(windowState.tabIndex);
745+
targetWindow.setupListeners(session);
746+
session.setActive(true);
747+
targetWindow.setSession(session);
748+
SessionStore.get().setActiveSession(session);
749+
// Destroy the default blank session
750+
SessionStore.get().destroySession(defaultSession);
751+
752+
} else {
753+
targetWindow.loadHome();
754+
}
755+
}
756+
}
757+
758+
if (mWindowsState.privateMode) {
759+
enterPrivateMode();
760+
} else {
761+
exitPrivateMode();
762+
}
763+
}
764+
}
765+
749766
private void removeWindow(@NonNull WindowWidget aWindow) {
750767
BitmapCache.getInstance(mContext).removeBitmap(aWindow.getSession().getId());
751768
mWidgetManager.removeWidget(aWindow);

app/src/main/assets/web_extensions/webcompat_vimeo/manifest.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
"name": "Firefox Reality Vimeo.com WebCompat Enhancements",
44
"version": "1.0",
55
"description": "Fixes web-site compatibility quirks for Vimeo.com when using Firefox Reality.",
6+
"browser_specific_settings": {
7+
"gecko": {
8+
9+
}
10+
},
611
"content_scripts": [
712
{
813
"matches": [

app/src/main/assets/web_extensions/webcompat_youtube/manifest.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
"name": "Firefox Reality YouTube.com WebCompat Enhancements",
44
"version": "1.0",
55
"description": "Fixes web-site compatibility quirks for YouTube.com when using Firefox Reality.",
6+
"browser_specific_settings": {
7+
"gecko": {
8+
9+
}
10+
},
611
"content_scripts": [
712
{
813
"matches": [

0 commit comments

Comments
 (0)