summaryrefslogtreecommitdiffstats
path: root/remote/shared/Log.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--remote/shared/Log.sys.mjs79
1 files changed, 79 insertions, 0 deletions
diff --git a/remote/shared/Log.sys.mjs b/remote/shared/Log.sys.mjs
new file mode 100644
index 0000000000..9cc97d9d51
--- /dev/null
+++ b/remote/shared/Log.sys.mjs
@@ -0,0 +1,79 @@
+/* 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/. */
+
+import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+
+import { Log as StdLog } from "resource://gre/modules/Log.sys.mjs";
+
+const PREF_REMOTE_LOG_LEVEL = "remote.log.level";
+
+// We still check the marionette log preference for backward compatibility.
+// This can be removed when geckodriver 0.30 (bug 1686110) has been released.
+const PREF_MARIONETTE_LOG_LEVEL = "marionette.log.level";
+
+const lazy = {};
+
+// Lazy getter which will return the preference (remote or marionette) which has
+// the most verbose log level.
+XPCOMUtils.defineLazyGetter(lazy, "prefLogLevel", () => {
+ function getLogLevelNumber(pref) {
+ const level = Services.prefs.getCharPref(pref, "Fatal");
+ return (
+ StdLog.Level.Numbers[level.toUpperCase()] || StdLog.Level.Numbers.FATAL
+ );
+ }
+
+ const marionetteNumber = getLogLevelNumber(PREF_MARIONETTE_LOG_LEVEL);
+ const remoteNumber = getLogLevelNumber(PREF_REMOTE_LOG_LEVEL);
+
+ if (marionetteNumber < remoteNumber) {
+ return PREF_MARIONETTE_LOG_LEVEL;
+ }
+
+ return PREF_REMOTE_LOG_LEVEL;
+});
+
+/** E10s compatible wrapper for the standard logger from Log.sys.mjs. */
+export class Log {
+ static TYPES = {
+ CDP: "CDP",
+ MARIONETTE: "Marionette",
+ REMOTE_AGENT: "RemoteAgent",
+ WEBDRIVER_BIDI: "WebDriver BiDi",
+ };
+
+ /**
+ * Get a logger instance. For each provided type, a dedicated logger instance
+ * will be returned, but all loggers are relying on the same preference.
+ *
+ * @param {String} type
+ * The type of logger to use. Protocol-specific modules should use the
+ * corresponding logger type. Eg. files under /marionette should use
+ * Log.TYPES.MARIONETTE.
+ */
+ static get(type = Log.TYPES.REMOTE_AGENT) {
+ const logger = StdLog.repository.getLogger(type);
+ if (!logger.ownAppenders.length) {
+ logger.addAppender(new StdLog.DumpAppender());
+ logger.manageLevelFromPref(lazy.prefLogLevel);
+ }
+ return logger;
+ }
+
+ /**
+ * Check if the current log level matches the Trace log level. This should be
+ * used to guard logger.trace calls and avoid instanciating logger instances
+ * unnecessarily.
+ */
+ static get isTraceLevel() {
+ return [StdLog.Level.All, StdLog.Level.Trace].includes(lazy.prefLogLevel);
+ }
+
+ static get verbose() {
+ // we can't use Preferences.sys.mjs before first paint,
+ // see ../browser/base/content/test/performance/browser_startup.js
+ const level = Services.prefs.getStringPref(PREF_REMOTE_LOG_LEVEL, "Info");
+ return StdLog.Level[level] >= StdLog.Level.Info;
+ }
+}