forked from mirrors/gecko-dev
		
	 1ff74da18d
			
		
	
	
		1ff74da18d
		
	
	
	
	
		
			
			Since URI hostnames are defined to be case-insensitive, we only ever see lower-case hostnames when looking up substitutions. That means that substitutions containing capital letters are inaccessible, which is a footgun that has hit many people. The handler should lower-case substitutions when they're added so that look-ups are always case-insensitive. MozReview-Commit-ID: C936hS2cSyY --HG-- extra : rebase_source : a70e8ceb822879e51c3a40232b7dffdfb9c0a185
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| ChromeUtils.import("resource://gre/modules/Services.jsm");
 | |
| 
 | |
| add_task(async function test_case_insensitive_substitutions() {
 | |
|   let resProto = Services.io.getProtocolHandler("resource")
 | |
|     .QueryInterface(Ci.nsISubstitutingProtocolHandler);
 | |
| 
 | |
|   let uri = Services.io.newFileURI(do_get_file("data"));
 | |
| 
 | |
|   resProto.setSubstitution("FooBar", uri);
 | |
|   resProto.setSubstitutionWithFlags("BarBaz", uri, 0);
 | |
| 
 | |
|   equal(resProto.resolveURI(Services.io.newURI("resource://foobar/")),
 | |
|         uri.spec, "Got correct resolved URI for setSubstitution");
 | |
| 
 | |
|   equal(resProto.resolveURI(Services.io.newURI("resource://foobar/")),
 | |
|         uri.spec, "Got correct resolved URI for setSubstitutionWithFlags");
 | |
| 
 | |
|   ok(resProto.hasSubstitution("foobar"), "hasSubstitution works with all-lower-case root");
 | |
|   ok(resProto.hasSubstitution("FooBar"), "hasSubstitution works with mixed-case root");
 | |
| 
 | |
|   equal(resProto.getSubstitution("foobar").spec, uri.spec,
 | |
|         "getSubstitution works with all-lower-case root");
 | |
|   equal(resProto.getSubstitution("FooBar").spec, uri.spec,
 | |
|         "getSubstitution works with mixed-case root");
 | |
| 
 | |
|   resProto.setSubstitution("foobar", null);
 | |
|   resProto.setSubstitution("barbaz", null);
 | |
| 
 | |
|   Assert.throws(() => resProto.resolveURI(Services.io.newURI("resource://foobar/")),
 | |
|                 e => e.result == Cr.NS_ERROR_NOT_AVAILABLE,
 | |
|                 "Correctly unregistered case-insensitive substitution in setSubstitution");
 | |
|   Assert.throws(() => resProto.resolveURI(Services.io.newURI("resource://barbaz/")),
 | |
|                 e => e.result == Cr.NS_ERROR_NOT_AVAILABLE,
 | |
|                 "Correctly unregistered case-insensitive substitution in setSubstitutionWithFlags");
 | |
| 
 | |
|   Assert.throws(() => resProto.getSubstitution("foobar"),
 | |
|                 e => e.result == Cr.NS_ERROR_NOT_AVAILABLE,
 | |
|                 "foobar substitution has been removed");
 | |
| });
 |