Bug 1385124 - Close tab when new tab redirects to external app; r?sebastian draft
authorJim Chen <nchen@mozilla.com>
Wed, 27 Sep 2017 16:47:13 -0400
changeset 671314 3bbc0184389159728ccbe74d73dc2b3526b03f8e
parent 671250 6100472d3aa833dff22a4edb0934fe600f43ddb8
child 733501 7c1b7653ba117fdfc8ff637c0b72c8f51db27ecb
push id81921
push userbmo:nchen@mozilla.com
push dateWed, 27 Sep 2017 20:47:56 +0000
reviewerssebastian
bugs1385124
milestone58.0a1
Bug 1385124 - Close tab when new tab redirects to external app; r?sebastian When a site opens link in a new tab that redirects to an external app, we should close the new (empty) tab and return to the previous page. MozReview-Commit-ID: KXWA2d26RBh
mobile/android/components/ContentDispatchChooser.js
--- a/mobile/android/components/ContentDispatchChooser.js
+++ b/mobile/android/components/ContentDispatchChooser.js
@@ -29,60 +29,75 @@ ContentDispatchChooser.prototype =
   _getChromeWin: function getChromeWin() {
     try {
       return Services.wm.getMostRecentWindow("navigator:browser");
     } catch (e) {
       throw Cr.NS_ERROR_FAILURE;
     }
   },
 
+  _closeBlankWindow: function(aWindow) {
+    if (!aWindow || aWindow.history.length) {
+      return;
+    }
+    if (!aWindow.location.href || aWindow.location.href === "about:blank") {
+      aWindow.close();
+    }
+  },
+
   ask: function ask(aHandler, aWindowContext, aURI, aReason) {
     let window = null;
     try {
       if (aWindowContext)
         window = aWindowContext.getInterface(Ci.nsIDOMWindow);
     } catch (e) { /* it's OK to not have a window */ }
 
     // The current list is based purely on the scheme. Redo the query using the url to get more
     // specific results.
     aHandler = this.protoSvc.getProtocolHandlerInfoFromOS(aURI.spec, {});
 
     // The first handler in the set is the Android Application Chooser (which will fall back to a default if one is set)
     // If we have more than one option, let the OS handle showing a list (if needed).
     if (aHandler.possibleApplicationHandlers.length > 1) {
       aHandler.launchWithURI(aURI, aWindowContext);
+      this._closeBlankWindow(window);
+
     } else {
       // xpcshell tests do not have an Android Bridge but we require Android
       // Bridge when using Messaging so we guard against this case. xpcshell
       // tests also do not have a window, so we use this state to guard.
       let win = this._getChromeWin();
       if (!win) {
         return;
       }
 
       let msg = {
         type: "Intent:OpenNoHandler",
         uri: aURI.spec,
       };
 
       EventDispatcher.instance.sendRequestForResult(msg).then(() => {
         // Java opens an app on success: take no action.
+        this._closeBlankWindow(window);
+
       }, (data) => {
         if (data.isFallback) {
           // We always want to open a fallback url
           window.location.href = data.uri;
           return;
         }
 
         // We couldn't open this. If this was from a click, it's likely that we just
         // want this to fail silently. If the user entered this on the address bar, though,
         // we want to show the neterror page.
         let dwu = window.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
         let millis = dwu.millisSinceLastUserInput;
         if (millis > 0 && millis >= 1000) {
           window.location.href = data.uri;
+        } else {
+          this._closeBlankWindow(window);
         }
       });
     }
   },
 };
 
 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ContentDispatchChooser]);