summaryrefslogtreecommitdiffstats
path: root/devtools/client/framework/target-from-url.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/framework/target-from-url.js')
-rw-r--r--devtools/client/framework/target-from-url.js120
1 files changed, 120 insertions, 0 deletions
diff --git a/devtools/client/framework/target-from-url.js b/devtools/client/framework/target-from-url.js
new file mode 100644
index 000000000..4e2c30377
--- /dev/null
+++ b/devtools/client/framework/target-from-url.js
@@ -0,0 +1,120 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { Cu, Ci } = require("chrome");
+
+const { TargetFactory } = require("devtools/client/framework/target");
+const { DebuggerServer } = require("devtools/server/main");
+const { DebuggerClient } = require("devtools/shared/client/main");
+const { Task } = require("devtools/shared/task");
+
+/**
+ * Construct a Target for a given URL object having various query parameters:
+ *
+ * host:
+ * {String} The hostname or IP address to connect to.
+ * port:
+ * {Number} The TCP port to connect to, to use with `host` argument.
+ * ws:
+ * {Boolean} If true, connect via websocket instread of regular TCP connection.
+ *
+ * type: tab, process
+ * {String} The type of target to connect to. Currently tabs and processes are supported types.
+ *
+ * If type="tab":
+ * id:
+ * {Number} the tab outerWindowID
+ * chrome: Optional
+ * {Boolean} Force the creation of a chrome target. Gives more privileges to the tab
+ * actor. Allows chrome execution in the webconsole and see chrome files in
+ * the debugger. (handy when contributing to firefox)
+ *
+ * If type="process":
+ * id:
+ * {Number} the process id to debug. Default to 0, which is the parent process.
+ *
+ * @param {URL} url
+ * The url to fetch query params from.
+ *
+ * @return A target object
+ */
+exports.targetFromURL = Task.async(function* (url) {
+ let params = url.searchParams;
+ let type = params.get("type");
+ if (!type) {
+ throw new Error("targetFromURL, missing type parameter");
+ }
+ let id = params.get("id");
+ // Allows to spawn a chrome enabled target for any context
+ // (handy to debug chrome stuff in a child process)
+ let chrome = params.has("chrome");
+
+ let client = yield createClient(params);
+
+ yield client.connect();
+
+ let form, isTabActor;
+ if (type === "tab") {
+ // Fetch target for a remote tab
+ id = parseInt(id);
+ if (isNaN(id)) {
+ throw new Error("targetFromURL, wrong tab id:'" + id + "', should be a number");
+ }
+ try {
+ let response = yield client.getTab({ outerWindowID: id });
+ form = response.tab;
+ } catch (ex) {
+ if (ex.error == "noTab") {
+ throw new Error("targetFromURL, tab with outerWindowID:'" + id + "' doesn't exist");
+ }
+ throw ex;
+ }
+ } else if (type == "process") {
+ // Fetch target for a remote chrome actor
+ DebuggerServer.allowChromeProcess = true;
+ try {
+ id = parseInt(id);
+ if (isNaN(id)) {
+ id = 0;
+ }
+ let response = yield client.getProcess(id);
+ form = response.form;
+ chrome = true;
+ if (id != 0) {
+ // Child process are not exposing tab actors and only support debugger+console
+ isTabActor = false;
+ }
+ } catch (ex) {
+ if (ex.error == "noProcess") {
+ throw new Error("targetFromURL, process with id:'" + id + "' doesn't exist");
+ }
+ throw ex;
+ }
+ } else {
+ throw new Error("targetFromURL, unsupported type='" + type + "' parameter");
+ }
+
+ return TargetFactory.forRemoteTab({ client, form, chrome, isTabActor });
+});
+
+function* createClient(params) {
+ let host = params.get("host");
+ let port = params.get("port");
+ let webSocket = !!params.get("ws");
+
+ let transport;
+ if (port) {
+ transport = yield DebuggerClient.socketConnect({ host, port, webSocket });
+ } else {
+ // Setup a server if we don't have one already running
+ if (!DebuggerServer.initialized) {
+ DebuggerServer.init();
+ DebuggerServer.addBrowserActors();
+ }
+ transport = DebuggerServer.connectPipe()
+ }
+ return new DebuggerClient(transport);
+}