<!DOCTYPE HTML>
<html>
<!--
Testing Allowlist of Resource Scheme for Mixed Content Blocker
https://bugzilla.mozilla.org/show_bug.cgi?id=803225
-->
<head>
  <meta charset="utf-8">
  <title>Tests for Bug 803225</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>

  <script>
  const { AppConstants } = SpecialPowers.ChromeUtils.import(
    "resource://gre/modules/AppConstants.jsm"
  );

  var counter = 0;
  var settings = [ [true, true], [true, false], [false, true], [false, false] ];

  var blockActive;
  var blockDisplay;

  //Cycle through 4 different preference settings.
  function changePrefs(callback) {
    let newPrefs = [
      ["security.all_resource_uri_content_accessible", true], // Temporarily allow content to access all resource:// URIs.
      ["security.mixed_content.block_display_content", settings[counter][0]],
      ["security.mixed_content.block_active_content", settings[counter][1]]
    ];

    SpecialPowers.pushPrefEnv({"set": newPrefs}, function () {
      blockDisplay = SpecialPowers.getBoolPref("security.mixed_content.block_display_content");
      blockActive = SpecialPowers.getBoolPref("security.mixed_content.block_active_content");
      counter++;
      callback();
    });
  }

  var testsToRun = {
    /* https - Tests already run as part of bug 62178. */
    about: false,
    resource: false,
    unsafe_about: false,
    data_protocol: false,
    javascript: false,
  };

  if (AppConstants.platform !== "android") {
    // WebSocket tests are not supported on Android Yet. Bug 1566168.
    testsToRun.wss = false;
    testsToRun.mailto = false;
  }

  function log(msg) {
    document.getElementById("log").textContent += "\n" + msg;
  }

  function reloadFrame() {
    document.getElementById('framediv').innerHTML = '<iframe id="testHarness" src="https://example.com/tests/dom/security/test/mixedcontentblocker/file_main_bug803225.html"></iframe>';
  }

  function checkTestsCompleted() {
    for (var prop in testsToRun) {
      // some test hasn't run yet so we're not done
      if (!testsToRun[prop])
        return;
    }
    //if the testsToRun are all completed, change the pref and run the tests again until we have cycled through all the prefs.
    if(counter < 4) {
       for (var prop in testsToRun) {
         testsToRun[prop] = false;
       }
      //call to change the preferences
      changePrefs(function() {
        log("\nblockDisplay set to "+blockDisplay+", blockActive set to "+blockActive+".");
        reloadFrame();
      });
    }
    else {
      SimpleTest.finish();
    }
  }

  var firstTest = true;

  function receiveMessage(event) {
    if(firstTest) {
      log("blockDisplay set to "+blockDisplay+", blockActive set to "+blockActive+".");
      firstTest = false;
    }

    log("test: "+event.data.test+", msg: "+event.data.msg + " logging message.");
    // test that the load type matches the pref for this type of content
    // (i.e. active vs. display)

    switch(event.data.test) {

      /* Mixed Script tests */
      case "about":
        ok(event.data.msg == "resource with about protocol loaded", "resource with about protocol did not load");
        testsToRun.about = true;
        break;

      case "resource":
        ok(event.data.msg == "resource with resource protocol loaded", "resource with resource protocol did not load");
        testsToRun.resource = true;
        break;

      case "unsafe_about":
        // This one should not load
        ok(event.data.msg == "resource with unsafe about protocol did not load", "resource with unsafe about protocol loaded");
        testsToRun.unsafe_about = true;
        break;

      case "data_protocol":
        ok(event.data.msg == "resource with data protocol loaded", "resource with data protocol did not load");
        testsToRun.data_protocol = true;
        break;

      case "javascript":
        ok(event.data.msg == "resource with javascript protocol loaded", "resource with javascript protocol did not load");
        testsToRun.javascript = true;
        break;

      case "wss":
        ok(event.data.msg == "resource with wss protocol loaded", "resource with wss protocol did not load");
        testsToRun.wss = true;
        break;

      case "mailto":
        ok(event.data.msg == "resource with mailto protocol loaded", "resource with mailto protocol did not load");
        testsToRun.mailto = true;
        break;
    }
    checkTestsCompleted();
  }

  function startTest() {
    //Set the first set of settings (true, true) and increment the counter.
    changePrefs(function() {
      // listen for a messages from the mixed content test harness
      window.addEventListener("message", receiveMessage);

      reloadFrame();
    });
  }

  SimpleTest.waitForExplicitFinish();
  </script>
</head>

<body onload='startTest()'>
  <div id="framediv"></div>
  <pre id="log"></pre>
</body>
</html>
