<!DOCTYPE HTML>
<html>
<head>
  <title>insertAdjacentHTML in HTML</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script src="insert_adjacent_html.js"></script>
</head>
<body>
<p id="display"></p><div id="content" style="display: none"></div><div id="content2" style="display: none"></div>
<script>
var script_ran = false;

function testPositions(node, testDesc) {
  test(function() {
    script_ran = false;
    node.insertAdjacentHTML("beforeBegin", "\u003Cscript>script_ran = true;\u003C/script><i></i>");
    assert_equals(node.previousSibling.localName, "i", "Should have had <i> as previous sibling");
    assert_equals(node.previousSibling.previousSibling.localName, "script", "Should have had <script> as second previous child");
    assert_false(script_ran, "script should not have run");
  }, "beforeBegin " + node.id + " " + testDesc)

  test(function() {
    script_ran = false;
    node.insertAdjacentHTML("Afterbegin", "<b></b>\u003Cscript>script_ran = true;\u003C/script>");
    assert_equals(node.firstChild.localName, "b", "Should have had <b> as first child");
    assert_equals(node.firstChild.nextSibling.localName, "script", "Should have had <script> as second child");
    assert_false(script_ran, "script should not have run");
  }, "Afterbegin " + node.id + " " + testDesc);

  test(function() {
    script_ran = false;
    node.insertAdjacentHTML("BeforeEnd", "\u003Cscript>script_ran = true;\u003C/script><u></u>");
    assert_equals(node.lastChild.localName, "u", "Should have had <u> as last child");
    assert_equals(node.lastChild.previousSibling.localName, "script", "Should have had <script> as penultimate child");
    assert_false(script_ran, "script should not have run");
  }, "BeforeEnd " + node.id + " " + testDesc)

  test(function() {
    script_ran = false;
    node.insertAdjacentHTML("afterend", "<a></a>\u003Cscript>script_ran = true;\u003C/script>");
    assert_equals(node.nextSibling.localName, "a", "Should have had <a> as next sibling");
    assert_equals(node.nextSibling.nextSibling.localName, "script", "Should have had <script> as second next sibling");
    assert_false(script_ran, "script should not have run");
  }, "afterend " + node.id + " " + testDesc)
}

var content = document.getElementById("content");
testPositions(content, "without next sibling");
testPositions(content, "again, with next sibling");

test(function() {
  assert_throws_dom("SYNTAX_ERR", function() {content.insertAdjacentHTML("bar", "foo")});
  assert_throws_dom("SYNTAX_ERR", function() {content.insertAdjacentHTML("beforebegİn", "foo")});
  assert_throws_dom("SYNTAX_ERR", function() {content.insertAdjacentHTML("beforebegın", "foo")});
}, "Should throw when inserting with invalid position string");

var parentElement = document.createElement("div");
var child = document.createElement("div");
child.id = "child";

testThrowingNoParent(child, "null");
testThrowingNoParent(document.documentElement, "a document");

test(function() {
  child.insertAdjacentHTML("afterBegin", "foo");
  child.insertAdjacentHTML("beforeend", "bar");
  assert_equals(child.textContent, "foobar");
  parentElement.appendChild(child);
}, "Inserting after being and before end should order things correctly");

testPositions(child, "node not in tree but has parent");

test(function() {
  script_ran = false;
  content.appendChild(parentElement); // must not run scripts
  assert_false(script_ran, "script should not have run");
}, "Should not run script when appending things which have descendant <script> inserted via insertAdjacentHTML");

var content2 = document.getElementById("content2");
testPositions(content2, "without next sibling");
testPositions(content2, "test again, now that there's a next sibling");

// HTML only
test(function() {
  document.body.insertAdjacentHTML("afterend", "<p>");
  document.head.insertAdjacentHTML("beforebegin", "<p>");
  assert_equals(document.getElementsByTagName("head").length, 1, "Should still have one head");
  assert_equals(document.getElementsByTagName("body").length, 1, "Should still have one body");
}, "Inserting kids of the <html> element should not do weird things with implied <body>/<head> tags")
</script>
<div id="log"></div>
</body>
</html>
