tor-browser

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

test_child_docshell.js (2954B)


      1 "use strict";
      2 
      3 const { XPCShellContentUtils } = ChromeUtils.importESModule(
      4  "resource://testing-common/XPCShellContentUtils.sys.mjs"
      5 );
      6 
      7 XPCShellContentUtils.init(this);
      8 
      9 add_task(async function test() {
     10  let page = await XPCShellContentUtils.loadContentPage("about:blank", {
     11    remote: true,
     12  });
     13 
     14  await new Promise(resolve => {
     15    let mm = page.browser.messageManager;
     16    mm.addMessageListener("chromeEventHandler", function (msg) {
     17      var result = msg.json;
     18      equal(
     19        result.processType,
     20        Ci.nsIXULRuntime.PROCESS_TYPE_CONTENT,
     21        "The frame script is running in a real distinct child process"
     22      );
     23      ok(
     24        result.hasCorrectInterface,
     25        "docshell.chromeEventHandler has EventTarget interface"
     26      );
     27    });
     28 
     29    mm.addMessageListener("DOMWindowCreatedReceived", function (msg) {
     30      ok(true, "the chrome event handler looks functional");
     31      var result = msg.json;
     32      ok(
     33        result.stableChromeEventHandler,
     34        "docShell.chromeEventHandler is stable"
     35      );
     36      ok(result.iframeHasNewDocShell, "iframe spawns a new docShell");
     37      ok(
     38        result.iframeHasSameChromeEventHandler,
     39        "but iframe has the same chrome event handler"
     40      );
     41      resolve();
     42    });
     43 
     44    // Inject a frame script in the child process:
     45    page.loadFrameScript(async function () {
     46      /* eslint-env mozilla/frame-script */
     47      var chromeEventHandler = docShell.chromeEventHandler;
     48      sendAsyncMessage("chromeEventHandler", {
     49        processType: Services.appinfo.processType,
     50        hasCorrectInterface:
     51          chromeEventHandler && EventTarget.isInstance(chromeEventHandler),
     52      });
     53 
     54      /*
     55        Ensure that this chromeEventHandler actually works,
     56        by creating a new window and listening for its DOMWindowCreated event
     57      */
     58      chromeEventHandler.addEventListener(
     59        "DOMWindowCreated",
     60        function listener(evt) {
     61          if (evt.target == content.document) {
     62            return;
     63          }
     64          chromeEventHandler.removeEventListener("DOMWindowCreated", listener);
     65          let new_win = evt.target.defaultView;
     66          let new_docShell = new_win.docShell;
     67          sendAsyncMessage("DOMWindowCreatedReceived", {
     68            stableChromeEventHandler:
     69              chromeEventHandler === docShell.chromeEventHandler,
     70            iframeHasNewDocShell: new_docShell !== docShell,
     71            iframeHasSameChromeEventHandler:
     72              new_docShell.chromeEventHandler === chromeEventHandler,
     73          });
     74        }
     75      );
     76 
     77      if (content.document.readyState != "complete") {
     78        await new Promise(res =>
     79          addEventListener("load", res, { once: true, capture: true })
     80        );
     81      }
     82 
     83      let iframe = content.document.createElement("iframe");
     84      iframe.setAttribute("src", "data:text/html,foo");
     85      content.document.documentElement.appendChild(iframe);
     86    });
     87  });
     88 
     89  await page.close();
     90 });