fune/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_permission.js
Kris Maglione e930b89c34 Bug 1514594: Part 3 - Change ChromeUtils.import API.
***
Bug 1514594: Part 3a - Change ChromeUtils.import to return an exports object; not pollute global. r=mccr8

This changes the behavior of ChromeUtils.import() to return an exports object,
rather than a module global, in all cases except when `null` is passed as a
second argument, and changes the default behavior not to pollute the global
scope with the module's exports. Thus, the following code written for the old
model:

  ChromeUtils.import("resource://gre/modules/Services.jsm");

is approximately the same as the following, in the new model:

  var {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");

Since the two behaviors are mutually incompatible, this patch will land with a
scripted rewrite to update all existing callers to use the new model rather
than the old.
***
Bug 1514594: Part 3b - Mass rewrite all JS code to use the new ChromeUtils.import API. rs=Gijs

This was done using the followng script:

https://bitbucket.org/kmaglione/m-c-rewrites/src/tip/processors/cu-import-exports.jsm
***
Bug 1514594: Part 3c - Update ESLint plugin for ChromeUtils.import API changes. r=Standard8

Differential Revision: https://phabricator.services.mozilla.com/D16747
***
Bug 1514594: Part 3d - Remove/fix hundreds of duplicate imports from sync tests. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16748
***
Bug 1514594: Part 3e - Remove no-op ChromeUtils.import() calls. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16749
***
Bug 1514594: Part 3f.1 - Cleanup various test corner cases after mass rewrite. r=Gijs
***
Bug 1514594: Part 3f.2 - Cleanup various non-test corner cases after mass rewrite. r=Gijs

Differential Revision: https://phabricator.services.mozilla.com/D16750

--HG--
extra : rebase_source : 359574ee3064c90f33bf36c2ebe3159a24cc8895
extra : histedit_source : b93c8f42808b1599f9122d7842d2c0b3e656a594%2C64a3a4e3359dc889e2ab2b49461bab9e27fc10a7
2019-01-17 10:18:31 -08:00

118 lines
3.9 KiB
JavaScript

"use strict";
const PREF_DISABLE_SECURITY = ("security.turn_off_all_security_so_that_" +
"viruses_can_take_over_this_computer");
const HOSTS = new Set([
"example.com",
"example.org",
]);
const server = createHttpServer({hosts: HOSTS});
const BASE_URL = "http://example.com";
server.registerDirectory("/data/", do_get_file("data"));
server.registerPathHandler("/dummy", (request, response) => {
response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Content-Type", "text/html", false);
response.write("<!DOCTYPE html><html></html>");
});
add_task(async function test_permissions() {
function background() {
browser.webRequest.onBeforeRequest.addListener(details => {
if (details.url.includes("_original")) {
let redirectUrl = details.url
.replace("example.org", "example.com")
.replace("_original", "_redirected");
return {redirectUrl};
}
return {};
}, {urls: ["<all_urls>"]}, ["blocking"]);
}
let extensionData = {
manifest: {
permissions: ["webRequest", "webRequestBlocking", "<all_urls>"],
},
background,
};
let extension = ExtensionTestUtils.loadExtension(extensionData);
await extension.startup();
const frameScript = () => {
const messageListener = {
async receiveMessage({target, messageName, recipient, data, name}) {
/* globals content */
let doc = content.document;
let iframe = doc.createElement("iframe");
doc.body.appendChild(iframe);
let promise = new Promise(resolve => {
let listener = event => {
content.removeEventListener("message", listener);
resolve(event.data);
};
content.addEventListener("message", listener);
});
iframe.setAttribute("src", "http://example.com/data/file_WebRequest_permission_original.html");
let result = await promise;
doc.body.removeChild(iframe);
return result;
},
};
const {MessageChannel} = ChromeUtils.import("resource://gre/modules/MessageChannel.jsm");
MessageChannel.addListener(this, "Test:Check", messageListener);
};
let contentPage = await ExtensionTestUtils.loadContentPage(`${BASE_URL}/dummy`);
await contentPage.loadFrameScript(frameScript);
let results = await contentPage.sendMessage("Test:Check", {});
equal(results.page, "redirected", "Regular webRequest redirect works on an unprivileged page");
equal(results.script, "redirected", "Regular webRequest redirect works from an unprivileged page");
Services.prefs.setBoolPref(PREF_DISABLE_SECURITY, true);
Services.prefs.setBoolPref("extensions.webapi.testing", true);
Services.prefs.setBoolPref("extensions.webapi.testing.http", true);
results = await contentPage.sendMessage("Test:Check", {});
equal(results.page, "original", "webRequest redirect fails on a privileged page");
equal(results.script, "original", "webRequest redirect fails from a privileged page");
await extension.unload();
await contentPage.close();
});
add_task(async function test_no_webRequestBlocking_error() {
function background() {
const expectedError = "Using webRequest.addListener with the blocking option " +
"requires the 'webRequestBlocking' permission.";
const blockingEvents = [
"onBeforeRequest", "onBeforeSendHeaders", "onHeadersReceived", "onAuthRequired",
];
for (let eventName of blockingEvents) {
browser.test.assertThrows(() => {
browser.webRequest[eventName].addListener(details => {}, {urls: ["<all_urls>"]}, ["blocking"]);
}, expectedError, `Got the expected exception for a blocking webRequest.${eventName} listener`);
}
}
const extensionData = {
manifest: {permissions: ["webRequest", "<all_urls>"]},
background,
};
const extension = ExtensionTestUtils.loadExtension(extensionData);
await extension.startup();
await extension.unload();
});