summaryrefslogtreecommitdiffstats
path: root/remote/domains/content/Log.jsm
blob: 316f1adfebdc35e54aa1062475097fe96a13a3ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* 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 = ["Log"];

const { ContentProcessDomain } = ChromeUtils.import(
  "chrome://remote/content/domains/ContentProcessDomain.jsm"
);
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");

const CONSOLE_MESSAGE_LEVEL_MAP = {
  [Ci.nsIConsoleMessage.debug]: "verbose",
  [Ci.nsIConsoleMessage.info]: "info",
  [Ci.nsIConsoleMessage.warn]: "warning",
  [Ci.nsIConsoleMessage.error]: "error",
};

class Log extends ContentProcessDomain {
  constructor(session) {
    super(session);
    this.enabled = false;
  }

  destructor() {
    this.disable();

    super.destructor();
  }

  enable() {
    if (!this.enabled) {
      this.enabled = true;

      Services.console.registerListener(this);
    }
  }

  disable() {
    if (this.enabled) {
      this.enabled = false;

      Services.console.unregisterListener(this);
    }
  }

  _getLogCategory(category) {
    if (category.startsWith("CORS")) {
      return "network";
    } else if (category.includes("javascript")) {
      return "javascript";
    }

    return "other";
  }

  // nsIObserver

  /**
   * Takes all script error messages that do not have an exception attached,
   * and emits a "Log.entryAdded" event.
   *
   * @param {nsIConsoleMessage} message
   *     Message originating from the nsIConsoleService.
   */
  observe(message) {
    if (message instanceof Ci.nsIScriptError && !message.hasException) {
      let url;
      if (message.sourceName !== "debugger eval code") {
        url = message.sourceName;
      }

      const entry = {
        source: this._getLogCategory(message.category),
        level: CONSOLE_MESSAGE_LEVEL_MAP[message.logLevel],
        text: message.errorMessage,
        timestamp: message.timeStamp,
        url,
        lineNumber: message.lineNumber,
      };

      this.emit("Log.entryAdded", { entry });
    }
  }

  // XPCOM

  get QueryInterface() {
    return ChromeUtils.generateQI(["nsIConsoleListener"]);
  }
}