<!DOCTYPE HTML>
<html>
<head>
  <title>Test for OOP Blobs in MessageManager</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.7">
    "use strict";

    SimpleTest.waitForExplicitFinish();

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

    function childFrameScript() {
      "use strict";

      addMessageListener("test:ipcClonedMessage", function(message) {
        if (!(message.json instanceof Components.interfaces.nsIDOMBlob)) {
          sendAsyncMessage(message.name, message.json);
          return;
        }

        let reader = new FileReader();
        reader.addEventListener("load", function() {
          let response = reader.result == "this is a great success!" ?
                         message.json :
                         "error";
          sendAsyncMessage(message.name, response);
        });
        reader.readAsText(message.json);
      });
    }

    function runTests() {
      function done() {
        SpecialPowers.removePermission("browser", document);
        SimpleTest.finish();
      }

      ok("Browser prefs set.");

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

      iframe.addEventListener("mozbrowserloadend", function() {
        ok(true, "Got iframe load event.");

        const blobString = "this is a great success!";

        const messages = [
          "hi!",
          "",
          2,
          -.04,
          3432987324987239872948732982,
          true,
          false,
          null,
          0,

          // Make sure this one is always last.
          new Blob(["this ", "is ", "a ", "great ", "success!"],
                   {"type" : "text\/plain"}),
        ];
        let receivedMessageIndex = 0;

        let mm = SpecialPowers.getBrowserFrameMessageManager(iframe);
        mm.addMessageListener("test:ipcClonedMessage", function(message) {
          let data = message.json;

          if (data instanceof Blob) {
            is(receivedMessageIndex, messages.length - 1, "Blob is last");
            is (data.size,
                messages[receivedMessageIndex].size,
                "Correct blob size");
            is (data.type,
                messages[receivedMessageIndex].type,
                "Correct blob type");

            let result1, result2;

            let reader1 = new FileReader();
            reader1.onload = function() {
              result1 = reader1.result == blobString ? reader1.result : "bad1";
              if (result2) {
                is(result1, result2, "Same results");
                done();
              }
            };

            let reader2 = new FileReader();
            reader2.onload = function() {
              result2 = reader2.result == blobString ? reader2.result : "bad2";
              if (result1) {
                is(result1, result2, "Same results");
                done();
              }
            };

            reader1.readAsText(data);
            reader2.readAsText(messages[receivedMessageIndex]);
            return;
          }

          is(message.json,
             messages[receivedMessageIndex++],
             "Got correct round-tripped response");
        });
        mm.loadFrameScript("data:,(" + childFrameScript.toString() + ")();",
                           false);

        for (let message of messages) {
          mm.sendAsyncMessage("test:ipcClonedMessage", message);
        }
      });

      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],
          ["network.disable.ipc.security", true],
          ["browser.pagethumbnails.capturing_disabled", true]
        ]
      }, runTests);
    });
  </script>
</body>
</html>