Bug 1221187: testing/marionette: Set log level from preference; r?automatedtester
This change allows the logging level for Marionette to be set using
a preference. This lets an out-of-process program control Marionette's
logging level.
It also changes the logging defaults to print log messages with the level
Log.Level.Info and above for optimised builds, and Log.Level.Trace
and above for non-optimised/debug builds.
The log level can be set through the marionette.logging preference.
It holds a string value that needs to correspond to a level defined in
toolkit/modules/Log.jsm's Log.Level enum.
--- a/testing/marionette/components/marionettecomponent.js
+++ b/testing/marionette/components/marionettecomponent.js
@@ -14,54 +14,65 @@ const ENABLED_PREF = "marionette.default
const PORT_PREF = "marionette.defaultPrefs.port";
const FORCELOCAL_PREF = "marionette.force-local";
const LOG_PREF = "marionette.logging";
const ServerSocket = CC("@mozilla.org/network/server-socket;1",
"nsIServerSocket",
"initSpecialConnection");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/Log.jsm");
+Cu.import("resource://gre/modules/Preferences.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
function MarionetteComponent() {
this.loaded_ = false;
this.observerService = Services.obs;
-
- this.logger = Log.repository.getLogger("Marionette");
- this.logger.level = Log.Level.Trace;
- let dumper = false;
-#ifdef DEBUG
- dumper = true;
-#endif
-#ifdef MOZ_B2G
- dumper = true;
-#endif
- try {
- if (dumper || Services.prefs.getBoolPref(LOG_PREF)) {
- let formatter = new Log.BasicFormatter();
- this.logger.addAppender(new Log.DumpAppender(formatter));
- }
- } catch(e) {}
+ this.logger = this.setupLogger_(this.determineLoggingLevel_());
}
MarionetteComponent.prototype = {
classDescription: "Marionette component",
classID: MARIONETTE_CID,
contractID: MARIONETTE_CONTRACTID,
QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler, Ci.nsIObserver]),
_xpcom_categories: [
{category: "command-line-handler", entry: "b-marionette"},
{category: "profile-after-change", service: true}
],
enabled: false,
finalUiStartup: false,
- server: null
+ server: null,
+};
+
+MarionetteComponent.prototype.setupLogger_ = function(level) {
+ let log = Log.repository.getLogger("Marionette");
+ log.level = level;
+ log.addAppender(new Log.DumpAppender());
+ return log;
+};
+
+MarionetteComponent.prototype.determineLoggingLevel_ = function() {
+ let level = Log.Level.Info;
+#ifdef DEBUG
+ level = Log.Level.Trace;
+#endif
+
+ // marionette.logging pref can override default
+ // with an entry from the Log.Level enum
+ if (Preferences.has(LOG_PREF)) {
+ let s = Preferences.get(LOG_PREF);
+ s = s.toLowerCase();
+ s = s.charAt(0).toUpperCase() + s.slice(1);
+ level = Log.Level[s];
+ }
+
+ return level;
};
MarionetteComponent.prototype.onSocketAccepted = function(
socket, transport) {
this.logger.info("onSocketAccepted for Marionette dummy socket");
};
MarionetteComponent.prototype.onStopListening = function(socket, status) {
@@ -69,33 +80,33 @@ MarionetteComponent.prototype.onStopList
socket.close();
};
/** Check cmdLine argument for {@code --marionette}. */
MarionetteComponent.prototype.handle = function(cmdLine) {
// if the CLI is there then lets do work otherwise nothing to see
if (cmdLine.handleFlag("marionette", false)) {
this.enabled = true;
- this.logger.info("Marionette enabled via command-line flag");
+ this.logger.debug("Marionette enabled via command-line flag");
this.init();
}
};
MarionetteComponent.prototype.observe = function(subj, topic, data) {
switch (topic) {
case "profile-after-change":
// Using final-ui-startup as the xpcom category doesn't seem to work,
// so we wait for that by adding an observer here.
this.observerService.addObserver(this, "final-ui-startup", false);
#ifdef ENABLE_MARIONETTE
try {
this.enabled = Services.prefs.getBoolPref(ENABLED_PREF);
} catch(e) {}
if (this.enabled) {
- this.logger.info("Marionette enabled via build flag and pref");
+ this.logger.debug("Marionette enabled via build flag and pref");
// We want to suppress the modal dialog that's shown
// when starting up in safe-mode to enable testing.
if (Services.appinfo.inSafeMode) {
this.observerService.addObserver(this, "domwindowopened", false);
}
}
#endif
--- a/testing/marionette/dispatcher.js
+++ b/testing/marionette/dispatcher.js
@@ -231,15 +231,12 @@ Dispatcher.prototype.sendMessage = funct
* @param {Object} payload
* The payload to ship.
*/
Dispatcher.prototype.sendRaw = function(payload) {
this.conn.send(payload);
};
Dispatcher.prototype.log_ = function(msg) {
- if (logger.level > Log.Level.Debug) {
- return;
- }
let a = (msg.origin == MessageOrigin.Client ? " -> " : " <- ");
let s = JSON.stringify(msg.toMsg());
logger.trace(this.connId + a + s);
};