Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- Manifest: dom/base/test/chrome/chrome.toml
<!DOCTYPE html>
<html>
  <!--
-->
  <head>
    <meta charset="utf-8" />
    <link
      rel="stylesheet"
      type="text/css"
    />
    <script type="application/javascript">
      /**
       * 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
      // behave similarly.
      const TOPIC = "document-on-modify-request";
      let win;
      const observe = (subject, topic) => {
        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"
    >
    <p id="display"></p>
    <div id="content" style="display: none;"></div>
    <pre id="test">
  <div id="frameContainer">
  </div>
</pre>
  </body>
</html>