gecko-dev/remote/JSONHandler.jsm
Alexandre Poirot cf6ef6bab7 Bug 1533679 - Implement /json/version. r=ato
Introduces a new kind of target "main-process",
which is not bound to any particular browser-element/browsing-context.
This implements only a subtest of domains and typical won't support the "content" ones.

This will require some more work in order to acknowledge having multiple kinds of targets.
We will also have "worker", "addon" and remoted-frames which will be very similar to tabs.

Depends on D22690

Differential Revision: https://phabricator.services.mozilla.com/D22691

--HG--
extra : moz-landing-system : lando
2019-03-10 12:51:49 +00:00

82 lines
2.1 KiB
JavaScript

/* 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";
var EXPORTED_SYMBOLS = ["JSONHandler"];
const {HTTP_404, HTTP_505} = ChromeUtils.import("chrome://remote/content/server/HTTPD.jsm");
const {Log} = ChromeUtils.import("chrome://remote/content/Log.jsm");
const {Protocol} = ChromeUtils.import("chrome://remote/content/Protocol.jsm");
const {RemoteAgentError} = ChromeUtils.import("chrome://remote/content/Error.jsm");
class JSONHandler {
constructor(agent) {
this.agent = agent;
this.routes = {
"/json/version": this.getVersion.bind(this),
"/json/protocol": this.getProtocol.bind(this),
"/json/list": this.getTargetList.bind(this),
};
}
getVersion() {
const mainProcessTarget = this.agent.targets.getMainProcessTarget();
return {
"Browser": "Firefox",
"Protocol-Version": "1.0",
"User-Agent": "Mozilla",
"V8-Version": "1.0",
"WebKit-Version": "1.0",
"webSocketDebuggerUrl": mainProcessTarget.toJSON().webSocketDebuggerUrl,
};
}
getProtocol() {
return Protocol.Description;
}
getTargetList() {
return [...this.agent.targets];
}
// nsIHttpRequestHandler
handle(request, response) {
if (request.method != "GET") {
throw HTTP_404;
}
if (!(request.path in this.routes)) {
throw HTTP_404;
}
try {
const body = this.routes[request.path]();
const payload = JSON.stringify(body, sanitise, Log.verbose ? "\t" : undefined);
response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Content-Type", "application/json");
response.write(payload);
} catch (e) {
new RemoteAgentError(e).notify();
throw HTTP_505;
}
}
// XPCOM
get QueryInterface() {
return ChromeUtils.generateQI([Ci.nsIHttpRequestHandler]);
}
}
// Filters out null and empty strings
function sanitise(key, value) {
if (value === null || (typeof value == "string" && value.length == 0)) {
return undefined;
}
return value;
}