browser_commands_from_url.js (4910B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 const TEST_URI = 5 "data:text/html;charset=utf-8," + "<p>browser_target-from-url.js</p>"; 6 7 const { DevToolsLoader } = ChromeUtils.importESModule( 8 "resource://devtools/shared/loader/Loader.sys.mjs" 9 ); 10 const { 11 commandsFromURL, 12 } = require("resource://devtools/client/framework/commands-from-url.js"); 13 14 Services.prefs.setBoolPref("devtools.debugger.remote-enabled", true); 15 Services.prefs.setBoolPref("devtools.debugger.prompt-connection", false); 16 17 function assertTarget(target, url) { 18 is(target.url, url); 19 is(target.isBrowsingContext, true); 20 } 21 22 add_task(async function () { 23 const tab = await addTab(TEST_URI); 24 const browser = tab.linkedBrowser; 25 let commands, target; 26 27 info("Test invalid type"); 28 try { 29 await commandsFromURL(new URL("https://foo?type=x")); 30 ok(false, "Shouldn't pass"); 31 } catch (e) { 32 is(e.message, "commandsFromURL, unsupported type 'x' parameter"); 33 } 34 35 info("Test tab"); 36 commands = await commandsFromURL( 37 new URL("https://foo?type=tab&id=" + browser.browserId) 38 ); 39 // Descriptor's getTarget will only work if the TargetCommand watches for the first top target 40 await commands.targetCommand.startListening(); 41 42 // For now, we can't spawn a commands flagged as 'local tab' via URL query params 43 // The only way to has isLocalTab is to create the toolbox via showToolboxForTab 44 // and spawn the command via CommandsFactory.forTab. 45 is( 46 commands.descriptorFront.isLocalTab, 47 false, 48 "Even if we refer to a local tab, isLocalTab is false (for now)" 49 ); 50 51 target = await commands.descriptorFront.getTarget(); 52 53 assertTarget(target, TEST_URI); 54 await commands.destroy(); 55 56 info("Test invalid tab id"); 57 try { 58 await commandsFromURL(new URL("https://foo?type=tab&id=10000")); 59 ok(false, "Shouldn't pass"); 60 } catch (e) { 61 is(e.message, "commandsFromURL, tab with browserId '10000' doesn't exist"); 62 } 63 64 info("Test parent process"); 65 commands = await commandsFromURL(new URL("https://foo?type=process")); 66 target = await commands.descriptorFront.getTarget(); 67 const topWindow = Services.wm.getMostRecentBrowserWindow(); 68 assertTarget(target, topWindow.location.href); 69 await commands.destroy(); 70 71 await testRemoteTCP(); 72 await testRemoteWebSocket(); 73 74 gBrowser.removeCurrentTab(); 75 }); 76 77 async function setupDevToolsServer(webSocket) { 78 info("Create a separate loader instance for the DevToolsServer."); 79 const loader = new DevToolsLoader(); 80 const { DevToolsServer } = loader.require( 81 "resource://devtools/server/devtools-server.js" 82 ); 83 const { SocketListener } = loader.require( 84 "resource://devtools/shared/security/socket.js" 85 ); 86 87 DevToolsServer.init(); 88 DevToolsServer.registerAllActors(); 89 DevToolsServer.allowChromeProcess = true; 90 const socketOptions = { 91 // Pass -1 to automatically choose an available port 92 portOrPath: -1, 93 webSocket, 94 }; 95 96 const listener = new SocketListener(DevToolsServer, socketOptions); 97 ok(listener, "Socket listener created"); 98 await listener.open(); 99 is(DevToolsServer.listeningSockets, 1, "1 listening socket"); 100 101 return { DevToolsServer, listener }; 102 } 103 104 function teardownDevToolsServer({ DevToolsServer, listener }) { 105 info("Close the listener socket"); 106 listener.close(); 107 is(DevToolsServer.listeningSockets, 0, "0 listening sockets"); 108 109 info("Destroy the temporary devtools server"); 110 DevToolsServer.destroy(); 111 } 112 113 async function testRemoteTCP() { 114 info("Test remote process via TCP Connection"); 115 116 const server = await setupDevToolsServer(false); 117 118 const { port } = server.listener; 119 const commands = await commandsFromURL( 120 new URL("https://foo?type=process&host=127.0.0.1&port=" + port) 121 ); 122 const target = await commands.descriptorFront.getTarget(); 123 const topWindow = Services.wm.getMostRecentBrowserWindow(); 124 assertTarget(target, topWindow.location.href); 125 126 const settings = commands.client._transport.connectionSettings; 127 is(settings.host, "127.0.0.1"); 128 is(parseInt(settings.port, 10), port); 129 is(settings.webSocket, false); 130 131 await commands.destroy(); 132 133 teardownDevToolsServer(server); 134 } 135 136 async function testRemoteWebSocket() { 137 info("Test remote process via WebSocket Connection"); 138 139 const server = await setupDevToolsServer(true); 140 141 const { port } = server.listener; 142 const commands = await commandsFromURL( 143 new URL("https://foo?type=process&host=127.0.0.1&port=" + port + "&ws=true") 144 ); 145 const target = await commands.descriptorFront.getTarget(); 146 const topWindow = Services.wm.getMostRecentBrowserWindow(); 147 assertTarget(target, topWindow.location.href); 148 149 const settings = commands.client._transport.connectionSettings; 150 is(settings.host, "127.0.0.1"); 151 is(parseInt(settings.port, 10), port); 152 is(settings.webSocket, true); 153 await commands.destroy(); 154 155 teardownDevToolsServer(server); 156 }