forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			136 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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 <https://www.bank1.com/#BG>, which displayes a cert
 | |
|    error page.
 | |
| 
 | |
| 3. Switch the tab to foreground.
 | |
| 
 | |
| 4. Check the URLbar's value, expecting <https://www.bank1.com/#BG>
 | |
| 
 | |
| 5. Load
 | |
| https://example.com/browser/browser/base/content/test/redirect_bug623155.sjs#FG
 | |
|    in the foreground tab.
 | |
| 
 | |
| 6. The redirected URI is <https://www.bank1.com/#FG>. And this is also
 | |
|    a cert-error page.
 | |
| 
 | |
| 7. Check the URLbar's value, expecting <https://www.bank1.com/#FG>
 | |
| 
 | |
| 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;
 | |
| });
 | 
