OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <body style="overflow:hidden" onload="test()"> | |
3 <div id="other"> </div> | |
4 <div> | |
5 <div style="position:absolute; top: 0px; overflow:hidden; width:500px; height:
500px;" id="grandparent"> | |
6 <div style="position:absolute; top: 0px; overflow:hidden; width:500px; heigh
t:500px;" id="root"> | |
7 </div> | |
8 </div> | |
9 </div> | |
10 <script type="text/javascript"> | |
11 function test() { | |
12 // create some SVG | |
13 var svgroot = document.createElementNS("http://www.w3.org/2000/svg", "svg"); | |
14 svgroot.setAttribute("width", "100%"); | |
15 svgroot.setAttribute("height", "100%"); | |
16 document.getElementById("root").appendChild(svgroot); | |
17 // add a red rectangle that will be covered up by the green rectangle | |
18 var redRect = document.createElementNS("http://www.w3.org/2000/svg", "rect")
; | |
19 redRect.setAttribute("fill", "red"); | |
20 redRect.setAttribute("x", "50%"); | |
21 redRect.setAttribute("y", "10"); | |
22 redRect.setAttribute("width", "50%"); | |
23 redRect.setAttribute("height", "50%"); | |
24 svgroot.style.position = "absolute"; | |
25 svgroot.style.top="0px"; | |
26 svgroot.appendChild(redRect); | |
27 // add a green rectangle to the left of the red one | |
28 var greenRect = document.createElementNS("http://www.w3.org/2000/svg", "rect
"); | |
29 greenRect.setAttribute("fill", "green"); | |
30 greenRect.setAttribute("x", "0%"); | |
31 greenRect.setAttribute("y", "10"); | |
32 greenRect.setAttribute("width", "50%"); | |
33 svgroot.appendChild(greenRect); | |
34 document.body.offsetLeft; | |
35 // dirty an SVG attribute | |
36 greenRect.setAttribute("height", "50%"); | |
37 // make sure the svg root's .style attribute is out of date | |
38 svgroot.style.position = "absolute"; | |
39 // force layout. this will be rooted at the LayoutSVGRoot and will set m_pos
ChildNeedsLayout on its | |
40 // containing LayoutBlockFlow (corresponding to DIV#root) | |
41 document.body.offsetWidth; | |
42 // dirty an SVG attribute, will set FrameView::m_layoutRoot to the LayoutSVG
Root | |
43 greenRect.setAttribute("width", "50%"); | |
44 // dirty a normal DOM attribute in a separate part of the DOM. this is wher
e things go awry since | |
45 // FrameView::scheduleRelayoutOfSubtree will clear out its m_layoutRoot and
call | |
46 // LayoutObject::markContainingBlocksForLayout() on the LayoutSVGRoot. Sinc
e the LayoutSVGRoot's | |
47 // container already has m_posChildNeedsLayout set, the LayoutSVGRoot's cont
ainer's container | |
48 // (corresponding to the DIV#grandparent) will not have any needs layout fla
gs set on it. | |
49 document.getElementById('other').style.width="500px"; | |
50 // Run a layout pass. This will propagate the render tree up to the DIV#oth
er's render object but | |
51 // will not traverse into the svg subtree at all since the DIV#grandparent's
render object is | |
52 // not marked as needing layout. | |
53 document.body.offsetWidth; | |
54 // This goes into the void since the LayoutSVGRoot is already marked as need
sLayout but there is no | |
55 // layout pending. | |
56 greenRect.setAttribute("x", "50%"); | |
57 } | |
58 </script> | |
59 </body> | |
60 | |
OLD | NEW |