summaryrefslogtreecommitdiffstats
path: root/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:35:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-12 05:35:29 +0000
commit59203c63bb777a3bacec32fb8830fba33540e809 (patch)
tree58298e711c0ff0575818c30485b44a2f21bf28a0 /mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs
parentAdding upstream version 126.0.1. (diff)
downloadfirefox-59203c63bb777a3bacec32fb8830fba33540e809.tar.xz
firefox-59203c63bb777a3bacec32fb8830fba33540e809.zip
Adding upstream version 127.0.upstream/127.0
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs')
-rw-r--r--mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs95
1 files changed, 71 insertions, 24 deletions
diff --git a/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs b/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs
index faa5c5f280..5c176a17f1 100644
--- a/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs
+++ b/mobile/android/modules/geckoview/GeckoViewSessionStore.sys.mjs
@@ -117,19 +117,11 @@ export var GeckoViewSessionStore = {
switch (aTopic) {
case "browsing-context-did-set-embedder": {
- if (
- aSubject &&
- aSubject === aSubject.top &&
- aSubject.isContent &&
- aSubject.embedderElement &&
- aSubject.embedderElement.permanentKey
- ) {
- const permanentKey = aSubject.embedderElement.permanentKey;
- this._browserSHistoryListener
- .get(permanentKey)
- ?.unregister(permanentKey);
-
- this.getOrCreateSHistoryListener(permanentKey, aSubject, true);
+ if (aSubject === aSubject.top && aSubject.isContent) {
+ const permanentKey = aSubject.embedderElement?.permanentKey;
+ if (permanentKey) {
+ this.maybeRecreateSHistoryListener(permanentKey, aSubject);
+ }
}
break;
}
@@ -151,26 +143,34 @@ export var GeckoViewSessionStore = {
});
},
- getOrCreateSHistoryListener(
- permanentKey,
- browsingContext,
- collectImmediately = false
- ) {
+ getOrCreateSHistoryListener(permanentKey, browsingContext) {
if (!permanentKey || browsingContext !== browsingContext.top) {
return null;
}
+ const listener = this._browserSHistoryListener.get(permanentKey);
+ if (listener) {
+ return listener;
+ }
+
+ return this.createSHistoryListener(permanentKey, browsingContext, false);
+ },
+
+ maybeRecreateSHistoryListener(permanentKey, browsingContext) {
+ const listener = this._browserSHistoryListener.get(permanentKey);
+ if (!listener || listener._browserId != browsingContext.browserId) {
+ listener?.unregister(permanentKey);
+ this.createSHistoryListener(permanentKey, browsingContext, true);
+ }
+ },
+
+ createSHistoryListener(permanentKey, browsingContext, collectImmediately) {
const sessionHistory = browsingContext.sessionHistory;
if (!sessionHistory) {
return null;
}
- let listener = this._browserSHistoryListener.get(permanentKey);
- if (listener) {
- return listener;
- }
-
- listener = new SHistoryListener(browsingContext);
+ const listener = new SHistoryListener(browsingContext);
sessionHistory.addSHistoryListener(listener);
this._browserSHistoryListener.set(permanentKey, listener);
@@ -184,4 +184,51 @@ export var GeckoViewSessionStore = {
return listener;
},
+
+ updateSessionStoreFromTabListener(
+ browser,
+ browsingContext,
+ permanentKey,
+ update,
+ forStorage = false
+ ) {
+ permanentKey = browser?.permanentKey ?? permanentKey;
+ if (!permanentKey) {
+ return;
+ }
+
+ if (browsingContext.isReplaced) {
+ return;
+ }
+
+ const listener = this.getOrCreateSHistoryListener(
+ permanentKey,
+ browsingContext
+ );
+
+ if (listener) {
+ const historychange =
+ // If it is not the scheduled update (tab closed, window closed etc),
+ // try to store the loading non-web-controlled page opened in _blank
+ // first.
+ (forStorage &&
+ lazy.SessionHistory.collectNonWebControlledBlankLoadingSession(
+ browsingContext
+ )) ||
+ listener.collect(permanentKey, browsingContext, {
+ collectFull: !!update.sHistoryNeeded,
+ writeToCache: false,
+ });
+
+ if (historychange) {
+ update.data.historychange = historychange;
+ }
+ }
+
+ const win =
+ browsingContext.embedderElement?.ownerGlobal ||
+ browsingContext.currentWindowGlobal?.browsingContext?.window;
+
+ this.onTabStateUpdate(permanentKey, win, update);
+ },
};