summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_resend_csp.js
blob: bb087470d6fe0e930003fb369a59077b12c35ed4 (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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* Any copyright is dedicated to the Public Domain.
 *  http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

/**
 * Tests if resending an image request uses the same content type
 * and hence is not blocked by the CSP of the page.
 */

add_task(async function () {
  if (
    Services.prefs.getBoolPref(
      "devtools.netmonitor.features.newEditAndResend",
      true
    )
  ) {
    ok(
      true,
      "Skip this test when pref is true, because this panel won't be default when that is the case."
    );
    return;
  }
  const { tab, monitor } = await initNetMonitor(CSP_RESEND_URL, {
    requestCount: 1,
  });
  const { document, store, windowRequire } = monitor.panelWin;
  const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
  store.dispatch(Actions.batchEnable(false));

  // Executes 1 request
  await performRequests(monitor, tab, 1);

  // Select the image request
  const imgRequest = document.querySelectorAll(".request-list-item")[0];
  EventUtils.sendMouseEvent({ type: "mousedown" }, imgRequest);

  // Stores original request for comparison of values later
  const { getSelectedRequest } = windowRequire(
    "devtools/client/netmonitor/src/selectors/index"
  );
  const origReq = getSelectedRequest(store.getState());

  // Context Menu > "Resend"
  EventUtils.sendMouseEvent({ type: "contextmenu" }, imgRequest);

  const waitForResentRequest = waitForNetworkEvents(monitor, 1);
  await selectContextMenuItem(monitor, "request-list-context-resend-only");
  await waitForResentRequest;

  // Selects request that was resent
  const selReq = getSelectedRequest(store.getState());

  // Finally, some sanity checks
  ok(selReq.url.endsWith("test-image.png"), "Correct request selected");
  Assert.strictEqual(origReq.url, selReq.url, "Orig and Sel url match");

  Assert.strictEqual(selReq.cause.type, "img", "Correct type of selected");
  Assert.strictEqual(
    origReq.cause.type,
    selReq.cause.type,
    "Orig and Sel type match"
  );

  const cspOBJ = await SpecialPowers.spawn(tab.linkedBrowser, [], async () => {
    return JSON.parse(content.document.cspJSON);
  });

  const policies = cspOBJ["csp-policies"];
  is(policies.length, 1, "CSP: should be one policy");
  const policy = policies[0];
  is(`${policy["img-src"]}`, "*", "CSP: img-src should be *");

  await teardown(monitor);
});

/**
 * Tests if resending an image request uses the same content type
 * and hence is not blocked by the CSP of the page.
 */

add_task(async function () {
  if (
    Services.prefs.getBoolPref(
      "devtools.netmonitor.features.newEditAndResend",
      true
    )
  ) {
    const { tab, monitor } = await initNetMonitor(CSP_RESEND_URL, {
      requestCount: 1,
    });
    const { document, store, windowRequire } = monitor.panelWin;
    const Actions = windowRequire(
      "devtools/client/netmonitor/src/actions/index"
    );
    store.dispatch(Actions.batchEnable(false));

    // Executes 1 request
    await performRequests(monitor, tab, 1);

    // Select the image request
    const imgRequest = document.querySelectorAll(".request-list-item")[0];
    EventUtils.sendMouseEvent({ type: "mousedown" }, imgRequest);

    // Stores original request for comparison of values later
    const { getSelectedRequest } = windowRequire(
      "devtools/client/netmonitor/src/selectors/index"
    );
    const origReq = getSelectedRequest(store.getState());

    // Context Menu > "Resend"
    EventUtils.sendMouseEvent({ type: "contextmenu" }, imgRequest);

    info("Opening the new request panel");
    const waitForPanels = waitUntil(
      () =>
        document.querySelector(".http-custom-request-panel") &&
        document.querySelector("#http-custom-request-send-button").disabled ===
          false
    );

    await selectContextMenuItem(monitor, "request-list-context-edit-resend");
    await waitForPanels;

    const waitForResentRequest = waitForNetworkEvents(monitor, 1);
    const buttonSend = document.querySelector(
      "#http-custom-request-send-button"
    );
    buttonSend.click();
    await waitForResentRequest;

    // Selects request that was resent
    const selReq = getSelectedRequest(store.getState());

    // Finally, some sanity checks
    ok(selReq.url.endsWith("test-image.png"), "Correct request selected");
    Assert.strictEqual(origReq.url, selReq.url, "Orig and Sel url match");

    Assert.strictEqual(selReq.cause.type, "img", "Correct type of selected");
    Assert.strictEqual(
      origReq.cause.type,
      selReq.cause.type,
      "Orig and Sel type match"
    );

    const cspOBJ = await SpecialPowers.spawn(
      tab.linkedBrowser,
      [],
      async () => {
        return JSON.parse(content.document.cspJSON);
      }
    );

    const policies = cspOBJ["csp-policies"];
    is(policies.length, 1, "CSP: should be one policy");
    const policy = policies[0];
    is(`${policy["img-src"]}`, "*", "CSP: img-src should be *");

    await teardown(monitor);
  }
});