fune/devtools/shared/security/tests/xpcshell/test_devtools_socket_status.js

111 lines
3.6 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { DevToolsLoader } = ChromeUtils.import(
"resource://devtools/shared/loader/Loader.jsm"
);
const { DevToolsSocketStatus } = ChromeUtils.import(
"resource://devtools/shared/security/DevToolsSocketStatus.jsm"
);
add_task(async function() {
Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true);
Services.prefs.setBoolPref("devtools.debugger.prompt-connection", false);
info("Without any server started, all states should be set to false");
checkSocketStatus(false, false);
info("Start a first server, expect all states to change to true");
const server = await setupDevToolsServer({ fromBrowserToolbox: false });
checkSocketStatus(true, true);
info("Start another server, expect all states to remain true");
const otherServer = await setupDevToolsServer({ fromBrowserToolbox: false });
checkSocketStatus(true, true);
info("Shutdown one of the servers, expect all states to remain true");
teardownDevToolsServer(otherServer);
checkSocketStatus(true, true);
info("Shutdown the other server, expect all states to change to false");
teardownDevToolsServer(server);
checkSocketStatus(false, false);
info(
"Start a 'browser toolbox' server, expect only the 'include' state to become true"
);
const browserToolboxServer = await setupDevToolsServer({
fromBrowserToolbox: true,
});
checkSocketStatus(true, false);
info(
"Shutdown the 'browser toolbox' server, expect all states to become false"
);
teardownDevToolsServer(browserToolboxServer);
checkSocketStatus(false, false);
Services.prefs.clearUserPref("devtools.debugger.remote-enabled");
Services.prefs.clearUserPref("devtools.debugger.prompt-connection");
});
function checkSocketStatus(expectedExcludeFalse, expectedExcludeTrue) {
const openedDefault = DevToolsSocketStatus.hasSocketOpened();
const openedExcludeFalse = DevToolsSocketStatus.hasSocketOpened({
excludeBrowserToolboxSockets: false,
});
const openedExcludeTrue = DevToolsSocketStatus.hasSocketOpened({
excludeBrowserToolboxSockets: true,
});
equal(
openedDefault,
openedExcludeFalse,
"DevToolsSocketStatus.hasSocketOpened should default to excludeBrowserToolboxSockets=false"
);
equal(
openedExcludeFalse,
expectedExcludeFalse,
"DevToolsSocketStatus matches the expectation for excludeBrowserToolboxSockets=false"
);
equal(
openedExcludeTrue,
expectedExcludeTrue,
"DevToolsSocketStatus matches the expectation for excludeBrowserToolboxSockets=true"
);
}
async function setupDevToolsServer({ fromBrowserToolbox }) {
info("Create a separate loader instance for the DevToolsServer.");
const loader = new DevToolsLoader();
const { DevToolsServer } = loader.require(
"resource://devtools/server/devtools-server.js"
);
DevToolsServer.init();
DevToolsServer.registerAllActors();
DevToolsServer.allowChromeProcess = true;
const socketOptions = {
fromBrowserToolbox,
// Pass -1 to automatically choose an available port
portOrPath: -1,
};
const listener = new SocketListener(DevToolsServer, socketOptions);
ok(listener, "Socket listener created");
await listener.open();
equal(DevToolsServer.listeningSockets, 1, "1 listening socket");
return { DevToolsServer, listener };
}
function teardownDevToolsServer({ DevToolsServer, listener }) {
info("Close the listener socket");
listener.close();
equal(DevToolsServer.listeningSockets, 0, "0 listening sockets");
info("Destroy the temporary devtools server");
DevToolsServer.destroy();
}