test_devtools_socket_status.js (4447B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const { 7 useDistinctSystemPrincipalLoader, 8 releaseDistinctSystemPrincipalLoader, 9 } = ChromeUtils.importESModule( 10 "resource://devtools/shared/loader/DistinctSystemPrincipalLoader.sys.mjs", 11 { global: "shared" } 12 ); 13 14 const { DevToolsSocketStatus } = ChromeUtils.importESModule( 15 "resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs" 16 ); 17 18 add_task(async function () { 19 Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true); 20 Services.prefs.setBoolPref("devtools.debugger.prompt-connection", false); 21 22 info("Without any server started, all states should be set to false"); 23 checkSocketStatus(false, false); 24 25 info("Start a first server, expect all states to change to true"); 26 const server = await setupDevToolsServer({ fromBrowserToolbox: false }); 27 checkSocketStatus(true, true); 28 29 info("Start another server, expect all states to remain true"); 30 const otherServer = await setupDevToolsServer({ fromBrowserToolbox: false }); 31 checkSocketStatus(true, true); 32 33 info("Shutdown one of the servers, expect all states to remain true"); 34 teardownDevToolsServer(otherServer); 35 checkSocketStatus(true, true); 36 37 info("Shutdown the other server, expect all states to change to false"); 38 teardownDevToolsServer(server); 39 checkSocketStatus(false, false); 40 41 info( 42 "Start a 'browser toolbox' server, expect only the 'include' state to become true" 43 ); 44 const browserToolboxServer = await setupDevToolsServer({ 45 fromBrowserToolbox: true, 46 }); 47 checkSocketStatus(true, false); 48 49 info( 50 "Shutdown the 'browser toolbox' server, expect all states to become false" 51 ); 52 teardownDevToolsServer(browserToolboxServer); 53 checkSocketStatus(false, false); 54 55 Services.prefs.clearUserPref("devtools.debugger.remote-enabled"); 56 Services.prefs.clearUserPref("devtools.debugger.prompt-connection"); 57 }); 58 59 function checkSocketStatus(expectedExcludeFalse, expectedExcludeTrue) { 60 const openedDefault = DevToolsSocketStatus.hasSocketOpened(); 61 const openedExcludeFalse = DevToolsSocketStatus.hasSocketOpened({ 62 excludeBrowserToolboxSockets: false, 63 }); 64 const openedExcludeTrue = DevToolsSocketStatus.hasSocketOpened({ 65 excludeBrowserToolboxSockets: true, 66 }); 67 68 equal( 69 openedDefault, 70 openedExcludeFalse, 71 "DevToolsSocketStatus.hasSocketOpened should default to excludeBrowserToolboxSockets=false" 72 ); 73 equal( 74 openedExcludeFalse, 75 expectedExcludeFalse, 76 "DevToolsSocketStatus matches the expectation for excludeBrowserToolboxSockets=false" 77 ); 78 equal( 79 openedExcludeTrue, 80 expectedExcludeTrue, 81 "DevToolsSocketStatus matches the expectation for excludeBrowserToolboxSockets=true" 82 ); 83 } 84 85 async function setupDevToolsServer({ fromBrowserToolbox }) { 86 info("Use the dedicated system principal loader for the DevToolsServer."); 87 const requester = {}; 88 const loader = useDistinctSystemPrincipalLoader(requester); 89 90 const { DevToolsServer } = loader.require( 91 "resource://devtools/server/devtools-server.js" 92 ); 93 94 DevToolsServer.init(); 95 DevToolsServer.registerAllActors(); 96 DevToolsServer.allowChromeProcess = true; 97 const socketOptions = { 98 fromBrowserToolbox, 99 // Pass -1 to automatically choose an available port 100 portOrPath: -1, 101 }; 102 103 const listener = new SocketListener(DevToolsServer, socketOptions); 104 ok(listener, "Socket listener created"); 105 106 // Note that useDistinctSystemPrincipalLoader will lead to reuse the same 107 // loader if we are creating several servers in a row. The DevToolsServer 108 // singleton might already have sockets opened. 109 const listeningSockets = DevToolsServer.listeningSockets; 110 await listener.open(); 111 equal( 112 DevToolsServer.listeningSockets, 113 listeningSockets + 1, 114 "A new listening socket was created" 115 ); 116 117 return { DevToolsServer, listener, requester }; 118 } 119 120 function teardownDevToolsServer({ DevToolsServer, listener, requester }) { 121 info("Close the listener socket"); 122 const listeningSockets = DevToolsServer.listeningSockets; 123 listener.close(); 124 equal( 125 DevToolsServer.listeningSockets, 126 listeningSockets - 1, 127 "A listening socket was closed" 128 ); 129 130 if (DevToolsServer.listeningSockets == 0) { 131 info("Destroy the temporary devtools server"); 132 DevToolsServer.destroy(); 133 } 134 135 if (requester) { 136 releaseDistinctSystemPrincipalLoader(requester); 137 } 138 }