"use strict";

var gScript = SpecialPowers.loadChromeScript(SimpleTest.getTestFileURL("PresentationSessionChromeScript.js"));
var receiverUrl = SimpleTest.getTestFileURL("file_presentation_receiver_auxiliary_navigation.html");

var obs = SpecialPowers.Cc["@mozilla.org/observer-service;1"]
          .getService(SpecialPowers.Ci.nsIObserverService);

function setup() {
  return new Promise(function(aResolve, aReject) {
    gScript.sendAsyncMessage("trigger-device-add");

    var iframe = document.createElement("iframe");
    iframe.setAttribute("mozbrowser", "true");
    iframe.setAttribute("mozpresentation", receiverUrl);
    var oop = !location.pathname.includes('_inproc');
    iframe.setAttribute("remote", oop);
    iframe.setAttribute("src", receiverUrl);

    // This event is triggered when the iframe calls "postMessage".
    iframe.addEventListener("mozbrowsershowmodalprompt", function listener(aEvent) {
      var message = aEvent.detail.message;
      if (/^OK /.exec(message)) {
        ok(true, "Message from iframe: " + message);
      } else if (/^KO /.exec(message)) {
        ok(false, "Message from iframe: " + message);
      } else if (/^INFO /.exec(message)) {
        info("Message from iframe: " + message);
      } else if (/^COMMAND /.exec(message)) {
        var command = JSON.parse(message.replace(/^COMMAND /, ""));
        gScript.sendAsyncMessage(command.name, command.data);
      } else if (/^DONE$/.exec(message)) {
        ok(true, "Messaging from iframe complete.");
        iframe.removeEventListener("mozbrowsershowmodalprompt", listener);

        teardown();
      }
    });

    var promise = new Promise(function(aResolve, aReject) {
      document.body.appendChild(iframe);

      aResolve(iframe);
    });
    obs.notifyObservers(promise, "setup-request-promise");

    aResolve();
  });
}

function teardown() {
  gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() {
    gScript.removeMessageListener("teardown-complete", teardownCompleteHandler);
    gScript.destroy();
    SimpleTest.finish();
  });

  gScript.sendAsyncMessage("teardown");
}

function runTests() {
  setup().then();
}

SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPermissions([
  {type: "presentation-device-manage", allow: false, context: document},
  {type: "browser", allow: true, context: document},
], function() {
  SpecialPowers.pushPrefEnv({ "set": [["dom.presentation.enabled", true],
                                      ["dom.presentation.controller.enabled", true],
                                      ["dom.presentation.receiver.enabled", true],
                                      ["dom.mozBrowserFramesEnabled", true],
                                      ["network.disable.ipc.security", true],
                                      ["dom.presentation.session_transport.data_channel.enable", false]]},
                            runTests);
});
