<!doctype html>
<title>createContextualFragment() tests</title>
<div id=log></div>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
// We are not testing XML documents here, because apparently it's not clear
// what we want to happen there.  We also aren't testing the HTML parser in any
// depth, just some basic sanity checks.

// Exception-throwing
test(function() {
        var range = document.createRange();
        range.detach();
        range.createContextualFragment("");
}, "Must not throw INVALID_STATE_ERR for a detached node.");

test(function() {
        var range = document.createRange();
        assert_throws(new TypeError(), function() {
                range.createContextualFragment();
        });
}, "Must throw TypeError when calling without arguments");

test(function() {
        // Simple test
        var range = document.createRange();
        range.selectNodeContents(document.body);

        var fragment = "<p CLaSs=testclass> Hi! <p>Hi!";
        var expected = document.createDocumentFragment();
        var tmpNode = document.createElement("p");
        tmpNode.setAttribute("class", "testclass");
        tmpNode.appendChild(document.createTextNode(" Hi! "));
        expected.appendChild(tmpNode);

        tmpNode = document.createElement("p");
        tmpNode.appendChild(document.createTextNode("Hi!"));
        expected.appendChild(tmpNode);

        var result = range.createContextualFragment(fragment);
        assert_true(expected.isEqualNode(result),
                "Unexpected result (collapsed Range)");

        // Token test that the end node makes no difference
        range.setEnd(document.body.getElementsByTagName("script")[0], 0);
        result = range.createContextualFragment(fragment);
        assert_true(expected.isEqualNode(result),
                "Unexpected result (Range ends in <script>)");
}, "Simple test with paragraphs");

test(function() {
        // This test based on https://bugzilla.mozilla.org/show_bug.cgi?id=585819,
        // from a real-world compat bug
        var range = document.createRange();
        range.selectNodeContents(document.documentElement);
        var fragment = "<span>Hello world</span>";
        var expected = document.createDocumentFragment();
        var tmpNode = document.createElement("span");
        tmpNode.appendChild(document.createTextNode("Hello world"));
        expected.appendChild(tmpNode);

        var result = range.createContextualFragment(fragment);
        assert_true(expected.isEqualNode(result),
                "Unexpected result (collapsed Range)");

        // Another token test that the end node makes no difference
        range.setEnd(document.head, 0);
        result = range.createContextualFragment(fragment);
        assert_true(expected.isEqualNode(result),
                "Unexpected result (Range ends in <head>)");
}, "Don't auto-create <body> when applied to <html>");

// Scripts should be run if inserted (that's what the "Unmark all scripts
// . . ." line means, I'm told)
var passed = false;
test(function() {
        assert_false(passed, "Sanity check");
        var range = document.createRange();
        range.selectNodeContents(document.documentElement);
        var fragment = range.createContextualFragment("<script>passed = true</s" + "cript>");
        assert_false(passed, "Fragment created but not yet added to document, should not have run");
        document.body.appendChild(fragment);
        assert_true(passed, "Fragment created and added to document, should run");
}, "<script>s should be run when appended to the document (but not before)");

// Historical bugs in browsers; see https://github.com/whatwg/html/issues/2222

[
        // Void
        "area",
        "base",
        "basefont",
        "bgsound",
        "br",
        "col",
        "embed",
        "frame",
        "hr",
        "img",
        "input",
        "keygen",
        "link",
        "meta",
        "param",
        "source",
        "track",
        "wbr",

        // Historical
        "menuitem",
        "image"
].forEach(name => {
        test(() => {
                const range = document.createRange();
                const contextNode = document.createElement(name);
                const selectedNode = document.createElement("div");
                contextNode.appendChild(selectedNode);
                range.selectNode(selectedNode);

                range.createContextualFragment("some text");
        }, `createContextualFragment should work even when the context is <${name}>`);
});


// Now that we've established basic sanity, let's do equivalence tests.  Those
// are easier to write anyway.
function testEquivalence(element1, fragment1, element2, fragment2) {
        var range1 = element1.ownerDocument.createRange();
        range1.selectNodeContents(element1);
        var range2 = element2.ownerDocument.createRange();
        range2.selectNodeContents(element2);

        var result1 = range1.createContextualFragment(fragment1);
        var result2 = range2.createContextualFragment(fragment2);

        assert_true(result1.isEqualNode(result2), "Results are supposed to be equivalent");

        // Throw in partial ownerDocument tests on the side, since the algorithm
        // does specify that and we don't want to completely not test it.
        if (result1.firstChild != null) {
                assert_equals(result1.firstChild.ownerDocument, element1.ownerDocument,
                        "ownerDocument must be set to that of the reference node");
        }
        if (result2.firstChild != null) {
                assert_equals(result2.firstChild.ownerDocument, element2.ownerDocument,
                        "ownerDocument must be set to that of the reference node");
        }
}

var doc_fragment = document.createDocumentFragment();
var comment = document.createComment("~o~");
doc_fragment.appendChild(comment);

var tests = [
        ["<html> and <body> must work the same, 1", document.documentElement, "<span>Hello world</span>", document.body, "<span>Hello world</span>"],
        ["<html> and <body> must work the same, 2", document.documentElement, "<body><p>Hello world", document.body, "<body><p>Hello world"],
        ["Implicit <body> creation", document.documentElement, "<body><p>", document.documentElement, "<p>"],
        ["Namespace generally shouldn't matter",
                document.createElementNS("http://fake-namespace", "div"), "<body><p><span>Foo",
                document.createElement("div"), "<body><p><span>Foo"],
        ["<html> in a different namespace shouldn't be special",
                document.createElementNS("http://fake-namespace", "html"), "<body><p>",
                document.createElement("div"), "<body><p>"],
        ["SVG namespace shouldn't be special",
                document.createElementNS("http://www.w3.org/2000/svg", "div"), "<body><p>",
                document.createElement("div"), "<body><p>"],
        ["null should be stringified", document.createElement("span"), null, document.createElement("span"), "null"],
        ["undefined should be stringified", document.createElement("span"), undefined, document.createElement("span"), "undefined"],
        ["Text nodes shouldn't be special",
                document.createTextNode("?"), "<body><p>",
                document.createElement("div"), "<body><p>"],
        ["Non-Element parent should not be special",
                comment, "<body><p>",
                document.createElement("div"), "<body><p>"]
];

generate_tests(testEquivalence, tests);
</script>
