comparison chrome/MozillaFileLogger.js @ 198:59d4f04497dd

package into extension for profile, add direct file logging instead of stdout r=vlad
author Joel Maher <jmaher@mozilla.com>
date Tue, 05 Oct 2010 17:01:29 -0400
parents
children
comparison
equal deleted inserted replaced
197:b4da709724e1 198:59d4f04497dd
1 /**
2 * MozillaFileLogger, a log listener that can write to a local file.
3 */
4
5 var ipcMode = false; // running in e10s build and need to use IPC?
6 try {
7 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
8 var ipcsanity = Components.classes["@mozilla.org/preferences-service;1"]
9 .getService(Components.interfaces.nsIPrefBranch);
10 ipcsanity.setIntPref("mochitest.ipcmode", 0);
11 } catch (e) {
12 ipcMode = true;
13 }
14
15 function contentDispatchEvent(type, data, sync) {
16 if (typeof(data) === "undefined") {
17 data = {};
18 }
19
20 var element = document.createEvent("datacontainerevent");
21 element.initEvent("contentEvent", true, false);
22 element.setData("sync", sync);
23 element.setData("type", type);
24 element.setData("data", JSON.stringify(data));
25 document.dispatchEvent(element);
26 }
27
28 function contentSyncEvent(type, data) {
29 contentDispatchEvent(type, data, 1);
30 }
31
32 function contentAsyncEvent(type, data) {
33 contentDispatchEvent(type, data, 0);
34 }
35
36 try {
37 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
38
39 if (Cc === undefined) {
40 var Cc = Components.classes;
41 var Ci = Components.interfaces;
42 }
43 } catch (ex) {} //running in ipcMode-chrome
44
45 try {
46 const FOSTREAM_CID = "@mozilla.org/network/file-output-stream;1";
47 const LF_CID = "@mozilla.org/file/local;1";
48
49 // File status flags. It is a bitwise OR of the following bit flags.
50 // Only one of the first three flags below may be used.
51 const PR_READ_ONLY = 0x01; // Open for reading only.
52 const PR_WRITE_ONLY = 0x02; // Open for writing only.
53 const PR_READ_WRITE = 0x04; // Open for reading and writing.
54
55 // If the file does not exist, the file is created.
56 // If the file exists, this flag has no effect.
57 const PR_CREATE_FILE = 0x08;
58
59 // The file pointer is set to the end of the file prior to each write.
60 const PR_APPEND = 0x10;
61
62 // If the file exists, its length is truncated to 0.
63 const PR_TRUNCATE = 0x20;
64
65 // If set, each write will wait for both the file data
66 // and file status to be physically updated.
67 const PR_SYNC = 0x40;
68
69 // If the file does not exist, the file is created. If the file already
70 // exists, no action and NULL is returned.
71 const PR_EXCL = 0x80;
72 } catch (ex) {
73 // probably not running in the test harness
74 }
75
76 /** Init the file logger with the absolute path to the file.
77 It will create and append if the file already exists **/
78 var MozillaFileLogger = {};
79
80
81 MozillaFileLogger.init = function(path) {
82 if (ipcMode) {
83 contentAsyncEvent("LoggerInit", {"filename": path});
84 return;
85 }
86
87 try {
88 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
89 } catch (ex) {} //running in ipcMode-chrome
90
91 MozillaFileLogger._file = Cc[LF_CID].createInstance(Ci.nsILocalFile);
92 MozillaFileLogger._file.initWithPath(path);
93 MozillaFileLogger._foStream = Cc[FOSTREAM_CID].createInstance(Ci.nsIFileOutputStream);
94 MozillaFileLogger._foStream.init(this._file, PR_WRITE_ONLY | PR_CREATE_FILE | PR_APPEND,
95 0664, 0);
96 }
97
98 MozillaFileLogger.getLogCallback = function() {
99 if (ipcMode) {
100 return function(msg) {
101 contentAsyncEvent("Logger", {"num": msg.num, "level": msg.level, "info": msg.info.join(' ')});
102 }
103 }
104
105 return function (msg) {
106 try {
107 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
108 } catch(ex) {} //running in ipcMode-chrome
109
110 var data = msg.num + " " + msg.level + " " + msg.info.join(' ') + "\n";
111 if (MozillaFileLogger._foStream)
112 MozillaFileLogger._foStream.write(data, data.length);
113
114 if (data.indexOf("SimpleTest FINISH") >= 0) {
115 MozillaFileLogger.close();
116 }
117 }
118 }
119
120 // This is only used from chrome space by the reftest harness
121 MozillaFileLogger.log = function(msg) {
122 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
123 if (MozillaFileLogger._foStream)
124 MozillaFileLogger._foStream.write(msg, msg.length);
125 }
126
127 MozillaFileLogger.close = function() {
128 if (ipcMode) {
129 contentAsyncEvent("LoggerClose");
130 return;
131 }
132
133 try {
134 netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
135 } catch(ex) {} //running in ipcMode-chrome
136
137 if(MozillaFileLogger._foStream)
138 MozillaFileLogger._foStream.close();
139
140 MozillaFileLogger._foStream = null;
141 MozillaFileLogger._file = null;
142 }
143
144 if (ipcMode == false) {
145 try {
146 var prefs = Components.classes['@mozilla.org/preferences-service;1']
147 .getService(Components.interfaces.nsIPrefBranch2);
148 var filename = prefs.getCharPref('talos.logfile');
149 MozillaFileLogger.init(filename);
150 } catch (ex) {} //pref does not exist, return empty string
151 }
152
153