summaryrefslogtreecommitdiffstats
path: root/devtools/server/tests/browser/browser_debugger_server.js
blob: 8b36076b34993d56554efccd3619da3dec323d03 (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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

"use strict";

// Test basic features of DevToolsServer

add_task(async function () {
  // When running some other tests before, they may not destroy the main server.
  // Do it manually before running our tests.
  if (DevToolsServer.initialized) {
    DevToolsServer.destroy();
  }

  await testDevToolsServerInitialized();
  await testDevToolsServerKeepAlive();
});

async function testDevToolsServerInitialized() {
  const tab = await addTab("data:text/html;charset=utf-8,foo");

  ok(
    !DevToolsServer.initialized,
    "By default, the DevToolsServer isn't initialized in parent process"
  );
  await assertServerInitialized(
    tab,
    false,
    "By default, the DevToolsServer isn't initialized not in content process"
  );
  await assertDevToolsOpened(
    tab,
    false,
    "By default, the DevTools are reported as closed"
  );

  const commands = await CommandsFactory.forTab(tab);

  ok(
    DevToolsServer.initialized,
    "Creating the commands will initialize the DevToolsServer in parent process"
  );
  await assertServerInitialized(
    tab,
    false,
    "Creating the commands isn't enough to initialize the DevToolsServer in content process"
  );
  await assertDevToolsOpened(
    tab,
    false,
    "DevTools are still reported as closed after having created the commands"
  );

  await commands.targetCommand.startListening();

  await assertServerInitialized(
    tab,
    true,
    "Initializing the TargetCommand will initialize the DevToolsServer in content process"
  );
  await assertDevToolsOpened(
    tab,
    true,
    "Initializing the TargetCommand will start reporting the DevTools as opened"
  );

  await commands.destroy();

  // Disconnecting the client will remove all connections from both server, in parent and content process.
  ok(
    !DevToolsServer.initialized,
    "Destroying the commands destroys the DevToolsServer in the parent process"
  );
  await assertServerInitialized(
    tab,
    false,
    "But destroying the commands ends up destroying the DevToolsServer in the content process"
  );
  await assertDevToolsOpened(
    tab,
    false,
    "Destroying the commands will report DevTools as being closed"
  );

  gBrowser.removeCurrentTab();
  DevToolsServer.destroy();
}

async function testDevToolsServerKeepAlive() {
  const tab = await addTab("data:text/html;charset=utf-8,foo");

  await assertServerInitialized(
    tab,
    false,
    "Server not started in content process"
  );
  await assertDevToolsOpened(tab, false, "DevTools are reported as closed");

  const commands = await CommandsFactory.forTab(tab);
  await commands.targetCommand.startListening();

  await assertServerInitialized(tab, true, "Server started in content process");
  await assertDevToolsOpened(tab, true, "DevTools are reported as opened");

  info("Set DevToolsServer.keepAlive to true in the content process");
  DevToolsServer.keepAlive = true;
  await setContentServerKeepAlive(tab, true);

  info("Destroy the commands, the content server should be kept alive");
  await commands.destroy();

  await assertServerInitialized(
    tab,
    true,
    "Server still running in content process"
  );
  await assertDevToolsOpened(
    tab,
    false,
    "DevTools are reported as close, even if the server is still running because there is no more client connected"
  );

  ok(
    DevToolsServer.initialized,
    "Destroying the commands never destroys the DevToolsServer in the parent process when keepAlive is true"
  );

  info("Set DevToolsServer.keepAlive back to false");
  DevToolsServer.keepAlive = false;
  await setContentServerKeepAlive(tab, false);

  info("Create and destroy a commands again");
  const newCommands = await CommandsFactory.forTab(tab);
  await newCommands.targetCommand.startListening();

  await newCommands.destroy();

  await assertServerInitialized(
    tab,
    false,
    "Server stopped in content process"
  );
  await assertDevToolsOpened(
    tab,
    false,
    "DevTools are reported as closed after destroying the second commands"
  );

  ok(
    !DevToolsServer.initialized,
    "When turning keepAlive to false, the server in the parent process is destroyed"
  );

  gBrowser.removeCurrentTab();
  DevToolsServer.destroy();
}

async function assertServerInitialized(tab, expected, message) {
  await SpecialPowers.spawn(
    tab.linkedBrowser,
    [expected, message],
    function (_expected, _message) {
      const { require } = ChromeUtils.importESModule(
        "resource://devtools/shared/loader/Loader.sys.mjs"
      );
      const {
        DevToolsServer,
      } = require("resource://devtools/server/devtools-server.js");
      is(DevToolsServer.initialized, _expected, _message);
    }
  );
}

async function assertDevToolsOpened(tab, expected, message) {
  await SpecialPowers.spawn(
    tab.linkedBrowser,
    [expected, message],
    function (_expected, _message) {
      is(ChromeUtils.isDevToolsOpened(), _expected, _message);
    }
  );
}

async function setContentServerKeepAlive(tab, keepAlive, message) {
  await SpecialPowers.spawn(
    tab.linkedBrowser,
    [keepAlive],
    function (_keepAlive) {
      const { require } = ChromeUtils.importESModule(
        "resource://devtools/shared/loader/Loader.sys.mjs"
      );
      const {
        DevToolsServer,
      } = require("resource://devtools/server/devtools-server.js");
      DevToolsServer.keepAlive = _keepAlive;
    }
  );
}