<html>
<body>
<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=11694">bug 11694</a>:
XSLT output method does not default to HTML when the target document is HTML.</p>
<div id="result">Should be green: </div>
<div id="result2">Should be black: </div>

<script>
if (window.layoutTestController)
    layoutTestController.dumpAsText();

var xsl = (new DOMParser()).parseFromString('<?xml version="1.0" encoding="ISO-8859-1"?>'+
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'+
'<xsl:template match="doc">'+
'<span style="color:green">result.</span>'+
'</xsl:template>'+
'</xsl:stylesheet>', 'application/xml');

var xsl2 = (new DOMParser()).parseFromString('<?xml version="1.0" encoding="ISO-8859-1"?>'+
'<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">'+
'<xsl:output method="xml"/>'+
'<xsl:template match="doc">'+
'<span style="color:green">result.</span>'+
'</xsl:template>'+
'</xsl:stylesheet>', 'application/xml');

var xml = (new DOMParser()).parseFromString('<?xml version="1.0" encoding="ISO-8859-1"?>'+
'<doc/>', 'application/xml');

var processor = new XSLTProcessor();
processor.importStylesheet(xsl);
var result = processor.transformToFragment(xml, document);

document.getElementById("result").appendChild(result);

// The HTML default shouldn't override an explicitly specified method.
var processor = new XSLTProcessor();
processor.importStylesheet(xsl2);
result2 = processor.transformToFragment(xml, document);

document.getElementById("result2").appendChild(result2);

if (document.getElementById("result").childNodes[1].style.color == "green" && 
      !document.getElementById("result2").childNodes[1].style)
    document.write("<p>SUCCESS</p>");
</script>
</body>
</html>
