fune/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_viewsource.js
Shane Caraveo 785c75dc53 Bug 1657916 allow extensions to see view-source requests r=robwu
View source prefixes urls with a view-source scheme.  Somewhere along
the way a request is made for the un-prefixed url but we do not intercept.  This
removes the prefix for webrequest and proxy APIs prior to checking access rules
and filters, allowing the APIs to intercept those requests that the otherwise
could.

Differential Revision: https://phabricator.services.mozilla.com/D89068
2020-10-15 21:57:35 +00:00

95 lines
2.7 KiB
JavaScript

"use strict";
const server = createHttpServer({ hosts: ["example.com"] });
server.registerPathHandler("/dummy", (request, response) => {
response.setStatusLine(request.httpVersion, 200, "OK");
response.write("ok");
});
add_task(async function test_webRequest_viewsource() {
function background(serverPort) {
browser.proxy.onRequest.addListener(
details => {
if (details.url === `http://example.com:${serverPort}/dummy`) {
browser.test.assertTrue(
true,
"viewsource protocol worked in proxy request"
);
browser.test.sendMessage("proxied");
}
},
{ urls: ["<all_urls>"] }
);
browser.webRequest.onBeforeRequest.addListener(
details => {
browser.test.assertEq(
`http://example.com:${serverPort}/redirect`,
details.url,
"viewsource protocol worked in webRequest"
);
browser.test.sendMessage("viewed");
return { redirectUrl: `http://example.com:${serverPort}/dummy` };
},
{ urls: ["http://example.com/redirect"] },
["blocking"]
);
browser.webRequest.onBeforeRequest.addListener(
details => {
browser.test.assertEq(
`http://example.com:${serverPort}/dummy`,
details.url,
"viewsource protocol worked in webRequest"
);
browser.test.sendMessage("redirected");
return { cancel: true };
},
{ urls: ["http://example.com/dummy"] },
["blocking"]
);
browser.webRequest.onCompleted.addListener(
details => {
// If cancel fails we get onCompleted.
browser.test.fail("onCompleted received");
},
{ urls: ["http://example.com/dummy"] }
);
browser.webRequest.onErrorOccurred.addListener(
details => {
browser.test.assertEq(
details.error,
"NS_ERROR_ABORT",
"request cancelled"
);
browser.test.sendMessage("cancelled");
},
{ urls: ["http://example.com/dummy"] }
);
}
let extension = ExtensionTestUtils.loadExtension({
manifest: {
permissions: ["proxy", "webRequest", "webRequestBlocking", "<all_urls>"],
},
background: `(${background})(${server.identity.primaryPort})`,
});
await extension.startup();
let contentPage = await ExtensionTestUtils.loadContentPage(
`view-source:http://example.com:${server.identity.primaryPort}/redirect`
);
await Promise.all([
extension.awaitMessage("proxied"),
extension.awaitMessage("viewed"),
extension.awaitMessage("redirected"),
extension.awaitMessage("cancelled"),
]);
await contentPage.close();
await extension.unload();
});