helper.sub.js (3763B)
1 function xfo_simple_tests({ headerValue, headerValue2, cspValue, sameOriginAllowed, crossOriginAllowed }) { 2 simpleXFOTestsInner({ 3 urlPrefix: "", 4 allowed: sameOriginAllowed, 5 headerValue, 6 headerValue2, 7 cspValue, 8 sameOrCross: "same-origin" 9 }); 10 11 simpleXFOTestsInner({ 12 urlPrefix: "http://{{domains[www]}}:{{ports[http][0]}}", 13 allowed: crossOriginAllowed, 14 headerValue, 15 headerValue2, 16 cspValue, 17 sameOrCross: "cross-origin" 18 }); 19 } 20 21 function simpleXFOTestsInner({ urlPrefix, allowed, headerValue, headerValue2, cspValue, sameOrCross }) { 22 const value2QueryString = headerValue2 !== undefined ? `&value2=${headerValue2}` : ``; 23 const cspQueryString = cspValue !== undefined ? `&csp_value=${cspValue}` : ``; 24 25 const valueMessageString = headerValue === "" ? "(the empty string)" : headerValue; 26 const value2MessageString = headerValue2 === "" ? "(the empty string)" : headerValue2; 27 const value2MaybeMessageString = headerValue2 !== undefined ? `;${headerValue2}` : ``; 28 const cspMessageString = cspValue !== undefined ? ` with CSP ${cspValue}` : ``; 29 30 // This will test the multi-header variant, if headerValue2 is not undefined. 31 xfo_test({ 32 url: `${urlPrefix}/x-frame-options/support/xfo.py?value=${headerValue}${value2QueryString}${cspQueryString}`, 33 check: allowed ? "loaded message" : "no message", 34 message: `\`${valueMessageString}${value2MaybeMessageString}\` ${allowed ? "allows" : "blocks"} ${sameOrCross} framing${cspMessageString}` 35 }); 36 37 if (headerValue2 !== undefined && headerValue2 !== headerValue) { 38 // Reversed variant 39 xfo_test({ 40 url: `${urlPrefix}/x-frame-options/support/xfo.py?value=${headerValue2}&value2=${headerValue}${cspQueryString}`, 41 check: allowed ? "loaded message" : "no message", 42 message: `\`${value2MessageString};${valueMessageString}\` ${allowed ? "allows" : "blocks"} ${sameOrCross} framing${cspMessageString}` 43 }); 44 45 // Comma variant 46 xfo_test({ 47 url: `${urlPrefix}/x-frame-options/support/xfo.py?value=${headerValue},${headerValue2}${cspQueryString}`, 48 check: allowed ? "loaded message" : "no message", 49 message: `\`${valueMessageString},${value2MessageString}\` ${allowed ? "allows" : "blocks"} ${sameOrCross} framing${cspMessageString}` 50 }); 51 52 // Comma + reversed variant 53 xfo_test({ 54 url: `${urlPrefix}/x-frame-options/support/xfo.py?value=${headerValue2},${headerValue}${cspQueryString}`, 55 check: allowed ? "loaded message" : "no message", 56 message: `\`${value2MessageString},${valueMessageString}\` ${allowed ? "allows" : "blocks"} ${sameOrCross} framing${cspMessageString}` 57 }); 58 } 59 } 60 61 function xfo_test({ url, check, message }) { 62 async_test(t => { 63 const i = document.createElement("iframe"); 64 i.src = url; 65 66 switch (check) { 67 case "loaded message": { 68 waitForMessageFrom(i, t).then(t.step_func_done(e => { 69 assert_equals(e.data, "Loaded"); 70 })); 71 break; 72 } 73 case "failed message": { 74 waitForMessageFrom(i, t).then(t.step_func_done(e => { 75 assert_equals(e.data, "Failed"); 76 })); 77 break; 78 } 79 case "no message": { 80 waitForMessageFrom(i, t).then(t.unreached_func("Frame should not have sent a message.")); 81 i.onload = t.step_func_done(() => { 82 assert_equals(i.contentDocument, null); 83 }); 84 break; 85 } 86 default: { 87 throw new Error("Bad test"); 88 } 89 } 90 91 document.body.append(i); 92 }, message); 93 } 94 95 function waitForMessageFrom(frame, test) { 96 return new Promise(resolve => { 97 window.addEventListener("message", test.step_func(e => { 98 if (e.source == frame.contentWindow) { 99 resolve(e); 100 } 101 })); 102 }); 103 }