test_cache_jar.js (2509B)
1 "use strict"; 2 3 const { HttpServer } = ChromeUtils.importESModule( 4 "resource://testing-common/httpd.sys.mjs" 5 ); 6 7 ChromeUtils.defineLazyGetter(this, "URL", function () { 8 return "http://localhost:" + httpserv.identity.primaryPort + "/cached"; 9 }); 10 11 var httpserv = null; 12 var handlers_called = 0; 13 14 function cached_handler(metadata, response) { 15 response.setHeader("Content-Type", "text/plain", false); 16 response.setHeader("Cache-Control", "max-age=10000", false); 17 response.setStatusLine(metadata.httpVersion, 200, "OK"); 18 var body = "0123456789"; 19 response.bodyOutputStream.write(body, body.length); 20 handlers_called++; 21 } 22 23 function makeChan(url, userContextId) { 24 var chan = NetUtil.newChannel({ 25 uri: url, 26 loadUsingSystemPrincipal: true, 27 }).QueryInterface(Ci.nsIHttpChannel); 28 chan.loadInfo.originAttributes = { userContextId }; 29 return chan; 30 } 31 32 // [userContextId, expected_handlers_called] 33 var firstTests = [ 34 [0, 1], 35 [1, 1], 36 ]; 37 var secondTests = [ 38 [0, 0], 39 [1, 1], 40 [1, 0], 41 ]; 42 43 async function run_all_tests() { 44 for (let test of firstTests) { 45 handlers_called = 0; 46 await test_channel(...test); 47 } 48 49 // We can't easily cause webapp data to be cleared from the child process, so skip 50 // the rest of these tests. 51 let procType = Services.appinfo.processType; 52 if (procType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) { 53 return; 54 } 55 56 Services.clearData.deleteDataFromOriginAttributesPattern({ 57 userContextId: 1, 58 }); 59 60 for (let test of secondTests) { 61 handlers_called = 0; 62 await test_channel(...test); 63 } 64 } 65 66 function run_test() { 67 do_get_profile(); 68 69 do_test_pending(); 70 71 Services.prefs.setBoolPref("network.http.rcwn.enabled", false); 72 73 httpserv = new HttpServer(); 74 httpserv.registerPathHandler("/cached", cached_handler); 75 httpserv.start(-1); 76 run_all_tests().then(() => { 77 do_test_finished(); 78 }); 79 } 80 81 function test_channel(userContextId, expected) { 82 return new Promise(resolve => { 83 var chan = makeChan(URL, userContextId); 84 chan.asyncOpen( 85 new ChannelListener(doneFirstLoad.bind(null, resolve), expected) 86 ); 87 }); 88 } 89 90 function doneFirstLoad(resolve, req, buffer, expected) { 91 // Load it again, make sure it hits the cache 92 var oa = req.loadInfo.originAttributes; 93 var chan = makeChan(URL, oa.userContextId); 94 chan.asyncOpen( 95 new ChannelListener(doneSecondLoad.bind(null, resolve), expected) 96 ); 97 } 98 99 function doneSecondLoad(resolve, req, buffer, expected) { 100 Assert.equal(handlers_called, expected); 101 resolve(); 102 }