summaryrefslogtreecommitdiffstats
path: root/devtools/client/netmonitor/test/browser_net_block-draganddrop.js
blob: 5a1abb467cefe3452aa2218e2b9ac7d4b4b4a5a9 (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
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

/**
 * Test blocking and unblocking a request.
 */

add_task(async function () {
  class DataTransfer {
    constructor() {
      this.BLOCKING_URL =
        "https://example.com/browser/devtools/client/netmonitor/test/html_simple-test-page.html";
      this.getDataTrigger = false;
      this.setDataTrigger = false;
      this.data = "";
    }

    setData(format, data) {
      this.setDataTrigger = true;
      ok(format === "text/plain", 'setData passed valid "text/plain" format');
      ok(data === this.BLOCKING_URL, "Data matches the expected URL");
      this.data = data;
    }

    getData(format) {
      this.getDataTrigger = true;
      ok(format === "text/plain", 'getData passed valid "text/plain" format');
      return this.data;
    }

    wasGetDataTriggered() {
      return this.getDataTrigger;
    }

    wasSetDataTriggered() {
      return this.setDataTrigger;
    }
  }

  const dataTransfer = new DataTransfer();

  const { tab, monitor } = await initNetMonitor(HTTPS_SIMPLE_URL, {
    requestCount: 1,
  });
  info("Starting test... ");

  const { document, store, windowRequire } = monitor.panelWin;
  const { getSelectedRequest } = windowRequire(
    "devtools/client/netmonitor/src/selectors/index"
  );
  const Actions = windowRequire("devtools/client/netmonitor/src/actions/index");
  store.dispatch(Actions.batchEnable(false));

  // Open the request blocking panel
  store.dispatch(Actions.toggleRequestBlockingPanel());

  // Reload to have one request in the list
  let waitForEvents = waitForNetworkEvents(monitor, 1);
  await navigateTo(HTTPS_SIMPLE_URL);
  await waitForEvents;

  // Capture normal request
  let normalRequestState;
  let normalRequestSize;
  {
    const requestBlockingPanel = document.querySelector(
      ".request-blocking-panel"
    );
    const firstRequest = document.querySelectorAll(".request-list-item")[0];
    const waitForHeaders = waitUntil(() =>
      document.querySelector(".headers-overview")
    );
    EventUtils.sendMouseEvent({ type: "mousedown" }, firstRequest);
    await waitForHeaders;
    normalRequestState = getSelectedRequest(store.getState());
    normalRequestSize = firstRequest.querySelector(
      ".requests-list-transferred"
    ).textContent;
    info("Captured normal request");

    // Drag and drop the list item
    const createBubbledEvent = (type, props = {}) => {
      const event = new Event(type, { bubbles: true });
      Object.assign(event, props);
      return event;
    };

    info('Dispatching "dragstart" event on first item of request list');
    firstRequest.dispatchEvent(
      createBubbledEvent("dragstart", {
        clientX: 0,
        clientY: 0,
        dataTransfer,
      })
    );

    ok(
      dataTransfer.wasSetDataTriggered() === true,
      'setData() was called during the "dragstart" event'
    );

    info('Dispatching "drop" event on request blocking list');
    requestBlockingPanel.dispatchEvent(
      createBubbledEvent("drop", {
        clientX: 0,
        clientY: 1,
        dataTransfer,
      })
    );

    ok(
      dataTransfer.wasGetDataTriggered() === true,
      'getData() was called during the "drop" event'
    );

    const onRequestBlocked = waitForDispatch(
      store,
      "REQUEST_BLOCKING_UPDATE_COMPLETE"
    );

    info("Wait for dropped request to be blocked");
    await onRequestBlocked;
    info("Dropped request is now blocked");
  }

  // Reload to have one request in the list
  info("Reloading to check block");
  // We can't use the normal waiting methods because a canceled request won't send all
  // the extra update packets.
  waitForEvents = waitForNetworkEvents(monitor, 1);
  tab.linkedBrowser.reload();
  await waitForEvents;

  // Capture blocked request, then unblock
  let blockedRequestState;
  let blockedRequestSize;
  {
    const firstRequest = document.querySelectorAll(".request-list-item")[0];
    blockedRequestSize = firstRequest.querySelector(
      ".requests-list-transferred"
    ).textContent;
    EventUtils.sendMouseEvent({ type: "mousedown" }, firstRequest);
    blockedRequestState = getSelectedRequest(store.getState());
    info("Captured blocked request");
  }

  ok(!normalRequestState.blockedReason, "Normal request is not blocked");
  ok(!normalRequestSize.includes("Blocked"), "Normal request has a size");

  ok(blockedRequestState.blockedReason, "Blocked request is blocked");
  ok(
    blockedRequestSize.includes("Blocked"),
    "Blocked request shows reason as size"
  );

  return teardown(monitor);
});