61 lines
2.9 KiB
HTML
61 lines
2.9 KiB
HTML
<!DOCTYPE html>
|
|
<body style="overflow:hidden" onload="test()">
|
|
<div id="other"> </div>
|
|
<div>
|
|
<div style="position:absolute; top: 0px; overflow:hidden; width:500px; height:500px;" id="grandparent">
|
|
<div style="position:absolute; top: 0px; overflow:hidden; width:500px; height:500px;" id="root">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
function test() {
|
|
// create some SVG
|
|
var svgroot = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
svgroot.setAttribute("width", "100%");
|
|
svgroot.setAttribute("height", "100%");
|
|
document.getElementById("root").appendChild(svgroot);
|
|
// add a red rectangle that will be covered up by the green rectangle
|
|
var redRect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
redRect.setAttribute("fill", "red");
|
|
redRect.setAttribute("x", "50%");
|
|
redRect.setAttribute("y", "10");
|
|
redRect.setAttribute("width", "50%");
|
|
redRect.setAttribute("height", "50%");
|
|
svgroot.style.position = "absolute";
|
|
svgroot.style.top="0px";
|
|
svgroot.appendChild(redRect);
|
|
// add a green rectangle to the left of the red one
|
|
var greenRect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
greenRect.setAttribute("fill", "green");
|
|
greenRect.setAttribute("x", "0%");
|
|
greenRect.setAttribute("y", "10");
|
|
greenRect.setAttribute("width", "50%");
|
|
svgroot.appendChild(greenRect);
|
|
document.body.offsetLeft;
|
|
// dirty an SVG attribute
|
|
greenRect.setAttribute("height", "50%");
|
|
// make sure the svg root's .style attribute is out of date
|
|
svgroot.style.position = "absolute";
|
|
// force layout. this will be rooted at the RenderSVGRoot and will set m_posChildNeedsLayout on its
|
|
// containing RenderBlock (corresponding to DIV#root)
|
|
document.body.offsetWidth;
|
|
// dirty an SVG attribute, will set FrameView::m_layoutRoot to the RenderSVGRoot
|
|
greenRect.setAttribute("width", "50%");
|
|
// dirty a normal DOM attribute in a separate part of the DOM. this is where things go awry since
|
|
// FrameView::scheduleRelayoutOfSubtree will clear out its m_layoutRoot and call
|
|
// RenderObject::markContainingBlocksForLayout() on the RenderSVGRoot. Since the RenderSVGRoot's
|
|
// container already has m_posChildNeedsLayout set, the RenderSVGRoot's container's container
|
|
// (corresponding to the DIV#grandparent) will not have any needs layout flags set on it.
|
|
document.getElementById('other').style.width="500px";
|
|
// Run a layout pass. This will propagate the render tree up to the DIV#other's render object but
|
|
// will not traverse into the svg subtree at all since the DIV#grandparent's render object is
|
|
// not marked as needing layout.
|
|
document.body.offsetWidth;
|
|
// This goes into the void since the RenderSVGRoot is already marked as needsLayout but there is no
|
|
// layout pending.
|
|
greenRect.setAttribute("x", "50%");
|
|
}
|
|
</script>
|
|
</body>
|
|
|