Blame dom/base/test/test_mutationobserver_anonymous.html

Packit f0b94e
Packit f0b94e
<html>
Packit f0b94e
Packit f0b94e
https://bugzilla.mozilla.org/show_bug.cgi?id=1034110
Packit f0b94e
-->
Packit f0b94e
<head>
Packit f0b94e
  <title>Test for Bug 1034110</title>
Packit f0b94e
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
Packit f0b94e
  <script type="application/javascript"  src="/tests/SimpleTest/EventUtils.js"></script>
Packit f0b94e
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
Packit f0b94e
</head>
Packit f0b94e
<body>
Packit f0b94e
Mozilla Bug 1034110
Packit f0b94e
<style type="text/css">
Packit f0b94e
  #pseudo.before::before { content: "before"; }
Packit f0b94e
  #pseudo.after::after { content: "after"; }
Packit f0b94e
</style>
Packit f0b94e
Packit f0b94e
<video id="video"></video>
Packit f0b94e

Packit f0b94e
Packit f0b94e
Packit f0b94e
Packit f0b94e
Packit f0b94e
Packit f0b94e
<script type="application/javascript">
Packit f0b94e
Packit f0b94e
/** Test for Bug 1034110 **/
Packit f0b94e
Packit f0b94e
SimpleTest.waitForExplicitFinish();
Packit f0b94e
Packit f0b94e
function getWalker(node) {
Packit f0b94e
  return SpecialPowers.createDOMWalker(node, true);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function getFirstChild(parent) {
Packit f0b94e
  return SpecialPowers.unwrap(getWalker(parent).firstChild);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function getLastChild(parent) {
Packit f0b94e
  return SpecialPowers.unwrap(getWalker(parent).lastChild);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function assertSamePseudoElement(which, node1, node2) {
Packit f0b94e
  is(SpecialPowers.wrap(node1).nodeName, "_moz_generated_content_" + which,
Packit f0b94e
     "Correct pseudo element type");
Packit f0b94e
  is(node1, node2,
Packit f0b94e
     "Referencing the same ::after element");
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
window.onload = function () {
Packit f0b94e
  testOneAdded();
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
function testOneAdded() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    is(records.length, 1, "Correct number of records");
Packit f0b94e
    is(records[0].type, "nativeAnonymousChildList", "Correct record type");
Packit f0b94e
    is(records[0].target, parent, "Correct target");
Packit f0b94e
Packit f0b94e
    is(records[0].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
Packit f0b94e
    is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testAddedAndRemoved();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, parent, true);
Packit f0b94e
  parent.className = "before";
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testAddedAndRemoved() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  let originalBeforeElement = getFirstChild(parent);
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    is(records.length, 2, "Correct number of records");
Packit f0b94e
    is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
Packit f0b94e
    is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
Packit f0b94e
    is(records[0].target, parent, "Correct target (1)");
Packit f0b94e
    is(records[1].target, parent, "Correct target (2)");
Packit f0b94e
Packit f0b94e
    // Two records are sent - one for removed and one for added.
Packit f0b94e
    is(records[0].addedNodes.length, 0, "Shouldn't have got addedNodes");
Packit f0b94e
    is(records[0].removedNodes.length, 1, "Should have got removedNodes");
Packit f0b94e
    assertSamePseudoElement("before", records[0].removedNodes[0], originalBeforeElement);
Packit f0b94e
Packit f0b94e
    is(records[1].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
Packit f0b94e
    is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testRemoved();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, parent, true);
Packit f0b94e
  parent.className = "after";
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testRemoved() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  let originalAfterElement = getLastChild(parent);
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    is(records.length, 1, "Correct number of records");
Packit f0b94e
    is(records[0].type, "nativeAnonymousChildList", "Correct record type");
Packit f0b94e
    is(records[0].target, parent, "Correct target");
Packit f0b94e
Packit f0b94e
    is(records[0].addedNodes.length, 0, "Shouldn't have got addedNodes");
Packit f0b94e
    is(records[0].removedNodes.length, 1, "Should have got removedNodes");
Packit f0b94e
    assertSamePseudoElement("after", records[0].removedNodes[0], originalAfterElement);
Packit f0b94e
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testMultipleAdded();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, parent, true);
Packit f0b94e
  parent.className = "";
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testMultipleAdded() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    is(records.length, 2, "Correct number of records");
Packit f0b94e
    is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
Packit f0b94e
    is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
Packit f0b94e
    is(records[0].target, parent, "Correct target (1)");
Packit f0b94e
    is(records[1].target, parent, "Correct target (2)");
Packit f0b94e
Packit f0b94e
    is(records[0].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
Packit f0b94e
    is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    is(records[1].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
Packit f0b94e
    is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testRemovedDueToDisplay();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, parent, true);
Packit f0b94e
  parent.className = "before after";
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testRemovedDueToDisplay() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  let originalBeforeElement = getFirstChild(parent);
Packit f0b94e
  let originalAfterElement = getLastChild(parent);
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    is(records.length, 2, "Correct number of records");
Packit f0b94e
    is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
Packit f0b94e
    is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
Packit f0b94e
    is(records[0].target, parent, "Correct target (1)");
Packit f0b94e
    is(records[1].target, parent, "Correct target (2)");
Packit f0b94e
Packit f0b94e
    is(records[0].addedNodes.length, 0, "Shouldn't have got addedNodes");
Packit f0b94e
    is(records[0].removedNodes.length, 1, "Should have got removedNodes");
Packit f0b94e
    assertSamePseudoElement("after", records[0].removedNodes[0], originalAfterElement);
Packit f0b94e
Packit f0b94e
    is(records[1].addedNodes.length, 0, "Shouldn't have got addedNodes");
Packit f0b94e
    is(records[1].removedNodes.length, 1, "Should have got removedNodes");
Packit f0b94e
    assertSamePseudoElement("before", records[1].removedNodes[0], originalBeforeElement);
Packit f0b94e
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testAddedDueToDisplay();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, parent, true);
Packit f0b94e
  parent.style.display = "none";
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testAddedDueToDisplay() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    is(records.length, 2, "Correct number of records");
Packit f0b94e
    is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
Packit f0b94e
    is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
Packit f0b94e
    is(records[0].target, parent, "Correct target (1)");
Packit f0b94e
    is(records[1].target, parent, "Correct target (2)");
Packit f0b94e
Packit f0b94e
    is(records[0].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
Packit f0b94e
    is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    is(records[1].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
Packit f0b94e
    is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testDifferentTargetNoSubtree();
Packit f0b94e
  });
Packit f0b94e
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, parent, true);
Packit f0b94e
  parent.style.display = "block";
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testDifferentTargetNoSubtree() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    ok(false,
Packit f0b94e
       "No mutation should fire when observing on a parent without subtree option.");
Packit f0b94e
  });
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, document, true);
Packit f0b94e
  parent.style.display = "none";
Packit f0b94e
Packit f0b94e
  // Wait for the actual mutation to come through, making sure that
Packit f0b94e
  // the original observer never fires.
Packit f0b94e
  var m2 = new MutationObserver(function(records, observer) {
Packit f0b94e
    ok(!getFirstChild(parent), "Pseudo element has been removed, but no mutation");
Packit f0b94e
    ok(!getLastChild(parent), "Pseudo element has been removed, but no mutation");
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testSubtree();
Packit f0b94e
  });
Packit f0b94e
  SpecialPowers.observeMutationEvents(m2, parent, true);
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testSubtree() {
Packit f0b94e
  let parent = document.getElementById("pseudo");
Packit f0b94e
  var m = new MutationObserver(function(records, observer) {
Packit f0b94e
    is(records.length, 2, "Correct number of records");
Packit f0b94e
    is(records[0].type, "nativeAnonymousChildList", "Correct record type (1)");
Packit f0b94e
    is(records[1].type, "nativeAnonymousChildList", "Correct record type (2)");
Packit f0b94e
    is(records[0].target, parent, "Correct target (1)");
Packit f0b94e
    is(records[1].target, parent, "Correct target (2)");
Packit f0b94e
Packit f0b94e
    is(records[0].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("before", records[0].addedNodes[0], getFirstChild(parent));
Packit f0b94e
    is(records[0].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    is(records[1].addedNodes.length, 1, "Should have got addedNodes");
Packit f0b94e
    assertSamePseudoElement("after", records[1].addedNodes[0], getLastChild(parent));
Packit f0b94e
    is(records[1].removedNodes.length, 0, "Shouldn't have got removedNodes");
Packit f0b94e
Packit f0b94e
    observer.disconnect();
Packit f0b94e
    testDictionaryWithoutChromePriv();
Packit f0b94e
  });
Packit f0b94e
  SpecialPowers.observeMutationEvents(m, document, true, true);
Packit f0b94e
  parent.style.display = "block";
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
function testDictionaryWithoutChromePriv()
Packit f0b94e
{
Packit f0b94e
  var m = new MutationObserver(function() {});
Packit f0b94e
  try {
Packit f0b94e
    m.observe(document, { childList: true, get nativeAnonymousChildList() { throw "Foo1"; } } );
Packit f0b94e
    ok(true, "Shouldn't throw!");
Packit f0b94e
  } catch(ex) {
Packit f0b94e
    ok(false, "Did throw " + ex);
Packit f0b94e
  }
Packit f0b94e
Packit f0b94e
  try {
Packit f0b94e
    m.observe(document, { childList: true, get animations() { throw "Foo2"; } } );
Packit f0b94e
    ok(true, "Shouldn't throw!");
Packit f0b94e
  } catch(ex) {
Packit f0b94e
    ok(false, "Did throw " + ex);
Packit f0b94e
  }
Packit f0b94e
  
Packit f0b94e
  SimpleTest.finish();
Packit f0b94e
}
Packit f0b94e
Packit f0b94e
</script>
Packit f0b94e
Packit f0b94e
</body>
Packit f0b94e
</html>