summaryrefslogtreecommitdiffstats
path: root/docshell/test/test_bug369814.html
diff options
context:
space:
mode:
Diffstat (limited to 'docshell/test/test_bug369814.html')
-rw-r--r--docshell/test/test_bug369814.html211
1 files changed, 211 insertions, 0 deletions
diff --git a/docshell/test/test_bug369814.html b/docshell/test/test_bug369814.html
new file mode 100644
index 000000000..866771055
--- /dev/null
+++ b/docshell/test/test_bug369814.html
@@ -0,0 +1,211 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=369814
+-->
+<head>
+ <title>Test for Bug 369814</title>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=384014">Mozilla Bug 369814</a>
+
+<p>
+
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Tests for Bug 369814 **/
+
+SimpleTest.waitForExplicitFinish();
+
+// Because child scripts won't be able to run to tell us they're done,
+// we need to just wait for them. Wait this many event loop spins before
+// checking the results.
+const gLoadEventLoopCount = 100;
+
+var gCurrentTest;
+var gTargetWindow;
+var gNumPokes;
+var gTestFrame;
+
+/**
+ * Called by documents loaded from jar files to indicate that they can access
+ * this document.
+ */
+function poke(description) {
+ ok(false, gCurrentTest['name'] + ": got unexpected poke: " + description);
+ gNumPokes++;
+}
+
+function loadEvent(window, callback)
+{
+ var fn = function() {
+ window.removeEventListener("load", fn, false);
+ callback();
+ };
+ window.addEventListener("load", fn, false);
+}
+
+function loadTestTarget(callback)
+{
+ gTargetWindow = window.open("http://mochi.test:8888", "bug369814target");
+ loadEvent(gTargetWindow, callback);
+}
+
+function closeTestTarget()
+{
+ gTargetWindow.close();
+ gTargetWindow = null;
+}
+
+function loadErrorTest(test)
+{
+ // Give the frame a chance to fail at loading.
+ // How do detect failure to load? Error pages don't fire load
+ // events. But we can load another page before the error page and
+ // then use its unload handler to know when the error page is just
+ // about loaded; at that point a single trip through the event loop
+ // should do the trick.
+ loadEvent(gTestFrame, function() {
+ gTestFrame.src = test['url'];
+ });
+ gTestFrame.unloading = function() {
+ gTestFrame.unloading = null;
+ // Go out to the event loop once so that unload processing finishes and
+ // the new document is set up.
+ setTimeout(function() {
+ // XXX: There doesn't seem to be a reliable check for "got an error,"
+ // but reaching in to an error document will throw an exception
+ var errorPage;
+ try {
+ var item = gTestFrame.contentDocument.getElementById(gCurrentTest['data-iframe']);
+ errorPage = false;
+ } catch (e) {
+ errorPage = true;
+ }
+ ok(errorPage, gCurrentTest["name"] + ": should block a suspicious JAR load.");
+
+ finishTest();
+ }, 0);
+ }
+ var unloadDetector = "data:text/html,<script>window.onunload = function() { frameElement.unloading(); }</" + "script>";
+ gTestFrame.src = unloadDetector;
+}
+
+function iframeTest(test) {
+ gTestFrame.src = test['url'];
+ loadEvent(gTestFrame, function() {
+ finishTest();
+ });
+}
+
+
+function hitEventLoop(func, times) {
+ if (times > 0) {
+ SimpleTest.executeSoon(function() { hitEventLoop(func, times-1); });
+ } else {
+ SimpleTest.executeSoon(func);
+ }
+}
+
+function refreshTest(test) {
+ gTestFrame.src = test['url'];
+ loadEvent(gTestFrame, function() {
+ // Wait for the frame to try and refresh
+ // XXX: a "blocked redirect" signal would be needed to get rid of
+ // this timeout.
+ hitEventLoop(function() {
+ finishTest();
+ }, gLoadEventLoopCount);
+ });
+}
+
+function anchorTest(test) {
+ loadTestTarget(function() {
+ gTestFrame.src = test['url'];
+ loadEvent(gTestFrame, function() {
+ sendMouseEvent({type:'click'}, 'target', gTestFrame.contentWindow);
+ sendMouseEvent({type:'click'}, 'notarget', gTestFrame.contentWindow);
+
+ // Give the clicks a chance to load
+ hitEventLoop(function() {
+ closeTestTarget();
+ finishTest();
+ }, gLoadEventLoopCount);
+ });
+ });
+}
+
+var gTests = [
+ { "name" : "iframes.html loaded from non-jar type, pref disabled",
+ "url" : "jar:http://mochi.test:8888/tests/docshell/test/bug369814.zip!/iframes.html",
+ "pref" : false,
+ "pokes" : { },
+ "func" : loadErrorTest,
+ },
+ { "name" : "refresh.html loaded from non-jar type, pref enabled",
+ "url" : "jar:http://mochi.test:8888/tests/docshell/test/bug369814.zip!/refresh.html",
+ "pref" : true,
+ "pokes" : { },
+ "func" : refreshTest,
+ },
+ { "name" : "iframes.html loaded from non-jar type, pref enabled",
+ "url" : "jar:http://mochi.test:8888/tests/docshell/test/bug369814.zip!/iframes.html",
+ "pref" : true,
+ "pokes" : { },
+ "func" : iframeTest,
+ },
+ { "name" : "anchors.html loaded from non-jar type, pref enabled",
+ "url" : "jar:http://mochi.test:8888/tests/docshell/test/bug369814.zip!/anchors.html",
+ "pref" : true,
+ "pokes" : { },
+ "func" : anchorTest,
+ },
+];
+
+var gNextTest = 0;
+
+function runNextTest()
+{
+ if (gNextTest < gTests.length) {
+ gCurrentTest = gTests[gNextTest++];
+ gNumPokes = 0;
+
+ SpecialPowers.pushPrefEnv({"set": [["network.jar.block-remote-files", false],
+ ["network.jar.open-unsafe-types", gCurrentTest['pref']]]}, function() {
+
+ // Create a new frame each time, so our restictions on loads in a
+ // jar:-loaded iframe don't interfere with the test.
+ if (gTestFrame) {
+ document.body.removeChild(gTestFrame);
+ }
+ gTestFrame = document.createElement("iframe");
+ document.body.insertBefore(gTestFrame, $("test"));
+
+ gCurrentTest['func'](gCurrentTest);
+ });
+ } else {
+ SimpleTest.finish();
+ }
+}
+
+function finishTest()
+{
+ SpecialPowers.pushPrefEnv({"set": [["network.jar.open-unsafe-types", false]]}, function() {
+ if (gNumPokes == 0) {
+ ok(true, gCurrentTest["name"] + ": no unexpected pokes");
+ }
+
+ runNextTest();
+ });
+}
+
+addLoadEvent(runNextTest);
+
+</script>
+</pre>
+</body>
+</html>