tor-browser

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

browser_net_security-tab-visibility.js (4160B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 /**
      7 * Test that security details tab is visible only when it should.
      8 */
      9 
     10 add_task(async function () {
     11  // This test explicitly asserts some insecure domains.
     12  await pushPref("dom.security.https_first", false);
     13 
     14  const TEST_DATA = [
     15    {
     16      desc: "http request",
     17      uri: "http://example.com" + CORS_SJS_PATH,
     18      visibleOnNewEvent: false,
     19      visibleOnSecurityInfo: false,
     20      visibleOnceComplete: false,
     21      securityState: "insecure",
     22    },
     23    {
     24      desc: "working https request",
     25      uri: "https://example.com" + CORS_SJS_PATH,
     26      visibleOnNewEvent: true,
     27      visibleOnSecurityInfo: true,
     28      visibleOnceComplete: true,
     29      securityState: "secure",
     30    },
     31    {
     32      desc: "broken https request",
     33      uri: "https://nocert.example.com",
     34      isBroken: true,
     35      visibleOnNewEvent: true,
     36      visibleOnSecurityInfo: true,
     37      visibleOnceComplete: true,
     38      securityState: "broken",
     39    },
     40  ];
     41 
     42  const { tab, monitor } = await initNetMonitor(CUSTOM_GET_URL, {
     43    requestCount: 1,
     44  });
     45  const { document, store, windowRequire } = monitor.panelWin;
     46  const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
     47  const { getSelectedRequest } = windowRequire(
     48    "devtools/client/netmonitor/src/selectors/index"
     49  );
     50 
     51  store.dispatch(Actions.batchEnable(false));
     52 
     53  for (const testcase of TEST_DATA) {
     54    info("Testing Security tab visibility for " + testcase.desc);
     55    const onNewItem = monitor.panelWin.api.once(TEST_EVENTS.NETWORK_EVENT);
     56    const onComplete = testcase.isBroken
     57      ? waitForSecurityBrokenNetworkEvent()
     58      : waitForNetworkEvents(monitor, 1);
     59 
     60    info("Performing a request to " + testcase.uri);
     61    await SpecialPowers.spawn(
     62      tab.linkedBrowser,
     63      [testcase.uri],
     64      async function (url) {
     65        content.wrappedJSObject.performRequests(1, url);
     66      }
     67    );
     68 
     69    info("Waiting for new network event.");
     70    await onNewItem;
     71 
     72    info("Waiting for request to complete.");
     73    await onComplete;
     74 
     75    info("Selecting the request.");
     76    EventUtils.sendMouseEvent(
     77      { type: "mousedown" },
     78      document.querySelectorAll(".request-list-item")[0]
     79    );
     80 
     81    await waitForAllNetworkUpdateEvents();
     82 
     83    is(
     84      getSelectedRequest(store.getState()).securityState,
     85      testcase.securityState,
     86      "Security state is immediately set"
     87    );
     88    is(
     89      !!document.querySelector("#security-tab"),
     90      testcase.visibleOnNewEvent,
     91      "Security tab is " +
     92        (testcase.visibleOnNewEvent ? "visible" : "hidden") +
     93        " after new request was added to the menu."
     94    );
     95 
     96    if (testcase.visibleOnSecurityInfo) {
     97      // click security panel to lazy load the securityState
     98      await waitUntil(() => document.querySelector("#security-tab"));
     99      clickOnSidebarTab(document, "security");
    100      await waitUntil(() =>
    101        document.querySelector("#security-panel .security-info-value")
    102      );
    103      info("Waiting for security information to arrive.");
    104 
    105      await waitUntil(
    106        () => !!getSelectedRequest(store.getState()).securityState
    107      );
    108    }
    109 
    110    is(
    111      !!document.querySelector("#security-tab"),
    112      testcase.visibleOnSecurityInfo,
    113      "Security tab is " +
    114        (testcase.visibleOnSecurityInfo ? "visible" : "hidden") +
    115        " after security information arrived."
    116    );
    117 
    118    is(
    119      !!document.querySelector("#security-tab"),
    120      testcase.visibleOnceComplete,
    121      "Security tab is " +
    122        (testcase.visibleOnceComplete ? "visible" : "hidden") +
    123        " after request has been completed."
    124    );
    125 
    126    await clearNetworkEvents(monitor);
    127  }
    128 
    129  return teardown(monitor);
    130 
    131  /**
    132   * Returns a promise that's resolved once a request with security issues is
    133   * completed.
    134   */
    135  function waitForSecurityBrokenNetworkEvent() {
    136    const awaitedEvents = ["UPDATING_EVENT_TIMINGS", "RECEIVED_EVENT_TIMINGS"];
    137 
    138    const promises = awaitedEvents.map(event => {
    139      return monitor.panelWin.api.once(EVENTS[event]);
    140    });
    141 
    142    return Promise.all(promises);
    143  }
    144 });