Bug 1685822 [wpt PR 27117] - Update wpt metadata, a=testonly
[gecko.git] / remote / JSONHandler.jsm
blob4a8167289311c31446615adccaa961d09aa6f56e
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 var EXPORTED_SYMBOLS = ["JSONHandler"];
9 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
11 const { HTTP_404, HTTP_505 } = ChromeUtils.import(
12   "chrome://remote/content/server/HTTPD.jsm"
14 const { Log } = ChromeUtils.import("chrome://remote/content/Log.jsm");
15 const { Protocol } = ChromeUtils.import("chrome://remote/content/Protocol.jsm");
16 const { RemoteAgentError } = ChromeUtils.import(
17   "chrome://remote/content/Error.jsm"
20 class JSONHandler {
21   constructor(agent) {
22     this.agent = agent;
23     this.routes = {
24       "/json/version": this.getVersion.bind(this),
25       "/json/protocol": this.getProtocol.bind(this),
26       "/json/list": this.getTargetList.bind(this),
27     };
28   }
30   getVersion() {
31     const mainProcessTarget = this.agent.targets.getMainProcessTarget();
33     const { userAgent } = Cc[
34       "@mozilla.org/network/protocol;1?name=http"
35     ].getService(Ci.nsIHttpProtocolHandler);
37     return {
38       Browser: `${Services.appinfo.name}/${Services.appinfo.version}`,
39       "Protocol-Version": "1.0",
40       "User-Agent": userAgent,
41       "V8-Version": "1.0",
42       "WebKit-Version": "1.0",
43       webSocketDebuggerUrl: mainProcessTarget.toJSON().webSocketDebuggerUrl,
44     };
45   }
47   getProtocol() {
48     return Protocol.Description;
49   }
51   getTargetList() {
52     return [...this.agent.targets];
53   }
55   // nsIHttpRequestHandler
57   handle(request, response) {
58     if (request.method != "GET") {
59       throw HTTP_404;
60     }
62     if (!(request.path in this.routes)) {
63       throw HTTP_404;
64     }
66     try {
67       const body = this.routes[request.path]();
68       const payload = JSON.stringify(body, null, Log.verbose ? "\t" : null);
70       response.setStatusLine(request.httpVersion, 200, "OK");
71       response.setHeader("Content-Type", "application/json");
72       response.write(payload);
73     } catch (e) {
74       new RemoteAgentError(e).notify();
75       throw HTTP_505;
76     }
77   }
79   // XPCOM
81   get QueryInterface() {
82     return ChromeUtils.generateQI(["nsIHttpRequestHandler"]);
83   }