browser_dynamic_frames.js (3681B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 /** 7 * Ensure that static frames of framesets are serialized but dynamically 8 * inserted iframes are ignored. 9 */ 10 add_task(async function () { 11 // allow top level data: URI navigations, otherwise clicking a data: link fails 12 await SpecialPowers.pushPrefEnv({ 13 set: [["security.data_uri.block_toplevel_data_uri_navigations", false]], 14 }); 15 // This URL has the following frames: 16 // + data:text/html,A (static) 17 // + data:text/html,B (static) 18 // + data:text/html,C (dynamic iframe) 19 const URL = 20 "data:text/html;charset=utf-8," + 21 "<frameset cols=50%25,50%25><frame src='data:text/html,A'>" + 22 "<frame src='data:text/html,B'></frameset>" + 23 "<script>var i=document.createElement('iframe');" + 24 "i.setAttribute('src', 'data:text/html,C');" + 25 "document.body.appendChild(i);</script>"; 26 27 // Add a new tab with two "static" and one "dynamic" frame. 28 let tab = BrowserTestUtils.addTab(gBrowser, URL); 29 let browser = tab.linkedBrowser; 30 await promiseBrowserLoaded(browser); 31 32 await TabStateFlusher.flush(browser); 33 let { entries } = JSON.parse(ss.getTabState(tab)); 34 35 // Check URLs. 36 ok(entries[0].url.startsWith("data:text/html"), "correct root url"); 37 is( 38 entries[0].children[0].url, 39 "data:text/html,A", 40 "correct url for 1st frame" 41 ); 42 is( 43 entries[0].children[1].url, 44 "data:text/html,B", 45 "correct url for 2nd frame" 46 ); 47 48 // Check the number of children. 49 is(entries.length, 1, "there is one root entry ..."); 50 is(entries[0].children.length, 2, "... with two child entries"); 51 52 // Cleanup. 53 gBrowser.removeTab(tab); 54 }); 55 56 /** 57 * Ensure that iframes created by the network parser are serialized but 58 * dynamically inserted iframes are ignored. Navigating a subframe should 59 * create a second root entry that doesn't contain any dynamic children either. 60 */ 61 add_task(async function () { 62 // allow top level data: URI navigations, otherwise clicking a data: link fails 63 await SpecialPowers.pushPrefEnv({ 64 set: [["security.data_uri.block_toplevel_data_uri_navigations", false]], 65 }); 66 // This URL has the following frames: 67 // + data:text/html,A (static) 68 // + data:text/html,C (dynamic iframe) 69 const URL = 70 "data:text/html;charset=utf-8," + 71 "<iframe name=t src='data:text/html,A'></iframe>" + 72 "<a id=lnk href='data:text/html,B' target=t>clickme</a>" + 73 "<script>var i=document.createElement('iframe');" + 74 "i.setAttribute('src', 'data:text/html,C');" + 75 "document.body.appendChild(i);</script>"; 76 77 // Add a new tab with one "static" and one "dynamic" frame. 78 let tab = BrowserTestUtils.addTab(gBrowser, URL); 79 let browser = tab.linkedBrowser; 80 await promiseBrowserLoaded(browser); 81 82 await TabStateFlusher.flush(browser); 83 let { entries } = JSON.parse(ss.getTabState(tab)); 84 85 // Check URLs. 86 ok(entries[0].url.startsWith("data:text/html"), "correct root url"); 87 ok(!entries[0].children, "no children collected"); 88 89 // Navigate the subframe. 90 await BrowserTestUtils.synthesizeMouseAtCenter("#lnk", {}, browser); 91 await promiseBrowserLoaded(browser, false /* don't ignore subframes */); 92 93 await TabStateFlusher.flush(browser); 94 ({ entries } = JSON.parse(ss.getTabState(tab))); 95 96 // Check URLs. 97 ok(entries[0].url.startsWith("data:text/html"), "correct 1st root url"); 98 ok(entries[1].url.startsWith("data:text/html"), "correct 2nd root url"); 99 ok(!entries.children, "no children collected"); 100 ok(!entries[0].children, "no children collected"); 101 ok(!entries[1].children, "no children collected"); 102 103 // Cleanup. 104 gBrowser.removeTab(tab); 105 });