<!DOCTYPE html>
<html>
  <!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1339722
-->
  <head>
    <meta charset="utf-8" />
    <title>Test for Bug 1339722</title>
    <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
    <link rel="stylesheet" type="text/css" href="chrome://global/skin" />
    <link
      rel="stylesheet"
      type="text/css"
      href="chrome://mochikit/content/tests/SimpleTest/test.css"
    />
    <script type="application/javascript">
      /**
       * Test for Bug 1339722
       * 1. Wait for "http-on-modify-request" or document-on-modify-request for the
       *    iframe load.
       * 2. In the observer, access it's window proxy to trigger DOMWindowCreated.
       * 3. In the event handler, delete the iframe so that the frameloader would be
       *    destroyed in the middle of ReallyStartLoading.
       * 4. Verify that it doesn't crash.
       **/

      // This topic used to be http-on-useragent-request, but that got removed in
      // bug 1513574. on-modify-request is called around the same time, and should
      // behave similarly.
      const TOPIC = "document-on-modify-request";
      let win;
      const observe = (subject, topic, data) => {
        info("Got " + topic);
        Services.obs.removeObserver(observe, TOPIC);

        // Query window proxy so it triggers DOMWindowCreated.
        let channel;
        try {
          // We need to QI nsIHttpChannel in order to load the interface's
          // methods / attributes for later code that could assume we are dealing
          // with a nsIHttpChannel.
          channel = subject.QueryInterface(Ci.nsIHttpChannel);
        } catch (e) {
          channel = subject.QueryInterface(Ci.nsIIdentChannel);
        }
        win = channel.notificationCallbacks.getInterface(Ci.mozIDOMWindowProxy);
      };

      Services.obs.addObserver(observe, TOPIC);

      let docShell = SpecialPowers.wrap(window).docShell;
      docShell.chromeEventHandler.addEventListener(
        "DOMWindowCreated",
        function handler(e) {
          info("Got DOMWindowCreated");
          let iframe = document.getElementById("testFrame");
          is(e.target, iframe.contentDocument, "verify event target");

          // Remove the iframe to cause frameloader destroy.
          iframe.remove();
          setTimeout($ => {
            ok(!document.getElementById("testFrame"), "verify iframe removed");
            SimpleTest.finish();
          }, 0);
        },
        { once: true }
      );

      SimpleTest.waitForExplicitFinish();
    </script>
  </head>
  <body>
    <a
      target="_blank"
      href="https://bugzilla.mozilla.org/show_bug.cgi?id=1339722"
      >Mozilla Bug 1339722</a
    >
    <p id="display"></p>
    <div id="content" style="display: none;"></div>
    <pre id="test">
  <div id="frameContainer">
    <iframe id="testFrame" src="http://www.example.com"></iframe>
  </div>
</pre>
  </body>
</html>
