<!DOCTYPE html>
<title>innerText setter test</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="container"></div>
<script>
// As of March 2017, WebKit and Blink have inconsistent results depending on
// rendered or not.  setupTest() tests a rendered case, and setupTestDetached()
// tests a not-rendered case.

function setupTest(context, plain) {
  var container = document.getElementById("container");
  // context is either a string or an element node
  if (typeof context === "string") {
    container.innerHTML = context;
  } else {
    container.innerHTML = "";
    container.appendChild(context);
  }
  var e = container.firstChild;
  while (e && e.nodeType != Node.ELEMENT_NODE) {
    e = e.nextSibling;
  }
  e.offsetWidth;
  var oldChild = e.firstChild;
  e.innerText = plain;
  return [e, oldChild];
}

function setupTestDetached(context, plain) {
  var detachedContainer = document.createElement("div");
  // context is either a string or an element node
  if (typeof context === "string") {
    detachedContainer.innerHTML = context;
  } else {
    detachedContainer.innerHTML = "";
    detachedContainer.appendChild(context);
  }
  var e = detachedContainer.firstChild;
  while (e && e.nodeType != Node.ELEMENT_NODE) {
    e = e.nextSibling;
  }
  var oldChild = e.firstChild;
  e.innerText = plain;
  return [e, oldChild];
}

function assertNewSingleTextNode(newChild, expectedText, oldChild) {
  assert_not_equals(newChild, null, "Should have a child");
  assert_equals(newChild.nodeType, Node.TEXT_NODE, "Child should be a text node");
  assert_equals(newChild.nextSibling, null, "Should have only one child");
  assert_equals(newChild.data, expectedText);
  assert_not_equals(newChild, oldChild, "Child should be a *new* text node");
}

function assertNoEmptyTextChild(parent) {
  for (var child = parent.firstChild; child; child = child.nextSibling) {
    if (child.nodeType === Node.TEXT_NODE) {
      assert_not_equals(child.data, "", "Should not have empty text nodes");
    }
  }
}

function testText(context, plain, expectedText, msg) {
  test(function(){
    var arr = setupTest(context, plain);
    assertNewSingleTextNode(arr[0].firstChild, expectedText, arr[1]);
  }, msg);
  test(function() {
    var arr = setupTestDetached(context, plain);
    assertNewSingleTextNode(arr[0].firstChild, expectedText, arr[1]);
  }, msg + ", detached");
}

function testHTML(context, plain, expectedHTML, msg) {
  test(function(){
    var e = setupTest(context, plain)[0];
    assert_equals(e.innerHTML, expectedHTML);
    assertNoEmptyTextChild(e);
  }, msg);
  test(function() {
    var e = setupTestDetached(context, plain)[0];
    assert_equals(e.innerHTML, expectedHTML);
    assertNoEmptyTextChild(e);
  }, msg + ", detached");
}
</script>
<script src="setter-tests.js"></script>
