diff options
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_webRequest.js')
-rw-r--r-- | browser/components/extensions/test/browser/browser_ext_webRequest.js | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_webRequest.js b/browser/components/extensions/test/browser/browser_ext_webRequest.js new file mode 100644 index 0000000000..c2ff1d6c64 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_webRequest.js @@ -0,0 +1,142 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +/* import-globals-from ../../../../../toolkit/components/extensions/test/mochitest/head_webrequest.js */ +loadTestSubscript("head_webrequest.js"); + +const { HiddenFrame } = ChromeUtils.importESModule( + "resource://gre/modules/HiddenFrame.sys.mjs" +); +const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; + +SimpleTest.requestCompleteLog(); + +function createHiddenBrowser(url) { + let frame = new HiddenFrame(); + return new Promise(resolve => + frame.get().then(subframe => { + let doc = subframe.document; + let browser = doc.createElementNS(XUL_NS, "browser"); + browser.setAttribute("type", "content"); + browser.setAttribute("remote", "true"); + browser.setAttribute("disableglobalhistory", "true"); + browser.setAttribute("src", url); + + doc.documentElement.appendChild(browser); + resolve({ frame: frame, browser: browser }); + }) + ); +} + +let extension; +let dummy = + "http://mochi.test:8888/browser/browser/components/extensions/test/browser/file_dummy.html"; +let headers = { + request: { + add: { + "X-WebRequest-request": "text", + "X-WebRequest-request-binary": "binary", + }, + modify: { + "user-agent": "WebRequest", + }, + remove: ["accept-encoding"], + }, + response: { + add: { + "X-WebRequest-response": "text", + "X-WebRequest-response-binary": "binary", + }, + modify: { + server: "WebRequest", + "content-type": "text/html; charset=utf-8", + }, + remove: ["connection"], + }, +}; + +let urls = ["http://mochi.test/browser/*"]; +let events = { + onBeforeRequest: [{ urls }, ["blocking"]], + onBeforeSendHeaders: [{ urls }, ["blocking", "requestHeaders"]], + onSendHeaders: [{ urls }, ["requestHeaders"]], + onHeadersReceived: [{ urls }, ["blocking", "responseHeaders"]], + onCompleted: [{ urls }, ["responseHeaders"]], +}; + +add_setup(async function () { + extension = makeExtension(events); + await extension.startup(); +}); + +add_task(async function test_newWindow() { + let expect = { + "file_dummy.html": { + type: "main_frame", + headers, + }, + }; + // NOTE: When running solo, favicon will be loaded at some point during + // the tests in this file, so all tests ignore it. When running with + // other tests in this directory, favicon gets loaded at some point before + // we run, and we never see the request, thus it cannot be handled as part + // of expect above. + extension.sendMessage("set-expected", { expect, ignore: ["favicon.ico"] }); + await extension.awaitMessage("continue"); + + let openedWindow = await BrowserTestUtils.openNewBrowserWindow(); + await BrowserTestUtils.openNewForegroundTab( + openedWindow.gBrowser, + `${dummy}?newWindow=${Math.random()}` + ); + + await extension.awaitMessage("done"); + await BrowserTestUtils.closeWindow(openedWindow); +}); + +add_task(async function test_newTab() { + // again, in this window + let expect = { + "file_dummy.html": { + type: "main_frame", + headers, + }, + }; + extension.sendMessage("set-expected", { expect, ignore: ["favicon.ico"] }); + await extension.awaitMessage("continue"); + let tab = await BrowserTestUtils.openNewForegroundTab( + window.gBrowser, + `${dummy}?newTab=${Math.random()}` + ); + + await extension.awaitMessage("done"); + BrowserTestUtils.removeTab(tab); +}); + +add_task(async function test_subframe() { + let expect = { + "file_dummy.html": { + type: "main_frame", + headers, + }, + }; + // test a content subframe attached to hidden window + extension.sendMessage("set-expected", { expect, ignore: ["favicon.ico"] }); + info("*** waiting to continue"); + await extension.awaitMessage("continue"); + info("*** creating hidden browser"); + let frameInfo = await createHiddenBrowser( + `${dummy}?subframe=${Math.random()}` + ); + info("*** waiting for finish"); + await extension.awaitMessage("done"); + info("*** destroying hidden browser"); + // cleanup + frameInfo.browser.remove(); + frameInfo.frame.destroy(); +}); + +add_task(async function teardown() { + await extension.unload(); +}); |