remote/JSONHandler.jsm
author Frédéric Wang <fred.wang@free.fr>
Wed, 06 Mar 2019 10:35:36 +0000
changeset 464610 19198c1c9f6216e1a0a127e31be6b8e143253499
parent 463402 735dcab78c931e2597907aebc043f0314af50e12
child 481406 07ce31daca134d974d5d1ee2c86f6fdc307d9aa4
permissions -rw-r--r--
Bug 1526863 [wpt PR 15301] - Import WPT fraction tests from WebKit, a=testonly Automatic update from web-platform-tests Import WPT fraction tests from WebKit (#15301) See https://bugs.webkit.org/show_bug.cgi?id=194436 Tests have been reformatted and rewritten. The following are excluded: - Tests have equivalent (and more reliable testing) in WPT. - Tests that verify crashes/asserts, hangs or invalid markup. -- wpt-commits: b7cddec48a109528df2d1ec5af4583de03b0edc8 wpt-pr: 15301

/* 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;
}