diff options
Diffstat (limited to 'dom/base/test/referrer_helper.js')
-rw-r--r-- | dom/base/test/referrer_helper.js | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/dom/base/test/referrer_helper.js b/dom/base/test/referrer_helper.js new file mode 100644 index 0000000000..c46bdea7a4 --- /dev/null +++ b/dom/base/test/referrer_helper.js @@ -0,0 +1,102 @@ +/* + * common functionality for iframe, anchor, and area referrer attribute tests + */ +const GET_RESULT = SJS + 'ACTION=get-test-results'; +const RESET_STATE = SJS + 'ACTION=resetState'; + +SimpleTest.waitForExplicitFinish(); +var advance = function() { tests.next(); }; + +/** + * Listen for notifications from the child. + * These are sent in case of error, or when the loads we await have completed. + */ +window.addEventListener("message", function(event) { + if (event.data == "childLoadComplete") { + // all loads happen, continue the test. + advance(); + } +}); + +/** + * helper to perform an XHR + * to do checkIndividualResults and resetState + */ +function doXHR(aUrl, onSuccess, onFail) { + // The server is at http[s]://example.com so we need cross-origin XHR. + var xhr = new XMLHttpRequest({mozSystem: true}); + xhr.responseType = "json"; + xhr.onload = function () { + onSuccess(xhr); + }; + xhr.onerror = function () { + onFail(xhr); + }; + xhr.open('GET', "http" + aUrl, true); + xhr.send(null); +} + +/** + * Grabs the results via XHR and passes to checker. + */ +function checkIndividualResults(aTestname, aExpectedReferrer, aName) { + var onload = xhr => { + var results = xhr.response; + info(JSON.stringify(xhr.response)); + ok(aName in results, aName + " tests have to be performed."); + is(results[aName].policy, aExpectedReferrer, aTestname + ' --- ' + results[aName].policy + ' (' + results[aName].referrer + ')'); + advance(); + }; + var onerror = xhr => { + ok(false, "Can't get results from the counter server."); + SimpleTest.finish(); + }; + doXHR(GET_RESULT, onload, onerror); +} + +function resetState() { + doXHR(RESET_STATE, + advance, + function(xhr) { + ok(false, "error in reset state"); + SimpleTest.finish(); + }); +} + +/** + * testing if anchor and area referrer attributes are honoured (1174913) + */ +var tests = (function() { + + // enable referrer attribute + yield SpecialPowers.pushPrefEnv({"set": [['network.http.enablePerElementReferrer', true]]}, advance); + yield SpecialPowers.pushPrefEnv({"set": [['security.mixed_content.block_active_content', false]]}, advance); + yield SpecialPowers.pushPermissions([{'type': 'systemXHR', 'allow': true, 'context': document}], advance); + + var iframe = document.getElementById("testframe"); + + for (var j = 0; j < testCases.length; j++) { + var actions = testCases[j].ACTION; + var tests = testCases[j].TESTS; + for (var k = 0; k < actions.length; k++) { + var actionString = actions[k]; + for (var i = 0; i < tests.length; i++) { + yield resetState(); + var searchParams = new URLSearchParams(); + searchParams.append("ACTION", actionString); + searchParams.append("NAME", tests[i].NAME); + for (var l of PARAMS) { + if (tests[i][l]) { + searchParams.append(l, tests[i][l]); + } + } + var schemeFrom = tests[i].SCHEME_FROM || "http"; + yield iframe.src = schemeFrom + SJS + searchParams.toString(); + yield checkIndividualResults(tests[i].DESC, tests[i].RESULT, tests[i].NAME); + }; + }; + }; + + // complete. Be sure to yield so we don't call this twice. + yield SimpleTest.finish(); +})();
\ No newline at end of file |