--- a/mobile/android/modules/geckoview/GeckoViewNavigation.jsm
+++ b/mobile/android/modules/geckoview/GeckoViewNavigation.jsm
@@ -91,57 +91,63 @@ class GeckoViewNavigation extends GeckoV
}
}
// Message manager event handler.
receiveMessage(aMsg) {
debug `receiveMessage: ${aMsg.name}`;
}
- waitAndSetOpener(aSessionId, aOpener) {
+ waitAndSetupWindow(aSessionId, { opener, nextTabParentId }) {
if (!aSessionId) {
return Promise.resolve(null);
}
return new Promise(resolve => {
const handler = {
observe(aSubject, aTopic, aData) {
if (aTopic === "geckoview-window-created" && aSubject.name === aSessionId) {
- if (aOpener) {
- aSubject.browser.presetOpenerWindow(aOpener);
+ if (nextTabParentId) {
+ aSubject.browser.setAttribute("nextTabParentId", nextTabParentId.toString());
+ }
+
+ if (opener) {
+ aSubject.browser.presetOpenerWindow(opener);
}
Services.obs.removeObserver(handler, "geckoview-window-created");
resolve(aSubject);
}
}
};
// This event is emitted from createBrowser() in geckoview.js
Services.obs.addObserver(handler, "geckoview-window-created");
});
}
- handleNewSession(aUri, aOpener, aWhere, aFlags, aTriggeringPrincipal) {
+ handleNewSession(aUri, aOpener, aWhere, aFlags, aNextTabParentId) {
debug `handleNewSession: uri=${ aUri && aUri.spec
} where=${ aWhere
} flags=${ aFlags }`;
if (!this.isRegistered) {
return null;
}
const message = {
type: "GeckoView:OnNewSession",
uri: aUri ? aUri.displaySpec : ""
};
let browser = undefined;
this.eventDispatcher.sendRequestForResult(message).then(sessionId => {
- return this.waitAndSetOpener(sessionId,
- (aFlags & Ci.nsIBrowserDOMWindow.OPEN_NO_OPENER) ? null : aOpener);
+ return this.waitAndSetupWindow(sessionId, {
+ opener: (aFlags & Ci.nsIBrowserDOMWindow.OPEN_NO_OPENER) ? null : aOpener,
+ nextTabParentId: aNextTabParentId
+ });
}).then(window => {
browser = (window && window.browser);
}, () => {
browser = null;
});
// Wait indefinitely for app to respond with a browser or null
Services.tm.spinEventLoopUntil(() => browser !== undefined);
@@ -156,43 +162,41 @@ class GeckoViewNavigation extends GeckoV
if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags,
aTriggeringPrincipal)) {
// The app has handled the load, abort open-window handling.
Components.returnCode = Cr.NS_ERROR_ABORT;
return null;
}
- const browser = this.handleNewSession(aUri, aOpener, aWhere, aFlags,
- aTriggeringPrincipal);
+ const browser = this.handleNewSession(aUri, aOpener, aWhere, aFlags, null);
if (!browser) {
Components.returnCode = Cr.NS_ERROR_ABORT;
return null;
}
return browser.contentWindow;
}
// nsIBrowserDOMWindow.
createContentWindowInFrame(aUri, aParams, aWhere, aFlags, aNextTabParentId,
aName) {
debug `createContentWindowInFrame: uri=${ aUri && aUri.spec
- } params=${ aParams
} where=${ aWhere
} flags=${ aFlags
} nextTabParentId=${ aNextTabParentId
} name=${ aName }`;
if (LoadURIDelegate.load(this.eventDispatcher, aUri, aWhere, aFlags, null)) {
// The app has handled the load, abort open-window handling.
Components.returnCode = Cr.NS_ERROR_ABORT;
return null;
}
- const browser = this.handleNewSession(aUri, null, aWhere, aFlags, null);
+ const browser = this.handleNewSession(aUri, null, aWhere, aFlags, aNextTabParentId);
if (!browser) {
Components.returnCode = Cr.NS_ERROR_ABORT;
return null;
}
browser.setAttribute("nextTabParentId", aNextTabParentId);
return browser;
}