test_bug311681.xhtml (3267B)
1 <?xml version="1.0"?> 2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?> 3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?> 4 <!-- 5 https://bugzilla.mozilla.org/show_bug.cgi?id=311681 6 --> 7 <window title="Mozilla Bug 311681" 8 xmlns:html="http://www.w3.org/1999/xhtml" 9 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 10 11 <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> 12 13 <body xmlns="http://www.w3.org/1999/xhtml"> 14 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=311681">Mozilla Bug 311681</a> 15 <script class="testbody" type="text/javascript"> 16 <![CDATA[ 17 // Setup script 18 SimpleTest.waitForExplicitFinish(); 19 20 // Make sure to trigger the hashtable case by asking for enough elements 21 // by ID. 22 for (var i = 0; i < 256; ++i) { 23 var x = document.getElementById(i); 24 } 25 26 // save off the document.getElementById function, since getting it as a 27 // property off the document it causes a content flush. 28 var fun = document.getElementById; 29 30 // Slot for our initial element with id "content" 31 var testNode; 32 33 function getCont() { 34 return fun.call(document, "content"); 35 } 36 37 function testClone() { 38 // Test to make sure that if we have multiple nodes with the same ID in 39 // a document we don't forget about one of them when the other is 40 // removed. 41 var newParent = $("display"); 42 var node = testNode.cloneNode(true); 43 isnot(node, testNode, "Clone should be a different node"); 44 45 newParent.appendChild(node); 46 47 // Check what getElementById returns, no flushing 48 is(getCont(), node, "Should be getting new node pre-flush 1") 49 50 // Trigger a layout flush, just in case. 51 let itemHeight = newParent.offsetHeight/10; 52 53 // Check what getElementById returns now. 54 is(getCont(), node, "Should be getting new node post-flush 1") 55 56 clear(newParent); 57 58 // Check what getElementById returns, no flushing 59 is(getCont(), testNode, "Should be getting orig node pre-flush 2"); 60 61 // Trigger a layout flush, just in case. 62 itemHeight = newParent.offsetHeight/10; 63 64 // Check what getElementById returns now. 65 is(getCont(), testNode, "Should be getting orig node post-flush 2"); 66 67 node = testNode.cloneNode(true); 68 newParent.appendChild(node); 69 testNode.remove(); 70 71 // Check what getElementById returns, no flushing 72 is(getCont(), node, "Should be getting clone pre-flush"); 73 74 // Trigger a layout flush, just in case. 75 // eslint-disable-next-line no-unused-vars 76 itemHeight = newParent.offsetHeight/10; 77 78 // Check what getElementById returns now. 79 is(getCont(), node, "Should be getting clone post-flush"); 80 81 } 82 83 function clear(node) { 84 while (node.hasChildNodes()) { 85 node.firstChild.remove(); 86 } 87 } 88 89 addLoadEvent(testClone); 90 addLoadEvent(SimpleTest.finish); 91 ]]> 92 </script> 93 <p id="display"></p> 94 <div id="content" style="display: none"> 95 <script class="testbody" type="text/javascript"> 96 <![CDATA[ 97 testNode = fun.call(document, "content"); 98 // Needs incremental XML parser 99 isnot(testNode, null, "Should have node here"); 100 ]]> 101 </script> 102 </div> 103 <pre id="test"> 104 </pre> 105 </body> 106 107 </window>