Bug 1284020: Treat window.fetch/window.XMLHttpRequest the same as the global variants in content scripts. r?aswan
MozReview-Commit-ID: Cuz6CiNZdrd
--- a/toolkit/components/extensions/ExtensionContent.jsm
+++ b/toolkit/components/extensions/ExtensionContent.jsm
@@ -381,16 +381,22 @@ class ExtensionContext extends BaseConte
this.sandbox = Cu.Sandbox(prin, {
metadata,
sandboxPrototype: contentWindow,
wantXrays: true,
isWebExtensionContentScript: true,
wantGlobalProperties: ["XMLHttpRequest", "fetch"],
});
+
+ Cu.evalInSandbox(`
+ window.JSON = JSON;
+ window.XMLHttpRequest = XMLHttpRequest;
+ window.fetch = fetch;
+ `, this.sandbox);
}
let delegate = {
getSender(context, target, sender) {
// Nothing to do here.
},
};
--- a/toolkit/components/extensions/test/mochitest/test_ext_permission_xhr.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_permission_xhr.html
@@ -12,24 +12,26 @@
<script type="text/javascript">
"use strict";
/* eslint-disable mozilla/balanced-listeners */
add_task(function* test_simple() {
function runTests(cx) {
- function xhr(url) {
- return new Promise((resolve, reject) => {
- let req = new XMLHttpRequest();
- req.open("GET", url);
- req.addEventListener("load", resolve);
- req.addEventListener("error", reject);
- req.send();
- });
+ function xhr(XMLHttpRequest) {
+ return (url) => {
+ return new Promise((resolve, reject) => {
+ let req = new XMLHttpRequest();
+ req.open("GET", url);
+ req.addEventListener("load", resolve);
+ req.addEventListener("error", reject);
+ req.send();
+ });
+ };
}
function run(shouldFail, fetch) {
function passListener() {
browser.test.succeed(`${cx}.${fetch.name} pass listener`);
}
function failListener() {
@@ -38,20 +40,24 @@ add_task(function* test_simple() {
if (shouldFail) {
return fetch("http://example.org/example.txt").then(failListener, passListener);
} else {
return fetch("http://example.com/example.txt").then(passListener, failListener);
}
}
- return run(true, xhr)
- .then(() => run(false, xhr))
+ return run(true, xhr(XMLHttpRequest))
+ .then(() => run(false, xhr(XMLHttpRequest)))
+ .then(() => run(true, xhr(window.XMLHttpRequest)))
+ .then(() => run(false, xhr(window.XMLHttpRequest)))
.then(() => run(true, fetch))
.then(() => run(false, fetch))
+ .then(() => run(true, window.fetch))
+ .then(() => run(false, window.fetch))
.catch(err => {
browser.test.fail(`Error: ${err} :: ${err.stack}`);
browser.test.notifyFail("permission_xhr");
});
}
function background(runTests) {
runTests("bg").then(() => {