Bug 1207556 - Part 2: Fix the beacon CORS preflight tests; r=sicking, a=lizzard
authorEhsan Akhgari <ehsan@mozilla.com>
Thu, 24 Sep 2015 16:45:26 -0400
changeset 296187 0cfc3ec58048a6a849867b2e5c3279c88302246a
parent 296186 2bed87c716f690c7c743d13a387d4d5c73de0d1f
child 296188 856ea7b5527be0254df2d3d8762698c87faf0b53
push id5245
push userraliiev@mozilla.com
push dateThu, 29 Oct 2015 11:30:51 +0000
treeherdermozilla-beta@dac831dc1bd0 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssicking, lizzard
bugs1207556
milestone43.0a2
Bug 1207556 - Part 2: Fix the beacon CORS preflight tests; r=sicking, a=lizzard
dom/tests/mochitest/beacon/beacon-preflight-handler.sjs
dom/tests/mochitest/beacon/mochitest.ini
dom/tests/mochitest/beacon/test_beaconPreflight.html
dom/tests/mochitest/beacon/test_beaconPreflightFailure.html
new file mode 100644
--- /dev/null
+++ b/dom/tests/mochitest/beacon/beacon-preflight-handler.sjs
@@ -0,0 +1,39 @@
+function handleRequest(request, response)
+{
+  response.setHeader("Cache-Control", "no-cache, must-revalidate", false);
+
+  if (request.queryString === "verify") {
+    var preflightState = getState("preflight");
+    response.write(preflightState === "done" ? "green" : "red");
+    return;
+  }
+
+  var originHeader = request.getHeader("origin");
+  response.setHeader("Access-Control-Allow-Headers", "content-type", false);
+  response.setHeader("Access-Control-Allow-Methods", "POST, GET", false);
+  response.setHeader("Access-Control-Allow-Origin", originHeader, false);
+  response.setHeader("Access-Control-Allow-Credentials", "true", false);
+
+  if (request.queryString === "beacon") {
+    if (request.method == "OPTIONS") {
+      setState("preflight", "done");
+      response.setStatusLine(null, 200, "OK");
+      return;
+    }
+    response.setStatusLine(null, 200, "OK");
+    response.write("DONE");
+    return;
+  }
+
+  if (request.queryString === "fail") {
+    if (request.method == "OPTIONS") {
+      setState("preflight", "done");
+      response.setStatusLine(null, 400, "Bad Request");
+      return;
+    }
+    setState("preflight", "oops");
+    response.setStatusLine(null, 200, "OK");
+    response.write("DONE");
+    return;
+  }
+}
--- a/dom/tests/mochitest/beacon/mochitest.ini
+++ b/dom/tests/mochitest/beacon/mochitest.ini
@@ -1,13 +1,15 @@
 [DEFAULT]
 skip-if = buildapp == 'b2g'
 support-files = beacon-frame.html
                 beacon-handler.sjs
+                beacon-preflight-handler.sjs
                 beacon-originheader-handler.sjs
                 beacon-cors-redirect-handler.sjs
 
 [test_beacon.html]
 [test_beaconFrame.html]
 [test_beaconPreflight.html]
+[test_beaconPreflightFailure.html]
 [test_beaconContentPolicy.html]
 [test_beaconOriginHeader.html]
 [test_beaconCORSRedirect.html]
--- a/dom/tests/mochitest/beacon/test_beaconPreflight.html
+++ b/dom/tests/mochitest/beacon/test_beaconPreflight.html
@@ -12,25 +12,45 @@ https://bugzilla.mozilla.org/show_bug.cg
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=936340">Mozilla Bug 936340</a>
 <p id="display"></p>
 <div id="content" style="display: none">
   
 </div>
 <pre id="test">
 <script class="testbody" type="text/javascript">
 
-var beaconUrl = "http://mochi.test:8888/tests/dom/tests/mochitest/beacon/beacon-handler.sjs";
+var beaconUrl = "http://example.com/tests/dom/tests/mochitest/beacon/beacon-preflight-handler.sjs?beacon";
+
+var intervalID = null;
+
+function queryIfBeaconSucceeded() {
+  clearInterval(intervalID);
+  var xhr = new XMLHttpRequest();
+  xhr.open("GET", "beacon-preflight-handler.sjs?verify", true);
+  xhr.onload = function() {
+    is(xhr.responseText, "green", "SendBeacon should have succeeded after preflight!");
+    SimpleTest.finish();
+  };
+  xhr.onerror = function() {
+    ok(false, "xhr request returned error");
+    SimpleTest.finish();
+  };
+  xhr.send();
+}
 
 // not enabled by default yet.
 SimpleTest.waitForExplicitFinish();
 SpecialPowers.pushPrefEnv({'set': [["beacon.enabled", true]]}, beginTest);
 
 function beginTest() {
   var abv = new Uint8Array([0,1,2,3]);
   var sent = navigator.sendBeacon(beaconUrl, abv);
-  ok(sent, "non-standard content type allowed after pre-flight");
-  SimpleTest.finish();
+  ok(sent, "sending the beacon should start successfully");
+
+  // we have to make sure sending the beacon did not fail, so
+  // we have to wait for 2 seconds before we can query the result.
+  intervalID = setInterval(queryIfBeaconSucceeded, 2000);
 }
 
 </script>
 </pre>
 </body>
 </html>
new file mode 100644
--- /dev/null
+++ b/dom/tests/mochitest/beacon/test_beaconPreflightFailure.html
@@ -0,0 +1,56 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1207556
+-->
+<head>
+  <title>Test for Bug 1207556</title>
+  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.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=1207556">Mozilla Bug 1207556</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+  
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+var beaconUrl = "http://example.com/tests/dom/tests/mochitest/beacon/beacon-preflight-handler.sjs?fail";
+
+var intervalID = null;
+
+function queryIfBeaconSucceeded() {
+  clearInterval(intervalID);
+  var xhr = new XMLHttpRequest();
+  xhr.open("GET", "beacon-preflight-handler.sjs?verify", true);
+  xhr.onload = function() {
+    is(xhr.responseText, "red", "SendBeacon should have failed because of a failed preflight!");
+    SimpleTest.finish();
+  };
+  xhr.onerror = function() {
+    ok(false, "xhr request returned error");
+    SimpleTest.finish();
+  };
+  xhr.send();
+}
+
+// not enabled by default yet.
+SimpleTest.waitForExplicitFinish();
+SpecialPowers.pushPrefEnv({'set': [["beacon.enabled", true]]}, beginTest);
+
+function beginTest() {
+  var abv = new Uint8Array([0,1,2,3]);
+  var sent = navigator.sendBeacon(beaconUrl, abv);
+  ok(sent, "sending the beacon should start successfully");
+
+  // we have to make sure sending the beacon did not fail, so
+  // we have to wait for 2 seconds before we can query the result.
+  intervalID = setInterval(queryIfBeaconSucceeded, 2000);
+}
+
+</script>
+</pre>
+</body>
+</html>