<!DOCTYPE HTML>
<meta charset=utf-8>
<title>MutationObservers: takeRecords</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="mutationobservers.js"></script>
<h1>MutationObservers: document mutations</h1>
<div id="log"></div>

<script id='s001'>
  var setupTest = async_test("setup test");
  var insertionTest = async_test("parser insertion mutations");
  var insertionTest2 = async_test("parser script insertion mutation");
  var testCounter = 0;

  function masterMO(sequence, obs) {
    testCounter++;
    if (testCounter == 1) {
      insertionTest.step(
        function () {
          checkRecords(document, sequence,
                       [{type: "childList",
                         addedNodes: function () {
                           return [ document.getElementById("n00") ];
                         },
                         previousSibling: function () {
                           return document.getElementById("s001");
                         },
                         target: document.body},
                        {type: "childList",
                         addedNodes: function () {
                           return [ document.getElementById("s002") ];
                         },
                         previousSibling: function () {
                           return document.getElementById("n00");
                         },
                         target: document.body},
                        {type: "childList",
                         addedNodes: function () {
                           return [ document.getElementById("s002").firstChild ];
                         },
                         target: function () {
                           return document.getElementById("s002");
                         }}]);
        });
    } else if (testCounter == 2) {
      insertionTest2.step(
        function () {
          checkRecords(document, sequence,
                       [{type: "childList",
                         addedNodes: function () {
                           return [ document.getElementById("inserted_element") ];
                         },
                         previousSibling: function () {
                           return document.getElementById("s002");
                         },
                         target: document.body},
                        {type: "childList",
                         addedNodes: function () {
                           return [ document.getElementById("inserted_script") ];
                         },
                         target: function () {
                          return document.getElementById("n00");
                         }}
                        ]);
        });
    }
  }
  var document_observer;
  var newElement;
  setupTest.step(function() {
    document_observer = new MutationObserver(masterMO);
    newElement = document.createElement("span");
    document_observer.observe(document, {subtree:true,childList:true});
    newElement.id = "inserted_element";
    newElement.setAttribute("style", "display: none");
    newElement.textContent = "my new span for n00";
  });
</script><p id='n00'></p><script id='s002'>
  var newScript = document.createElement("script");
  setupTest.step(function() {
    newScript.textContent = "document.body.appendChild(newElement);";
    newScript.id = "inserted_script";
    document.getElementById("n00").appendChild(newScript);
  });
  if (testCounter < 1) {
    insertionTest.step(
      function () {
        assert_unreached("document observer did not trigger");
      });
  }
</script><script id='s003'>
  setupTest.step(function() {
    document_observer.disconnect();
  });
  if (testCounter < 2) {
    insertionTest2.step(
      function () {
        assert_unreached("document observer did not trigger");
      });
  }
  insertionTest.done();
  insertionTest2.done();
</script>

<p id='n012'></p><div id='d01'>
<script id='s011'>
  var removalTest = async_test("removal of parent during parsing");
  var d01 = document.getElementById("d01");
  testCounter = 0;

  function removalMO(sequence, obs) {
    testCounter++;
    if (testCounter == 1) {
      removalTest.step(
        function () {
          checkRecords(document, sequence,
                       [{type: "childList",
                         removedNodes: function () {
                           return [ d01 ];
                         },
                         previousSibling: function () {
                           return document.getElementById("n012");
                         },
                         target: document.body}]);
        });
    } else if (testCounter == 2) {
      removalTest.step(
        function () {
          checkRecords(document, sequence,
                       [{type: "childList",
                         addedNodes: function () {
                           return [ document.getElementById("s012") ];
                         },
                         previousSibling: function () {
                           return document.getElementById("n012");
                         },
                         target: document.body},
                        {type: "childList",
                          addedNodes: function () {
                            return [ document.getElementById("s012").firstChild ];
                          },
                          target: function () {
                            return document.getElementById("s012");
                          }}]);
        });
    }
  }
  var document2_observer;
  setupTest.step(function() {
    document2_observer = new MutationObserver(removalMO);
    document2_observer.observe(document, {subtree:true,childList:true});
    d01.parentNode.removeChild(d01);
  });
</script><p id='n01'></p></div><script id='s012'>
  setupTest.step(function() {
    document2_observer.disconnect();
  });
  if (testCounter < 2) {
    removalTest.step(
      function () {
        assert_unreached("document observer did not trigger");
      });
  }
  removalTest.done();
  setupTest.done();
</script>
