Bug 1456254 - Correctly set nextTabParentId in GeckoView r=esawin draft
authorJames Willcox <snorp@snorp.net>
Mon, 23 Apr 2018 15:07:46 -0500
changeset 787919 f8e53249e9d6d7e7f0aab1fbe20eab11ac089cef
parent 787918 fe3fa297bc72c436466217bc0a2ec51e2a0fc400
child 787920 9fd80c1dcde219022ee56246003c8ae0ad953cd8
push id107841
push userbmo:snorp@snorp.net
push dateWed, 25 Apr 2018 16:42:35 +0000
reviewersesawin
bugs1456254
milestone61.0a1
Bug 1456254 - Correctly set nextTabParentId in GeckoView r=esawin MozReview-Commit-ID: IDh10RkeUpY
mobile/android/modules/geckoview/GeckoViewNavigation.jsm
--- 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;
   }