test_bug519928.html (3402B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=519928 5 --> 6 <head> 7 <title>Test for Bug 519928</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 10 </head> 11 <body> 12 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=519928">Mozilla Bug 519928</a> 13 <p id="display"></p> 14 <div id="content"> 15 <iframe id="load-frame"></iframe> 16 </div> 17 <pre id="test"> 18 <script class="testbody" type="text/javascript"> 19 20 var iframe = document.getElementById("load-frame"); 21 22 function enableJS() { allowJS(true, iframe); } 23 function disableJS() { allowJS(false, iframe); } 24 function allowJS(allow, frame) { 25 SpecialPowers.wrap(frame.contentWindow).windowGlobalChild.windowContext.allowJavascript = allow; 26 } 27 28 async function expectJSAllowed(allowed, testCondition) { 29 window.ICanRunMyJS = false; 30 const self_ = window; 31 testCondition(); 32 33 const doc = iframe.contentDocument; 34 const innerFrame = doc.createElement("iframe"); 35 // eslint-disable-next-line no-useless-concat 36 innerFrame.srcdoc = "<script>parent.parent.ICanRunMyJS = true;</scr" + "ipt>"; 37 const loaded = new Promise(resolve => innerFrame.onload = resolve); 38 doc.body.append(innerFrame); 39 40 await loaded; 41 is(self_.ICanRunMyJS, allowed, "The inner iframe should" + (allowed ? "" : " not") + " be able to run Javascript"); 42 43 innerFrame.remove(); 44 } 45 46 async function testDocumentDisabledJS() { 47 window.ICanRunMyJS = false; 48 const self_ = window; 49 // Ensure design modes are disabled 50 document.designMode = "off"; 51 iframe.contentDocument.designMode = "off"; 52 53 // Javascript enabled on the main iframe 54 enableJS(); 55 56 const doc = iframe.contentDocument; 57 const innerFrame = doc.createElement("iframe"); 58 // eslint-disable-next-line no-useless-concat 59 innerFrame.srcdoc = "<script>parent.parent.ICanRunMyJS = true;</scr" + "ipt>"; 60 const loaded = new Promise(resolve => innerFrame.onload = resolve); 61 doc.body.append(innerFrame); 62 63 // Javascript disabled on the innerFrame. 64 allowJS(false, innerFrame); 65 66 await loaded; 67 is(self_.ICanRunMyJS, false, "The inner iframe should not be able to run Javascript"); 68 69 innerFrame.remove(); 70 } 71 72 SimpleTest.waitForExplicitFinish(); 73 addLoadEvent(async function() { 74 var enterDesignMode = function() { document.designMode = "on"; }; 75 var leaveDesignMode = function() { document.designMode = "off"; }; 76 77 await expectJSAllowed(false, disableJS); 78 await expectJSAllowed(true, enableJS); 79 await expectJSAllowed(true, enterDesignMode); 80 await expectJSAllowed(true, leaveDesignMode); 81 await expectJSAllowed(false, disableJS); 82 await expectJSAllowed(false, enterDesignMode); 83 await expectJSAllowed(false, leaveDesignMode); 84 await expectJSAllowed(true, enableJS); 85 86 enterDesignMode = function() { iframe.contentDocument.designMode = "on"; }; 87 leaveDesignMode = function() { iframe.contentDocument.designMode = "off"; }; 88 89 await expectJSAllowed(false, disableJS); 90 await expectJSAllowed(true, enableJS); 91 await expectJSAllowed(true, enterDesignMode); 92 await expectJSAllowed(true, leaveDesignMode); 93 await expectJSAllowed(false, disableJS); 94 await expectJSAllowed(false, enterDesignMode); 95 await expectJSAllowed(false, leaveDesignMode); 96 await expectJSAllowed(true, enableJS); 97 98 await testDocumentDisabledJS(); 99 100 SimpleTest.finish(); 101 }); 102 </script> 103 </pre> 104 </body> 105 </html>