Bug 1321528: Part 2 - Add tests for response header modification timing. r?mixedpuppy draft
authorKris Maglione <maglione.k@gmail.com>
Wed, 07 Dec 2016 11:04:52 -1000
changeset 447789 775eeb9d1d69e5d50566d5e0a1122445645deb09
parent 447788 182b41b5f0452c94909b039f0e026a0f4c584685
child 539125 e5caf36feadb6d44e63617ddf4f6175998a577a4
push id38163
push usermaglione.k@gmail.com
push dateWed, 07 Dec 2016 21:05:33 +0000
reviewersmixedpuppy
bugs1321528
milestone53.0a1
Bug 1321528: Part 2 - Add tests for response header modification timing. r?mixedpuppy MozReview-Commit-ID: 46Qsss8YhbY
toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
--- a/toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_webrequest_suspend.html
@@ -129,11 +129,88 @@ add_task(function* test_error_resume() {
 
   yield extension.awaitMessage("got-before-send-headers");
   yield extension.awaitMessage("got-error-occurred");
 
   yield extension.unload();
   chromeScript.destroy();
 });
 
+
+// Test that response header modifications take effect before onStartRequest fires.
+add_task(function* test_set_responseHeaders() {
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      permissions: [
+        "webRequest",
+        "webRequestBlocking",
+        "http://example.com/",
+      ],
+    },
+
+    background() {
+      browser.webRequest.onHeadersReceived.addListener(
+        details => {
+          browser.test.log(`onHeadersReceived({url: ${details.url}})`);
+
+          details.responseHeaders.push({name: "foo", value: "bar"});
+
+          return {responseHeaders: details.responseHeaders};
+        },
+        {urls: ["http://example.com/?modify_headers"]},
+        ["blocking", "responseHeaders"]);
+    },
+  });
+
+  yield extension.startup();
+
+  yield new Promise(resolve => setTimeout(resolve, 0));
+
+  let chromeScript = SpecialPowers.loadChromeScript(() => {
+    const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+    Cu.import("resource://gre/modules/NetUtil.jsm");
+    Cu.import("resource://gre/modules/Services.jsm");
+    Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+    let ssm = Services.scriptSecurityManager;
+
+    let channel = NetUtil.newChannel({
+      uri: "http://example.com/?modify_headers",
+      loadingPrincipal: ssm.createCodebasePrincipalFromOrigin("http://example.com"),
+      contentPolicyType: Ci.nsIContentPolicy.TYPE_XMLHTTPREQUEST,
+      securityFlags: Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL,
+    });
+
+    channel.asyncOpen2({
+      QueryInterface: XPCOMUtils.generateQI([Ci.nsIStreamListener]),
+
+      onStartRequest(request, context) {
+        request.QueryInterface(Ci.nsIHttpChannel);
+
+        try {
+          sendAsyncMessage("response-header-foo", request.getResponseHeader("foo"));
+        } catch (e) {
+          sendAsyncMessage("response-header-foo", null);
+        }
+        request.cancel(Cr.NS_BINDING_ABORTED);
+      },
+
+      onStopRequest() {
+      },
+
+      onDataAvailable() {
+        throw new Components.Exception("", Cr.NS_ERROR_FAILURE);
+      },
+    });
+  });
+
+  let headerValue = yield chromeScript.promiseOneMessage("response-header-foo");
+  is(headerValue, "bar", "Expected Foo header value");
+
+  yield extension.unload();
+  chromeScript.destroy();
+});
+
+
 </script>
 </body>
 </html>