<!DOCTYPE html>
<html>
<head>
  <title>Stale state testing</title>
  <link rel="stylesheet" type="text/css"
        href="chrome://mochikit/content/tests/SimpleTest/test.css" />

  <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>

  <script type="application/javascript"
          src="../common.js"></script>
  <script type="application/javascript"
          src="../role.js"></script>
  <script type="application/javascript"
          src="../states.js"></script>
  <script type="application/javascript"
          src="../events.js"></script>

  <script type="application/javascript">
    function addChild(aContainerID) {
      this.containerNode = getNode(aContainerID);
      this.childNode = null;

      this.eventSeq = [
        new invokerChecker(EVENT_REORDER, this.containerNode),
      ];

      this.invoke = function addChild_invoke() {
        this.childNode = document.createElement("div");
        // Note after bug 646216, a sole div without text won't be accessible
        // and would not result in an embedded character.
        // Therefore, add some text.
        this.childNode.textContent = "hello";
        this.containerNode.appendChild(this.childNode);
      };

      this.finalCheck = function addChild_finalCheck() {
        // no stale state should be set
        testStates(this.childNode, 0, 0, 0, EXT_STATE_STALE);
      };

      this.getID = function addChild_getID() {
        return "add child for " + prettyName(aContainerID);
      };
    }

    function removeChildChecker(aInvoker) {
      this.type = EVENT_HIDE;
      this.__defineGetter__("target", function() { return aInvoker.child; });

      this.check = function removeChildChecker_check() {
        // stale state should be set
        testStates(aInvoker.child, 0, EXT_STATE_STALE);
      };
    }

    function removeChild(aContainerID) {
      this.containerNode = getNode(aContainerID);
      this.child = null;

      this.eventSeq = [
        new removeChildChecker(this),
      ];

      this.invoke = function removeChild_invoke() {
        var childNode = this.containerNode.firstChild;
        this.child = getAccessible(childNode);

        this.containerNode.removeChild(childNode);
      };

      this.getID = function removeChild_getID() {
        return "remove child from " + prettyName(aContainerID);
      };
    }

    // gA11yEventDumpToConsole = true; //debugging

    var gQueue = null;
    function doTest() {
      gQueue = new eventQueue();

      gQueue.push(new addChild("container"));
      gQueue.push(new removeChild("container"));

      gQueue.invoke(); // will call SimpleTest.finish()
    }

    SimpleTest.waitForExplicitFinish();
    addA11yLoadEvent(doTest);
  </script>
</head>

<body role="">

  <a target="_blank"
     title="Expose stale state on accessibles unattached from tree"
     href="https://bugzilla.mozilla.org/show_bug.cgi?id=676267">Mozilla Bug 676267</a>

  <p id="display"></p>
  <div id="content" style="display: none"></div>
  <pre id="test">
  </pre>

  <div id="container"></div>

</body>
</html>