Bug 1284020: Treat window.fetch/window.XMLHttpRequest the same as the global variants in content scripts. r?aswan draft
authorKris Maglione <maglione.k@gmail.com>
Tue, 12 Jul 2016 15:45:07 -0700
changeset 386861 7b0b15350bf1b5db96917dfe2a2db6829e6ddaae
parent 386528 f87c66fa12c635e07cd071dbfb9646258b7896d2
child 525232 0a0c340aeed290d9157d8f9fc6bca60a997d1d85
push id22833
push usermaglione.k@gmail.com
push dateTue, 12 Jul 2016 22:46:03 +0000
reviewersaswan
bugs1284020
milestone50.0a1
Bug 1284020: Treat window.fetch/window.XMLHttpRequest the same as the global variants in content scripts. r?aswan MozReview-Commit-ID: Cuz6CiNZdrd
toolkit/components/extensions/ExtensionContent.jsm
toolkit/components/extensions/test/mochitest/test_ext_permission_xhr.html
--- 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(() => {