tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

browser_blocking_image.js (5359B)


      1 const TEST_URI =
      2  getRootDirectory(gTestPath).replace(
      3    "chrome://mochitests/content",
      4    "https://example.com"
      5  ) + "file_blocking_image.html";
      6 
      7 /**
      8 * Loading an image from https:// should work.
      9 */
     10 add_task(async function load_image_from_https_test() {
     11  let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI);
     12  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
     13 
     14  gBrowser.selectedTab = tab;
     15 
     16  await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
     17    function imgListener(img) {
     18      return new Promise((resolve, reject) => {
     19        img.addEventListener("load", () => resolve());
     20        img.addEventListener("error", () => reject());
     21      });
     22    }
     23 
     24    let img = content.document.createElement("img");
     25    img.src = "https://example.com/tests/image/test/mochitest/shaver.png";
     26    content.document.body.appendChild(img);
     27 
     28    try {
     29      await imgListener(img);
     30      Assert.ok(true);
     31    } catch (e) {
     32      Assert.ok(false);
     33    }
     34  });
     35 
     36  gBrowser.removeTab(tab);
     37 });
     38 
     39 /**
     40 * Loading an image from http:// should be rejected.
     41 */
     42 add_task(async function load_image_from_http_test() {
     43  let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI);
     44  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
     45 
     46  gBrowser.selectedTab = tab;
     47 
     48  await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
     49    function imgListener(img) {
     50      return new Promise((resolve, reject) => {
     51        img.addEventListener("load", () => reject());
     52        img.addEventListener("error", () => resolve());
     53      });
     54    }
     55 
     56    let img = content.document.createElement("img");
     57    img.src = "http://example.com/tests/image/test/mochitest/shaver.png";
     58    content.document.body.appendChild(img);
     59 
     60    try {
     61      await imgListener(img);
     62      Assert.ok(true);
     63    } catch (e) {
     64      Assert.ok(false);
     65    }
     66  });
     67 
     68  gBrowser.removeTab(tab);
     69 });
     70 
     71 /**
     72 * Loading an image from http:// immediately after loading from https://
     73 * The load from https:// should be replaced.
     74 */
     75 add_task(async function load_https_and_http_test() {
     76  let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI);
     77  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
     78 
     79  // Clear image cache, otherwise in non-e10s mode the image might be cached by
     80  // previous test, and make the image from https is loaded immediately.
     81  let imgTools = Cc["@mozilla.org/image/tools;1"].getService(Ci.imgITools);
     82  let imageCache = imgTools.getImgCacheForDocument(window.document);
     83  imageCache.clearCache(false); // false=content
     84 
     85  gBrowser.selectedTab = tab;
     86 
     87  await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
     88    function imgListener(img) {
     89      return new Promise((resolve, reject) => {
     90        img.addEventListener("load", () => reject());
     91        img.addEventListener("error", () => resolve());
     92      });
     93    }
     94 
     95    let img = content.document.createElement("img");
     96    img.src = "https://example.com/tests/image/test/mochitest/shaver.png";
     97    img.src = "http://example.com/tests/image/test/mochitest/shaver.png";
     98 
     99    content.document.body.appendChild(img);
    100 
    101    try {
    102      await imgListener(img);
    103      Assert.ok(true);
    104    } catch (e) {
    105      Assert.ok(false);
    106    }
    107  });
    108 
    109  gBrowser.removeTab(tab);
    110 });
    111 
    112 /**
    113 * Loading an image from https.
    114 * Then after we have size information of the image, we immediately change the
    115 * location to a http:// site (hence should be blocked by CSP).
    116 */
    117 add_task(async function block_pending_request_test() {
    118  let tab = BrowserTestUtils.addTab(gBrowser, TEST_URI);
    119  await BrowserTestUtils.browserLoaded(tab.linkedBrowser);
    120 
    121  gBrowser.selectedTab = tab;
    122 
    123  await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
    124    let wrapper = {
    125      _resolve: null,
    126      _sizeAvail: false,
    127 
    128      sizeAvailable(request) {
    129        // In non-e10s mode the image may have already been cached, so sometimes
    130        // sizeAvailable() is called earlier then waitUntilSizeAvailable().
    131        if (this._resolve) {
    132          this._resolve();
    133        } else {
    134          this._sizeAvail = true;
    135        }
    136      },
    137 
    138      waitUntilSizeAvailable() {
    139        return new Promise(resolve => {
    140          this._resolve = resolve;
    141          if (this._sizeAvail) {
    142            resolve();
    143          }
    144        });
    145      },
    146 
    147      QueryInterface(aIID) {
    148        if (aIID.equals(Ci.imgIScriptedNotificationObserver)) {
    149          return this;
    150        }
    151        throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
    152      },
    153    };
    154 
    155    let observer = Cc["@mozilla.org/image/tools;1"]
    156      .getService(Ci.imgITools)
    157      .createScriptedObserver(wrapper);
    158 
    159    let img = content.document.createElement("img");
    160    img.src = "https://example.com/tests/image/test/mochitest/shaver.png";
    161    img.addObserver(observer);
    162 
    163    content.document.body.appendChild(img);
    164 
    165    info("Wait until Size Available");
    166    await wrapper.waitUntilSizeAvailable();
    167    info("Size Available now!");
    168    img.removeObserver(observer);
    169 
    170    let req = img.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST);
    171    // Now we change to load from http:// site, which will be blocked.
    172    img.src = "http://example.com/tests/image/test/mochitest/shaver.png";
    173 
    174    Assert.equal(
    175      img.getRequest(Ci.nsIImageLoadingContent.CURRENT_REQUEST),
    176      req,
    177      "CURRENT_REQUEST shouldn't be replaced."
    178    );
    179  });
    180 
    181  gBrowser.removeTab(tab);
    182 });