summaryrefslogtreecommitdiffstats
path: root/devtools/shared/commands/resource/tests/browser_resources_network_event_stacktraces.js
blob: 2200fcad9c5de547366417c923b2b5c12e9aabc2 (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
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test the ResourceCommand API around NETWORK_EVENT_STACKTRACE

const TEST_URI = `${URL_ROOT_SSL}network_document.html`;

const REQUEST_STUB = {
  code: `await fetch("/request_post_0.html", { method: "POST" });`,
  expected: {
    stacktraceAvailable: true,
    lastFrame: {
      filename:
        "https://example.com/browser/devtools/shared/commands/resource/tests/network_document.html",
      lineNumber: 1,
      columnNumber: 40,
      functionName: "triggerRequest",
      asyncCause: null,
    },
  },
};

add_task(async function () {
  info("Test network stacktraces events");
  const tab = await addTab(TEST_URI);
  const { client, resourceCommand, targetCommand } = await initResourceCommand(
    tab
  );

  const networkEvents = new Map();
  const stackTraces = new Map();

  function onResourceAvailable(resources) {
    for (const resource of resources) {
      if (
        resource.resourceType === resourceCommand.TYPES.NETWORK_EVENT_STACKTRACE
      ) {
        ok(
          !networkEvents.has(resource.resourceId),
          "The network event does not exist"
        );

        is(
          resource.stacktraceAvailable,
          REQUEST_STUB.expected.stacktraceAvailable,
          "The stacktrace is available"
        );
        is(
          JSON.stringify(resource.lastFrame),
          JSON.stringify(REQUEST_STUB.expected.lastFrame),
          "The last frame of the stacktrace is available"
        );

        stackTraces.set(resource.resourceId, true);
        return;
      }

      if (resource.resourceType === resourceCommand.TYPES.NETWORK_EVENT) {
        ok(
          stackTraces.has(resource.stacktraceResourceId),
          "The stack trace does exists"
        );

        networkEvents.set(resource.resourceId, true);
      }
    }
  }

  function onResourceUpdated() {}

  await resourceCommand.watchResources(
    [
      resourceCommand.TYPES.NETWORK_EVENT_STACKTRACE,
      resourceCommand.TYPES.NETWORK_EVENT,
    ],
    {
      onAvailable: onResourceAvailable,
      onUpdated: onResourceUpdated,
    }
  );

  await triggerNetworkRequests(tab.linkedBrowser, [REQUEST_STUB.code]);

  resourceCommand.unwatchResources(
    [
      resourceCommand.TYPES.NETWORK_EVENT_STACKTRACE,
      resourceCommand.TYPES.NETWORK_EVENT,
    ],
    {
      onAvailable: onResourceAvailable,
      onUpdated: onResourceUpdated,
    }
  );

  targetCommand.destroy();
  await client.close();
  BrowserTestUtils.removeTab(tab);
});