/*
 * Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * after /LayoutTests/fast/xsl/default-html.html
 * @description 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
 */
import "dart:html";
import "../../../Utils/expect.dart";

const String htmlEL = r'''
<div id="result">Should be green: </div>
<div id="result2">Should be black: </div>
''';

main() {
    document.body.appendHtml(htmlEL, treeSanitizer: NodeTreeSanitizer.trusted);

    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").append(result);
    
    // The HTML default shouldn't override an explicitly specified method.
    processor = new XsltProcessor();
    processor.importStylesheet(xsl2);
    var result2 = processor.transformToFragment(xml, document);
    document.getElementById("result2").append(result2);

    Expect.equals("green", (document.getElementById("result").childNodes[1] as Element).style.color);
    Expect.isNotNull((document.getElementById("result2").childNodes[1] as Element).style);
}

