blob: b053b48b691f6e74eb7a4f372133cf6b532275ca [file] [log] [blame]
<!DOCTYPE html>
<script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
window.onload = function() {
testRunner.layoutAndPaintAsyncThen(function() {
mutateTree();
testRunner.layoutAndPaintAsyncThen(function() {
testRunner.notifyDone();
});
});
};
} else {
window.onload = function() { setTimeout(mutateTree, 100); };
}
const svgNs = 'http://www.w3.org/2000/svg';
function buildPattern(patternId, refId) {
var pattern = document.createElementNS(svgNs, 'pattern');
var rect = pattern.appendChild(document.createElementNS(svgNs, 'rect'));
pattern.setAttribute('id', patternId);
pattern.setAttribute('width', 1);
pattern.setAttribute('height', 1);
rect.setAttribute('width', 100);
rect.setAttribute('height', 100);
rect.setAttribute('fill', 'url(#' + refId + ')');
return pattern;
}
function mutateTree() {
// Get reference to rect in pattern#p2 before inserting the pattern.
var p2rect = document.getElementsByTagName('rect')[1];
// Add a pattern#p3 and a reference to it from pattern#p2 to form a cycle.
var defs = document.querySelector('defs');
defs.appendChild(buildPattern('p3', 'p1'));
p2rect.setAttribute('fill', 'url(#p3)');
}
</script>
<p>PASS if no crash (stack overflow).</p>
<svg width="100" height="100">
<rect width="100" height="100" fill="url(#p1)"/>
<defs>
<pattern id="p2" width="1" height="1">
<rect width="100" height="100"/>
</pattern>
<pattern id="p1" width="1" height="1">
<rect fill="url(#p2)" width="100" height="100"/>
</pattern>
</defs>
</svg>