Bug 406541 - Test. r=bsmedberg
authorJohn Schoenick <jschoenick@mozilla.com>
Tue, 28 May 2013 17:54:27 -0700
changeset 170904 277862f099a4ce08bf4273274d0c9b4b5a781d7e
parent 170903 19a4abd04dceab5eba3cf936dca901e63823808e
child 170905 5c9e441390235b20b9b67ac9a0bbf0af5f95c2b4
push id270
push userpvanderbeken@mozilla.com
push dateThu, 06 Mar 2014 09:24:21 +0000
reviewersbsmedberg
bugs406541
milestone30.0a1
Bug 406541 - Test. r=bsmedberg
dom/plugins/test/mochitest/mochitest.ini
dom/plugins/test/mochitest/test_bug406541.html
--- a/dom/plugins/test/mochitest/mochitest.ini
+++ b/dom/plugins/test/mochitest/mochitest.ini
@@ -19,16 +19,17 @@ support-files =
   plugin_window.html
   pluginstream.js
   post.sjs
   utils.js
 
 [test_GCrace.html]
 [test_NPNVdocumentOrigin.html]
 [test_NPPVpluginWantsAllNetworkStreams.html]
+[test_bug406541.html]
 [test_bug532208.html]
 [test_bug539565-1.html]
 [test_bug539565-2.html]
 [test_bug738396.html]
 [test_bug771202.html]
 [test_bug777098.html]
 [test_bug784131.html]
 [test_bug813906.html]
new file mode 100644
--- /dev/null
+++ b/dom/plugins/test/mochitest/test_bug406541.html
@@ -0,0 +1,100 @@
+<!doctype html>
+<html>
+<head>
+  <title>Test for Bug 406541</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="utils.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+
+  <meta http-equiv="content-type" content="text/html; charset=utf-8">
+</head>
+<body>
+<script type="application/x-child-payload" id="child-payload">
+  // This is injected into the file:/// origin iframe, see below.
+
+  // appletA should spawn, appletB, with a codebase outside the temp directory,
+  // should not.
+  var appletA = document.createElement("applet");
+  var appletB = document.createElement("applet");
+  var appletC = document.createElement("applet");
+  appletA.type = appletB.type = appletC.type = "application/x-java-test";
+  appletB.setAttribute("codebase", "file:///");
+  appletC.setAttribute("codebase", "./subdir_bug406541/");
+  document.body.appendChild(appletA);
+  document.body.appendChild(appletB);
+  document.body.appendChild(appletC);
+  function isSpawned(plugin) {
+    try {
+      var x = plugin.getJavaCodebase();
+      return true;
+    } catch (e) {}
+    return false;
+  }
+  window.parent.postMessage({ "A": isSpawned(appletA),
+                              "B": isSpawned(appletB),
+                              "C": isSpawned(appletC) }, "*");
+</script>
+<script type="application/javascript">
+  SimpleTest.waitForExplicitFinish();
+  setTestPluginEnabledState(SpecialPowers.Ci.nsIPluginTag.STATE_ENABLED,
+                            "Java Test Plug-in");
+  SpecialPowers.pushPrefEnv({ "set": [
+                              ['plugin.java.mime', 'application/x-java-test']
+                            ] }, runTest);
+
+  function runTest() {
+    // Create a empty file and point an iframe at it
+    var Cc = SpecialPowers.Cc;
+    var Ci = SpecialPowers.Ci;
+    var file = Cc["@mozilla.org/file/directory_service;1"]
+      .getService(Ci.nsIProperties)
+      .get("TmpD", Ci.nsIFile);
+    var subdir = Cc["@mozilla.org/file/directory_service;1"]
+      .getService(Ci.nsIProperties)
+      .get("TmpD", Ci.nsIFile);
+    file.append("test_bug406541.html");
+    file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, 0600);
+    subdir.append("subdir_bug406541");
+    subdir.createUnique(Ci.nsIFile.DIRECTORY_TYPE, 0600);
+
+    var i = document.createElement("iframe");
+    var loaded = false;
+    i.addEventListener("load", function initialLoad() {
+      if (!loaded) {
+        // Once loaded, use special powers to point it at the file
+        SpecialPowers.wrap(i.contentWindow).location.href = "file://" + file.path;
+        loaded = true;
+      } else {
+        // Inject the child-payload script to the file:/// origin. Let it test
+        // applet spawning and send the results in a postMessage. (Because I
+        // couldn't get SpecialPowers to let me touch applets cross-origin, then
+        // gave up.)
+        var innerdoc = SpecialPowers.wrap(i.contentWindow).document;
+        var s = innerdoc.createElement("script");
+        s.type = "text/javascript";
+        s.textContent = document.getElementById("child-payload").textContent;
+        var finished = false;
+        window.onmessage = function(message) {
+          ok(message.data.A, "Plugin A should spawn");
+          ok(!message.data.B, "Plugin B should NOT spawn");
+          ok(message.data.C, "Plugin C should spawn");
+          file.remove(false);
+          subdir.remove(false);
+          finished = true;
+          SimpleTest.finish();
+        };
+        innerdoc.body.appendChild(s);
+
+        SimpleTest.executeSoon(function() {
+          if (!finished) {
+            ok(finished, "Should have received callback by now");
+            SimpleTest.finish();
+          }
+        });
+      }
+    }, false);
+    document.body.appendChild(i);
+  }
+</script>
+</body>
+</html>