summaryrefslogtreecommitdiffstats
path: root/testing/mochitest/tests/SimpleTest/LogController.js
blob: 29580022f80e13fae60638203a79d8875e2d96e7 (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
94
95
96
/* 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/. */

var LogController = {}; //create the logger object

LogController.counter = 0; //current log message number
LogController.listeners = [];
LogController.logLevel = {
  FATAL: 50,
  ERROR: 40,
  WARNING: 30,
  INFO: 20,
  DEBUG: 10,
};

/* set minimum logging level */
LogController.logLevelAtLeast = function (minLevel) {
  if (typeof minLevel == "string") {
    minLevel = LogController.logLevel[minLevel];
  }
  return function (msg) {
    var msgLevel = msg.level;
    if (typeof msgLevel == "string") {
      msgLevel = LogController.logLevel[msgLevel];
    }
    return msgLevel >= minLevel;
  };
};

/* creates the log message with the given level and info */
LogController.createLogMessage = function (level, info) {
  var msg = {};
  msg.num = LogController.counter;
  msg.level = level;
  msg.info = info;
  msg.timestamp = new Date();
  return msg;
};

/* helper method to return a sub-array */
LogController.extend = function (args, skip) {
  var ret = [];
  for (var i = skip; i < args.length; i++) {
    ret.push(args[i]);
  }
  return ret;
};

/* logs message with given level. Currently used locally by log() and error() */
LogController.logWithLevel = function (level, message /*, ...*/) {
  var msg = LogController.createLogMessage(
    level,
    LogController.extend(arguments, 1)
  );
  LogController.dispatchListeners(msg);
  LogController.counter += 1;
};

/* log with level INFO */
LogController.log = function (message /*, ...*/) {
  LogController.logWithLevel("INFO", message);
};

/* log with level ERROR */
LogController.error = function (message /*, ...*/) {
  LogController.logWithLevel("ERROR", message);
};

/* send log message to listeners */
LogController.dispatchListeners = function (msg) {
  for (var k in LogController.listeners) {
    var pair = LogController.listeners[k];
    if (pair.ident != k || (pair[0] && !pair[0](msg))) {
      continue;
    }
    pair[1](msg);
  }
};

/* add a listener to this log given an identifier, a filter (can be null) and the listener object */
LogController.addListener = function (ident, filter, listener) {
  if (typeof filter == "string") {
    filter = LogController.logLevelAtLeast(filter);
  } else if (filter !== null && typeof filter !== "function") {
    throw new Error("Filter must be a string, a function, or null");
  }
  var entry = [filter, listener];
  entry.ident = ident;
  LogController.listeners[ident] = entry;
};

/* remove a listener from this log */
LogController.removeListener = function (ident) {
  delete LogController.listeners[ident];
};