summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_security-tab-visibility.js
blob: 8ffc8efd503f48eac4241d597eb2c510a1063cf7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

/**
 * Test that security details tab is visible only when it should.
 */

add_task(async function () {
  // This test explicitly asserts some insecure domains.
  await pushPref("dom.security.https_first", false);

  const TEST_DATA = [
    {
      desc: "http request",
      uri: "http://example.com" + CORS_SJS_PATH,
      visibleOnNewEvent: false,
      visibleOnSecurityInfo: false,
      visibleOnceComplete: false,
      securityState: "insecure",
    },
    {
      desc: "working https request",
      uri: "https://example.com" + CORS_SJS_PATH,
      visibleOnNewEvent: true,
      visibleOnSecurityInfo: true,
      visibleOnceComplete: true,
      securityState: "secure",
    },
    {
      desc: "broken https request",
      uri: "https://nocert.example.com",
      isBroken: true,
      visibleOnNewEvent: true,
      visibleOnSecurityInfo: true,
      visibleOnceComplete: true,
      securityState: "broken",
    },
  ];

  const { tab, monitor } = await initNetMonitor(CUSTOM_GET_URL, {
    requestCount: 1,
  });
  const { document, store, windowRequire } = monitor.panelWin;
  const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
  const { getSelectedRequest } = windowRequire(
    "devtools/client/netmonitor/src/selectors/index"
  );

  store.dispatch(Actions.batchEnable(false));

  for (const testcase of TEST_DATA) {
    info("Testing Security tab visibility for " + testcase.desc);
    const onNewItem = monitor.panelWin.api.once(TEST_EVENTS.NETWORK_EVENT);
    const onComplete = testcase.isBroken
      ? waitForSecurityBrokenNetworkEvent()
      : waitForNetworkEvents(monitor, 1);

    info("Performing a request to " + testcase.uri);
    await SpecialPowers.spawn(
      tab.linkedBrowser,
      [testcase.uri],
      async function (url) {
        content.wrappedJSObject.performRequests(1, url);
      }
    );

    info("Waiting for new network event.");
    await onNewItem;

    info("Waiting for request to complete.");
    await onComplete;

    info("Selecting the request.");
    EventUtils.sendMouseEvent(
      { type: "mousedown" },
      document.querySelectorAll(".request-list-item")[0]
    );

    is(
      getSelectedRequest(store.getState()).securityState,
      testcase.securityState,
      "Security state is immediately set"
    );
    is(
      !!document.querySelector("#security-tab"),
      testcase.visibleOnNewEvent,
      "Security tab is " +
        (testcase.visibleOnNewEvent ? "visible" : "hidden") +
        " after new request was added to the menu."
    );

    if (testcase.visibleOnSecurityInfo) {
      // click security panel to lazy load the securityState
      await waitUntil(() => document.querySelector("#security-tab"));
      clickOnSidebarTab(document, "security");
      await waitUntil(() =>
        document.querySelector("#security-panel .security-info-value")
      );
      info("Waiting for security information to arrive.");

      await waitUntil(
        () => !!getSelectedRequest(store.getState()).securityState
      );
    }

    is(
      !!document.querySelector("#security-tab"),
      testcase.visibleOnSecurityInfo,
      "Security tab is " +
        (testcase.visibleOnSecurityInfo ? "visible" : "hidden") +
        " after security information arrived."
    );

    is(
      !!document.querySelector("#security-tab"),
      testcase.visibleOnceComplete,
      "Security tab is " +
        (testcase.visibleOnceComplete ? "visible" : "hidden") +
        " after request has been completed."
    );

    await clearNetworkEvents(monitor);
  }

  return teardown(monitor);

  /**
   * Returns a promise that's resolved once a request with security issues is
   * completed.
   */
  function waitForSecurityBrokenNetworkEvent() {
    const awaitedEvents = ["UPDATING_EVENT_TIMINGS", "RECEIVED_EVENT_TIMINGS"];

    const promises = awaitedEvents.map(event => {
      return monitor.panelWin.api.once(EVENTS[event]);
    });

    return Promise.all(promises);
  }
});