summaryrefslogtreecommitdiffstats
path: root/mobile
diff options
context:
space:
mode:
Diffstat (limited to 'mobile')
-rw-r--r--mobile/android/actors/GeckoViewContentChild.sys.mjs54
1 files changed, 36 insertions, 18 deletions
diff --git a/mobile/android/actors/GeckoViewContentChild.sys.mjs b/mobile/android/actors/GeckoViewContentChild.sys.mjs
index c0a19e5b6b..8d8abaa989 100644
--- a/mobile/android/actors/GeckoViewContentChild.sys.mjs
+++ b/mobile/android/actors/GeckoViewContentChild.sys.mjs
@@ -23,7 +23,6 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
PrivacyFilter: "resource://gre/modules/sessionstore/PrivacyFilter.sys.mjs",
SessionHistory: "resource://gre/modules/sessionstore/SessionHistory.sys.mjs",
- Utils: "resource://gre/modules/sessionstore/Utils.sys.mjs",
});
export class GeckoViewContentChild extends GeckoViewActorChild {
@@ -271,29 +270,48 @@ export class GeckoViewContentChild extends GeckoViewActorChild {
const { contentWindow } = this;
const { formdata, scrolldata } = message.data;
- if (formdata) {
- lazy.Utils.restoreFrameTreeData(
- contentWindow,
- formdata,
- (frame, data) => {
- // restore() will return false, and thus abort restoration for the
- // current |frame| and its descendants, if |data.url| is given but
- // doesn't match the loaded document's URL.
- return SessionStoreUtils.restoreFormData(frame.document, data);
+ /**
+ * Restores frame tree |data|, starting at the given root |frame|. As the
+ * function recurses into descendant frames it will call cb(frame, data) for
+ * each frame it encounters, starting with the given root.
+ */
+ function restoreFrameTreeData(frame, data, cb) {
+ // Restore data for the root frame.
+ // The callback can abort by returning false.
+ if (cb(frame, data) === false) {
+ return;
+ }
+
+ if (!data.hasOwnProperty("children")) {
+ return;
+ }
+
+ // Recurse into child frames.
+ SessionStoreUtils.forEachNonDynamicChildFrame(
+ frame,
+ (subframe, index) => {
+ if (data.children[index]) {
+ restoreFrameTreeData(subframe, data.children[index], cb);
+ }
}
);
}
+ if (formdata) {
+ restoreFrameTreeData(contentWindow, formdata, (frame, data) => {
+ // restore() will return false, and thus abort restoration for the
+ // current |frame| and its descendants, if |data.url| is given but
+ // doesn't match the loaded document's URL.
+ return SessionStoreUtils.restoreFormData(frame.document, data);
+ });
+ }
+
if (scrolldata) {
- lazy.Utils.restoreFrameTreeData(
- contentWindow,
- scrolldata,
- (frame, data) => {
- if (data.scroll) {
- SessionStoreUtils.restoreScrollPosition(frame, data);
- }
+ restoreFrameTreeData(contentWindow, scrolldata, (frame, data) => {
+ if (data.scroll) {
+ SessionStoreUtils.restoreScrollPosition(frame, data);
}
- );
+ });
}
if (scrolldata && scrolldata.zoom && scrolldata.zoom.displaySize) {