tor-browser

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

browser_messagemanager_unload.js (3244B)


      1 function frameScript() {
      2  function eventHandler(e) {
      3    if (!docShell) {
      4      sendAsyncMessage("Test:Fail", "docShell is null");
      5    }
      6 
      7    sendAsyncMessage("Test:Event", [
      8      e.type,
      9      e.target === content.document,
     10      e.eventPhase,
     11    ]);
     12  }
     13 
     14  let outerID = content.docShell.outerWindowID;
     15  function onOuterWindowDestroyed(subject, topic, data) {
     16    if (docShell) {
     17      sendAsyncMessage("Test:Fail", "docShell is non-null");
     18    }
     19 
     20    let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data;
     21    sendAsyncMessage("Test:Event", ["outer-window-destroyed", id == outerID]);
     22    if (id == outerID) {
     23      Services.obs.removeObserver(
     24        onOuterWindowDestroyed,
     25        "outer-window-destroyed"
     26      );
     27    }
     28  }
     29 
     30  let url =
     31    "https://example.com/browser/dom/base/test/file_messagemanager_unload.html";
     32 
     33  content.location = url;
     34  addEventListener(
     35    "load",
     36    e => {
     37      if (e.target.location != url) {
     38        return;
     39      }
     40 
     41      addEventListener("unload", eventHandler, false);
     42      addEventListener("unload", eventHandler, true);
     43      addEventListener("pagehide", eventHandler, false);
     44      addEventListener("pagehide", eventHandler, true);
     45      Services.obs.addObserver(
     46        onOuterWindowDestroyed,
     47        "outer-window-destroyed"
     48      );
     49 
     50      sendAsyncMessage("Test:Ready");
     51    },
     52    true
     53  );
     54 }
     55 
     56 const EXPECTED = [
     57  // Unload events on the BrowserChildGlobal. These come first so that the
     58  // docshell is available.
     59  ["unload", false, 2],
     60  ["unload", false, 2],
     61 
     62  // pagehide and unload events for the top-level page.
     63  ["pagehide", true, 1],
     64  ["pagehide", true, 3],
     65  ["unload", true, 1],
     66 
     67  // pagehide and unload events for the iframe.
     68  ["pagehide", false, 1],
     69  ["pagehide", false, 3],
     70  ["unload", false, 1],
     71 
     72  // outer-window-destroyed for both pages.
     73  ["outer-window-destroyed", false],
     74  ["outer-window-destroyed", true],
     75 ];
     76 
     77 function test() {
     78  waitForExplicitFinish();
     79 
     80  var newTab = BrowserTestUtils.addTab(gBrowser, "about:blank");
     81  gBrowser.selectedTab = newTab;
     82 
     83  let browser = newTab.linkedBrowser;
     84  let frameLoader = browser.frameLoader;
     85  Assert.notStrictEqual(frameLoader, null, "frameLoader looks okay");
     86 
     87  browser.messageManager.loadFrameScript(
     88    "data:,(" + frameScript.toString() + ")()",
     89    false
     90  );
     91 
     92  browser.messageManager.addMessageListener(
     93    "Test:Fail",
     94    msg => {
     95      ok(false, msg.data);
     96    },
     97    true
     98  );
     99 
    100  let index = 0;
    101  browser.messageManager.addMessageListener(
    102    "Test:Event",
    103    msg => {
    104      Assert.strictEqual(msg.target, browser, "<browser> is correct");
    105      Assert.strictEqual(
    106        msg.targetFrameLoader,
    107        frameLoader,
    108        "frameLoader is correct"
    109      );
    110      Assert.strictEqual(
    111        browser.frameLoader,
    112        null,
    113        "browser frameloader null during teardown"
    114      );
    115 
    116      info(JSON.stringify(msg.data));
    117 
    118      is(
    119        JSON.stringify(msg.data),
    120        JSON.stringify(EXPECTED[index]),
    121        "results match"
    122      );
    123      index++;
    124 
    125      if (index == EXPECTED.length) {
    126        finish();
    127      }
    128    },
    129    true
    130  );
    131 
    132  browser.messageManager.addMessageListener("Test:Ready", () => {
    133    info("Got ready message");
    134    gBrowser.removeCurrentTab();
    135  });
    136 }