<!DOCTYPE HTML>
<html>
<head>
  <title>Test for registering/unregistering chrome OOP</title>
  <script type="application/javascript"
          src="/tests/SimpleTest/SimpleTest.js">
  </script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>

  <script type="application/javascript;version=1.8">
    "use strict";

    SimpleTest.waitForExplicitFinish();

    const childFrameURL =
      "data:text/html,<!DOCTYPE HTML><html><body></body></html>";

    function childFrameScript() {
      "use strict";

      var ios =
          Components.classes["@mozilla.org/network/io-service;1"]
                    .getService(Components.interfaces.nsIIOService);
      let cr =
          Components.classes["@mozilla.org/chrome/chrome-registry;1"]
                    .getService(Ci.nsIXULChromeRegistry);
      addMessageListener("test687194:resolveChromeURI", function(message) {
        let result;
        let threw = false;
        try {
            let uri = ios.newURI(message.data.URI, null, null);
            result = cr.convertChromeURL(uri).spec;
        } catch (e) {
            threw = true;
            result = "EXCEPTION: " + e;
        }

        message.target.sendAsyncMessage("test687194:resolveChromeURI:Answer",
                                        { threw: threw, result: result });
      });
    }

    let test;
    function* testStructure(mm) {
      let lastResult;

      mm.addMessageListener("test687194:resolveChromeURI:Answer", function(msg) {
        test.next(msg.data);
      });

      mm.sendAsyncMessage("test687194:resolveChromeURI",
                          { URI: "chrome://bug687194/content/e10sbug.js" });
      lastResult = yield;
      is(lastResult.threw, true, "URI shouldn't resolve to begin with");

      let { AddonManager } = SpecialPowers.Cu.import("resource://gre/modules/AddonManager.jsm", {});
      const INSTALL_URI =
        "http://mochi.test:8888/tests/toolkit/mozapps/extensions/test/mochitest/file_bug687194.xpi"
      AddonManager.getInstallForURL(INSTALL_URI, (install) => {
        install = SpecialPowers.wrap(install);
        install.addListener(SpecialPowers.wrapCallbackObject({
          onInstallEnded: function(install, addon) {
            SimpleTest.executeSoon(() => test.next(addon));
          }
        }));
        install.install();
      }, "application/x-xpinstall");

      let addon = SpecialPowers.wrap(yield);

      mm.sendAsyncMessage("test687194:resolveChromeURI",
                          { URI: "chrome://bug687194/content/e10sbug.js" });
      lastResult = yield;
      is(lastResult.threw, false, "able to resolve after the installation");

      let listener = SpecialPowers.wrapCallbackObject({
        onUninstalled: function(removedAddon) {
          if (removedAddon.id === addon.id) {
            AddonManager.removeAddonListener(listener);
            SimpleTest.executeSoon(() => test.next());
          }
        }
      });
      AddonManager.addAddonListener(listener);
      addon.uninstall();

      yield;

      mm.sendAsyncMessage("test687194:resolveChromeURI",
                          { URI: "chrome://bug687194/content/e10sbug.js" });
      lastResult = yield;
      is(lastResult.threw, true, "should have unregistered the URI");
      SimpleTest.finish();
    }

    function runTests() {
      info("Browser prefs set.");

      let iframe = document.createElement("iframe");
      SpecialPowers.wrap(iframe).mozbrowser = true;
      iframe.id = "iframe";
      iframe.src = childFrameURL;

      iframe.addEventListener("mozbrowserloadend", function() {
        info("Got iframe load event.");
        let mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
        mm.loadFrameScript("data:,(" + childFrameScript.toString() + ")();",
                           false);

        test = testStructure(mm);
        test.next();
      });

      document.body.appendChild(iframe);
    }

    addEventListener("load", function() {
      info("Got load event.");

      SpecialPowers.addPermission("browser", true, document);
      SpecialPowers.pushPrefEnv({
        "set": [
          ["dom.ipc.browser_frames.oop_by_default", true],
          ["dom.mozBrowserFramesEnabled", true],
          ["browser.pagethumbnails.capturing_disabled", true]
        ]
      }, runTests);
    });
  </script>
</body>
</html>