Commit 7098c087 authored by Tanvi Vyas's avatar Tanvi Vyas
Browse files

Bug 803225 - Test different protocols that are allowed in nsMixedContentBlocker.cpp (r=bz)

parent c6ecc20a
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -585,6 +585,10 @@ MOCHITEST_FILES_B = \
		test_mixed_content_blocker.html \
		file_mixed_content_main.html \
		file_mixed_content_server.sjs \
    test_mixed_content_blocker_bug803225.html \
    file_mixed_content_main_bug803225.html \
    file_mixed_content_main_bug803225_websocket_wsh.py \
    bug803225_test_mailto.html \
		test_bug789856.html \
		file_bug804395.jar \
		test_bug804395.html \
+13 −0
Original line number Diff line number Diff line
<!DOCTYPE HTML>
<html>
<!--
Tests for Mixed Content Blocker - Mailto Protocol Compose Page
https://bugzilla.mozilla.org/show_bug.cgi?id=803225
-->
<head> <meta charset="utf-8"> 
</head>
<body>
Hello
<script>window.close();</script>
</body>
</html>
+160 −0
Original line number Diff line number Diff line
<!DOCTYPE HTML>
<html>
<!--
Tests for Mixed Content Blocker - Allowed Protocols
https://bugzilla.mozilla.org/show_bug.cgi?id=803225
-->
<head>
  <meta charset="utf-8">
  <title>Tests for Bug 62178</title>
  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
</head>
<body>
<div id="testContent"></div>

<!-- Test additional schemes the Mixed Content Blocker should not block
     "about" protocol URIs that are URI_SAFE_FOR_UNTRUSTED_CONTENT (moz-safe-about; see nsAboutProtocolHandler::NewURI
     "data",
     "javascript",
     "mailto",
     "resource",
     "moz-icon",
     "wss"
-->

<script>

  //For tests that require setTimeout, set the timeout interval
  var TIMEOUT_INTERVAL = 100;

  var testContent = document.getElementById("testContent");

  // Test 1 & 2: about and javascript protcols within an iframe
  var data = Array(2,2);
  var protocols = [
                    ["about", ""], //When no source is specified, the frame gets a source of about:blank
                    ["javascript", "javascript:document.open();document.write='<h1>SUCCESS</h1>';document.close();"],
                  ];
  for(var i=0; i < protocols.length; i++)
  {
    var generic_frame = document.createElement("iframe");
    generic_frame.src = protocols[i][1];
    generic_frame.name="generic_protocol";

    generic_frame.onload = function(i) {
      data = {"test": protocols[i][0], "msg": "resource with " + protocols[i][0] + " protocol loaded"};
      parent.postMessage(data, "http://mochi.test:8888");
    }.bind(generic_frame, i)

    generic_frame.onerror = function(i) {
      data = {"test": protocols[i][0], "msg": "resource with " + protocols[i][0] + " protocol did not load"};
      parent.postMessage(data, "http://mochi.test:8888");
    }.bind(generic_frame, i);

    testContent.appendChild(generic_frame, i);
  }

  // Test 3: for resource within a script tag
  var resource_script=document.createElement("script");
  resource_script.src = "resource://gre/modules/XPCOMUtils.jsm";
  resource_script.name = "resource_protocol";
  resource_script.onload = function() {
    parent.postMessage({"test": "resource", "msg": "resource with resource protocol loaded"}, "http://mochi.test:8888");
  }
  resource_script.onerror = function() {
    parent.postMessage({"test": "resource", "msg": "resource with resource protocol did not load"}, "http://mochi.test:8888");
  }

  testContent.appendChild(resource_script);

  // Test 4: moz-icon within an img tag
  var image=document.createElement("img");
  image.src = "moz-icon://dummy.exe?size=16";
  image.onload = function() {
    parent.postMessage({"test": "mozicon", "msg": "resource with mozicon protocol loaded"}, "http://mochi.test:8888");
  }
  image.onerror = function() {
    parent.postMessage({"test": "mozicon", "msg": "resource with mozicon protocol did not load"}, "http://mochi.test:8888");
  }
  // We don't need to append the image to the document. Doing so causes the image test to run twice.

  // Test 5: about unsafe protocol within an iframe
  var unsafe_about_frame = document.createElement("iframe");
  unsafe_about_frame.src = "about:config";
  unsafe_about_frame.name = "unsafe_about_protocol";
  unsafe_about_frame.onload = function() {
    parent.postMessage({"test": "unsafe_about", "msg": "resource with unsafe about protocol loaded"}, "http://mochi.test:8888");
  }
  unsafe_about_frame.onerror = function() {
    parent.postMessage({"test": "unsafe_about", "msg": "resource with unsafe about protocol did not load"}, "http://mochi.test:8888");
  }
  testContent.appendChild(unsafe_about_frame);

  // Test 6: data protocol within a script tag
  var x = 2;
  var newscript = document.createElement("script");
  newscript.src= "data:text/javascript,var x = 4;";
  newscript.onload = function() {
    parent.postMessage({"test": "data_protocol", "msg": "resource with data protocol loaded"}, "http://mochi.test:8888");
  }
  newscript.onerror = function() {
    parent.postMessage({"test": "data_protocol", "msg": "resource with data protocol did not load"}, "http://mochi.test:8888");
  }
  testContent.appendChild(newscript);

  // Test 7: mailto protocol
  var ioService = SpecialPowers.Cc["@mozilla.org/network/io-service;1"].
     getService(SpecialPowers.Ci.nsIIOService);

  var webHandler = SpecialPowers.Cc["@mozilla.org/uriloader/web-handler-app;1"].
                   createInstance(SpecialPowers.Ci.nsIWebHandlerApp);
  webHandler.name = "Web Handler";
  webHandler.uriTemplate = "http://example.com/tests/content/base/test/bug803225_test_mailto.html?s=%";

  var uri = ioService.newURI("mailto:foo@bar.com", null, null);
  webHandler.launchWithURI(uri);

  var mailto = false;

  // listen for a messages from a new window
  var observer = {
    observe: function(subject, topic, data) {
      if(topic == "content-document-global-created" && data =="http://example.com") {
         parent.postMessage({"test": "mailto", "msg": "resource with mailto protocol loaded"}, "http://mochi.test:8888");
         mailto = true;
      }
    }
  }
  var os = SpecialPowers.Cc["@mozilla.org/observer-service;1"].
     getService(SpecialPowers.Components.interfaces.nsIObserverService);
  os.addObserver(observer, "content-document-global-created", false);

  function mailtoProtocolStatus() {
    if(!mailto) {
      //There is no onerror event associated with the WebHandler, and hence we need a setTimeout to check the status
      setTimeout(mailtoProtocolStatus, TIMEOUT_INTERVAL);
    }
  }

  mailtoProtocolStatus();

  // Test 8: wss protocol
  var wss;
  wss = new WebSocket("wss://example.com/tests/content/base/test/file_mixed_content_main_bug803225_websocket");

  var status_wss = "started";
  wss.onopen = function(e) {
     status_wss = "opened";
     wss.close();
  }
  wss.onclose = function(e) {
    if(status_wss == "opened") {
      parent.postMessage({"test": "wss", "msg": "resource with wss protocol loaded"}, "http://mochi.test:8888");
    } else {
      parent.postMessage({"test": "wss", "msg": "resource with wss protocol did not load"}, "http://mochi.test:8888");
    }
  }

</script>
</body>
</html>
+7 −0
Original line number Diff line number Diff line
from mod_pywebsocket import msgutil

def web_socket_do_extra_handshake(request):
  pass

def web_socket_transfer_data(request):
  resp = ""
+148 −0
Original line number Diff line number Diff line
<!DOCTYPE HTML>
<html>
<!--
Testing Whitelist of Resource Schemed 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 type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>

  <script>

  var origBlockDisplay = SpecialPowers.getBoolPref("security.mixed_content.block_display_content");
  var origBlockActive = SpecialPowers.getBoolPref("security.mixed_content.block_active_content");

  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(x) {
    SpecialPowers.setBoolPref("security.mixed_content.block_display_content", settings[x][0]);
    SpecialPowers.setBoolPref("security.mixed_content.block_active_content", settings[x][1]);
    blockDisplay = SpecialPowers.getBoolPref("security.mixed_content.block_display_content");
    blockActive = SpecialPowers.getBoolPref("security.mixed_content.block_active_content");
  }

  //Set the first set of settings (true, true) and increment the counter.
  changePrefs(counter);
  counter++;

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

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

  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(counter);
      counter++;
      log("\nblockDisplay set to "+blockDisplay+", blockActive set to "+blockActive+".");
      document.getElementById('framediv').innerHTML = '<iframe id="testHarness" src="https://example.com/tests/content/base/test/file_mixed_content_main_bug803225.html"></iframe>';
    }
    else {
      //set the prefs back to what they were set to originally
      SpecialPowers.setBoolPref("security.mixed_content.block_display_content", origBlockDisplay);
      SpecialPowers.setBoolPref("security.mixed_content.block_active_content", origBlockActive);
      SimpleTest.finish();
    }
  }

  var firstTest = true;

  // listen for a messages from the mixed content test harness
  window.addEventListener("message", receiveMessage, false);
  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 "mozicon":
        ok(event.data.msg == "resource with mozicon protocol loaded", "resource with mozicon protocol did not load");
        testsToRun["mozicon"] = 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();
  }

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

<body>
  <div id="framediv">
    <iframe id="testHarness" src="https://example.com/tests/content/base/test/file_mixed_content_main_bug803225.html"></iframe>
  </div>
  <pre id="log"></pre>
</body>
</html>
Loading