/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ const REDIRECT_FROM = "https://example.com/browser/browser/base/content/test/" + "redirect_bug623155.sjs"; const REDIRECT_TO = "https://www.bank1.com/"; // Bad-cert host. function isRedirectedURISpec(aURISpec) { return isRedirectedURI(Services.io.newURI(aURISpec, null, null)); } function isRedirectedURI(aURI) { // Compare only their before-hash portion. return Services.io.newURI(REDIRECT_TO, null, null) .equalsExceptRef(aURI); } /* Test. 1. Load https://example.com/browser/browser/base/content/test/redirect_bug623155.sjs#BG in a background tab. 2. The redirected URI is , which displayes a cert error page. 3. Switch the tab to foreground. 4. Check the URLbar's value, expecting 5. Load https://example.com/browser/browser/base/content/test/redirect_bug623155.sjs#FG in the foreground tab. 6. The redirected URI is . And this is also a cert-error page. 7. Check the URLbar's value, expecting 8. End. */ var gNewTab; function test() { waitForExplicitFinish(); // Load a URI in the background. gNewTab = gBrowser.addTab(REDIRECT_FROM + "#BG"); gBrowser.getBrowserForTab(gNewTab) .webProgress .addProgressListener(gWebProgressListener, Components.interfaces.nsIWebProgress .NOTIFY_LOCATION); } var gWebProgressListener = { QueryInterface: function(aIID) { if (aIID.equals(Components.interfaces.nsIWebProgressListener) || aIID.equals(Components.interfaces.nsISupportsWeakReference) || aIID.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; }, // --------------------------------------------------------------------------- // NOTIFY_LOCATION mode should work fine without these methods. // //onStateChange: function() {}, //onStatusChange: function() {}, //onProgressChange: function() {}, //onSecurityChange: function() {}, //---------------------------------------------------------------------------- onLocationChange: function(aWebProgress, aRequest, aLocation, aFlags) { if (!aRequest) { // This is bug 673752, or maybe initial "about:blank". return; } ok(gNewTab, "There is a new tab."); ok(isRedirectedURI(aLocation), "onLocationChange catches only redirected URI."); if (aLocation.ref == "BG") { // This is background tab's request. isnot(gNewTab, gBrowser.selectedTab, "This is a background tab."); } else if (aLocation.ref == "FG") { // This is foreground tab's request. is(gNewTab, gBrowser.selectedTab, "This is a foreground tab."); } else { // We shonuld not reach here. ok(false, "This URI hash is not expected:" + aLocation.ref); } let isSelectedTab = (gNewTab == gBrowser.selectedTab); setTimeout(delayed, 0, isSelectedTab); } }; function delayed(aIsSelectedTab) { // Switch tab and confirm URL bar. if (!aIsSelectedTab) { gBrowser.selectedTab = gNewTab; } ok(isRedirectedURISpec(content.location.href), "The content area is redirected. aIsSelectedTab:" + aIsSelectedTab); is(gURLBar.value, content.location.href, "The URL bar shows the content URI. aIsSelectedTab:" + aIsSelectedTab); if (!aIsSelectedTab) { // If this was a background request, go on a foreground request. content.location = REDIRECT_FROM + "#FG"; } else { // Othrewise, nothing to do remains. finish(); } } /* Cleanup */ registerCleanupFunction(function() { if (gNewTab) { gBrowser.getBrowserForTab(gNewTab) .webProgress .removeProgressListener(gWebProgressListener); gBrowser.removeTab(gNewTab); } gNewTab = null; });