test_flushing_frame.html (1905B)
1 <!doctype html> 2 <meta charset="utf-8"> 3 <title> 4 Test for bug 1545516: We don't flush layout unnecessarily on the parent 5 document when the frame is already disconnected. 6 </title> 7 <link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez"> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <div id="content"></div> 10 <script> 11 SimpleTest.waitForExplicitFinish(); 12 const iframe = document.createElement("iframe"); 13 const content = document.querySelector("#content"); 14 const parentUtils = SpecialPowers.getDOMWindowUtils(window); 15 iframe.onload = function() { 16 const win = iframe.contentWindow; 17 iframe.offsetTop; // flush layout 18 content.style.display = "inline"; // Dirty style with something that will reframe. 19 20 const previousConstructCount = parentUtils.framesConstructed; 21 let pagehideRan = false; 22 win.addEventListener("pagehide", function() { 23 pagehideRan = true; 24 win.foo = win.innerWidth; 25 is(parentUtils.framesConstructed, previousConstructCount, "innerWidth shouldn't have flushed parent document layout") 26 win.bar = win.document.documentElement.offsetHeight; 27 is(parentUtils.framesConstructed, previousConstructCount, "offsetHeight shouldn't have flushed parent document layout") 28 win.baz = win.getComputedStyle(win.document.documentElement).color; 29 is(parentUtils.framesConstructed, previousConstructCount, "getComputedStyle shouldn't have flushed parent document layout") 30 }); 31 32 iframe.remove(); // Remove the iframe 33 is(pagehideRan, true, "pagehide handler should've ran"); 34 is(parentUtils.framesConstructed, previousConstructCount, "Nothing should've flushed the parent document layout yet"); 35 content.offsetTop; 36 isnot(parentUtils.framesConstructed, previousConstructCount, "We should've flushed layout now"); 37 SimpleTest.finish(); 38 }; 39 document.body.appendChild(iframe); 40 </script>