referrer_helper.js (3448B)
1 // This helper expects these globals to be defined. 2 /* global PARAMS, SJS, testCases */ 3 4 /* 5 * common functionality for iframe, anchor, and area referrer attribute tests 6 */ 7 const GET_RESULT = SJS + "ACTION=get-test-results"; 8 const RESET_STATE = SJS + "ACTION=resetState"; 9 10 SimpleTest.waitForExplicitFinish(); 11 var advance = function () { 12 tests.next(); 13 }; 14 15 /** 16 * Listen for notifications from the child. 17 * These are sent in case of error, or when the loads we await have completed. 18 */ 19 window.addEventListener("message", function (event) { 20 if (event.data == "childLoadComplete") { 21 // all loads happen, continue the test. 22 advance(); 23 } 24 }); 25 26 /** 27 * helper to perform an XHR 28 * to do checkIndividualResults and resetState 29 */ 30 function doXHR(aUrl, onSuccess, onFail) { 31 // The server is at http[s]://example.com so we need cross-origin XHR. 32 var xhr = new XMLHttpRequest({ mozSystem: true }); 33 xhr.responseType = "json"; 34 xhr.onload = function () { 35 onSuccess(xhr); 36 }; 37 xhr.onerror = function () { 38 onFail(xhr); 39 }; 40 xhr.open("GET", "http" + aUrl, true); 41 xhr.send(null); 42 } 43 44 /** 45 * Grabs the results via XHR and passes to checker. 46 */ 47 function checkIndividualResults(aTestname, aExpectedReferrer, aName) { 48 var onload = xhr => { 49 var results = xhr.response; 50 info(JSON.stringify(xhr.response)); 51 ok(aName in results, aName + " tests have to be performed."); 52 is( 53 results[aName].policy, 54 aExpectedReferrer, 55 aTestname + 56 " --- " + 57 results[aName].policy + 58 " (" + 59 results[aName].referrer + 60 ")" 61 ); 62 advance(); 63 }; 64 var onerror = () => { 65 ok(false, "Can't get results from the counter server."); 66 SimpleTest.finish(); 67 }; 68 doXHR(GET_RESULT, onload, onerror); 69 } 70 71 function resetState() { 72 doXHR(RESET_STATE, advance, function () { 73 ok(false, "error in reset state"); 74 SimpleTest.finish(); 75 }); 76 } 77 78 /** 79 * testing if referrer header is sent correctly 80 */ 81 var tests = (function* () { 82 yield SpecialPowers.pushPrefEnv( 83 { set: [["security.mixed_content.block_active_content", false]] }, 84 advance 85 ); 86 yield SpecialPowers.pushPrefEnv( 87 { set: [["network.http.referer.disallowCrossSiteRelaxingDefault", false]] }, 88 advance 89 ); 90 yield SpecialPowers.pushPermissions( 91 [{ type: "systemXHR", allow: true, context: document }], 92 advance 93 ); 94 95 var iframe = document.getElementById("testframe"); 96 97 for (var j = 0; j < testCases.length; j++) { 98 if (testCases[j].PREFS) { 99 yield SpecialPowers.pushPrefEnv({ set: testCases[j].PREFS }, advance); 100 } 101 102 var actions = testCases[j].ACTION; 103 var subTests = testCases[j].TESTS; 104 for (var k = 0; k < actions.length; k++) { 105 var actionString = actions[k]; 106 for (var i = 0; i < subTests.length; i++) { 107 yield resetState(); 108 var searchParams = new URLSearchParams(); 109 searchParams.append("ACTION", actionString); 110 searchParams.append("NAME", subTests[i].NAME); 111 for (var l of PARAMS) { 112 if (subTests[i][l]) { 113 searchParams.append(l, subTests[i][l]); 114 } 115 } 116 var schemeFrom = subTests[i].SCHEME_FROM || "http"; 117 yield (iframe.src = schemeFrom + SJS + searchParams.toString()); 118 yield checkIndividualResults( 119 subTests[i].DESC, 120 subTests[i].RESULT, 121 subTests[i].NAME 122 ); 123 } 124 } 125 } 126 127 // complete. 128 SimpleTest.finish(); 129 })();