2
|
1 var nightly = {
|
|
2
|
|
3 variables: {
|
|
4 _appInfo: null,
|
|
5 get appInfo() {
|
|
6 if (!this._appInfo) {
|
|
7 this._appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
|
|
8 .getService(Components.interfaces.nsIXULAppInfo)
|
|
9 .QueryInterface(Components.interfaces.nsIXULRuntime);
|
|
10 }
|
|
11 return this._appInfo;
|
|
12 },
|
|
13
|
|
14 get appid() this.appInfo.ID,
|
|
15 get vendor() this.appInfo.vendor,
|
|
16 get name() this.appInfo.name,
|
|
17 get version() this.appInfo.version,
|
|
18 get appbuildid() this.appInfo.appBuildID,
|
|
19 get platformbuildid() this.appInfo.platformBuildID,
|
|
20 get platformversion() this.appInfo.platformVersion,
|
|
21 get geckobuildid() this.appInfo.platformBuildID,
|
|
22 get geckoversion() this.appInfo.platformVersion,
|
|
23 brandname: null,
|
|
24 get useragent() navigator.userAgent,
|
|
25 get locale() {
|
|
26 var registry = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
|
|
27 .getService(Components.interfaces.nsIXULChromeRegistry);
|
|
28 return registry.getSelectedLocale("global");
|
|
29 },
|
|
30 get os() this.appInfo.OS,
|
|
31 get processor() this.appInfo.XPCOMABI.split("-")[0],
|
|
32 get compiler() this.appInfo.XPCOMABI.split("-")[1],
|
|
33 defaulttitle: null,
|
|
34 profile: null,
|
|
35 toolkit: "cairo",
|
|
36 flags: ""
|
|
37 },
|
|
38
|
|
39 templates: {
|
|
40 },
|
|
41
|
|
42 preferences: null,
|
|
43
|
|
44 showAlert: function(id, args) {
|
|
45 var sbs = Components.classes["@mozilla.org/intl/stringbundle;1"]
|
|
46 .getService(Components.interfaces.nsIStringBundleService);
|
|
47 var bundle = sbs.createBundle("chrome://nightly/locale/nightly.properties");
|
|
48 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
|
|
49 .getService(Components.interfaces.nsIPromptService);
|
|
50 var text=bundle.formatStringFromName(id, args, args.length);
|
|
51 promptService.alert(null, "Nightly Tester Tools", text);
|
|
52 },
|
|
53
|
|
54 init: function() {
|
|
55 window.removeEventListener("load", nightly.init, false);
|
|
56 var prefs = Components.classes["@mozilla.org/preferences-service;1"]
|
|
57 .getService(Components.interfaces.nsIPrefService);
|
|
58 nightly.preferences = prefs.getBranch("nightly.")
|
|
59 .QueryInterface(Components.interfaces.nsIPrefBranchInternal);
|
|
60 nightly.preferences.addObserver("", nightly, false);
|
|
61
|
|
62 var profd = Components.classes["@mozilla.org/file/directory_service;1"]
|
|
63 .getService(Components.interfaces.nsIProperties)
|
|
64 .get("ProfD", Components.interfaces.nsILocalFile);
|
|
65 var profservice = Components.classes["@mozilla.org/toolkit/profile-service;1"]
|
|
66 .getService(Components.interfaces.nsIToolkitProfileService);
|
|
67 var profiles = profservice.profiles;
|
|
68 while (profiles.hasMoreElements()) {
|
|
69 var profile = profiles.getNext().QueryInterface(Components.interfaces.nsIToolkitProfile);
|
|
70 if (profile.rootDir.path == profd.path) {
|
|
71 nightly.variables.profile = profile.name;
|
|
72 break;
|
|
73 }
|
|
74 }
|
|
75
|
|
76 if (!nightly.variables.profile)
|
|
77 nightly.variables.profile = profd.leafName;
|
|
78
|
|
79 nightlyApp.init();
|
|
80 nightly.prefChange("idtitle");
|
|
81
|
|
82 var lastVersion = 0;
|
|
83 try {
|
|
84 lastVersion = nightly.preferences.getCharPref("lastVersion");
|
|
85 if (lastVersion != "2.0.2") {
|
|
86 }
|
|
87 }
|
|
88 catch (e) {
|
|
89 var checkCompatibility = true;
|
|
90 var checkUpdateSecurity = true;
|
|
91 if (prefs.prefHasUserValue("extensions.checkCompatibility"))
|
|
92 checkCompatibility = prefs.getBoolPref("extensions.checkCompatibility");
|
|
93 if (prefs.prefHasUserValue("extensions.checkUpdateSecurity"))
|
|
94 checkUpdateSecurity = prefs.getBoolPref("extensions.checkUpdateSecurity");
|
|
95 if (!checkCompatibility || !checkUpdateSecurity) {
|
|
96 var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
|
|
97 .getService(Components.interfaces.nsIWindowMediator);
|
|
98 var win = wm.getMostRecentWindow("NightlyTester:ConfigWarning");
|
|
99 if (win) {
|
|
100 win.focus();
|
|
101 return;
|
|
102 }
|
|
103
|
|
104 window.openDialog("chrome://nightly/content/configwarning.xul", "",
|
|
105 "dialog=no,titlebar,centerscreen,resizable=no");
|
|
106 }
|
|
107 }
|
|
108 nightly.preferences.setCharPref("lastVersion", "2.0.2");
|
|
109 },
|
|
110
|
|
111 unload: function(pref) {
|
|
112 window.removeEventListener("unload",nightly.unload,false);
|
|
113 nightly.preferences.removeObserver("",nightly);
|
|
114 },
|
|
115
|
|
116 prefChange: function(pref) {
|
|
117 if ((pref == "idtitle") || (pref == "templates.title")) {
|
|
118 if (nightly.preferences.getBoolPref("idtitle")) {
|
|
119 var title = nightly.getTemplate("title");
|
|
120 if (title && title.length>0)
|
|
121 nightlyApp.setCustomTitle(nightly.generateText(title));
|
|
122 else
|
|
123 nightlyApp.setBlankTitle();
|
|
124 }
|
|
125 else {
|
|
126 nightlyApp.setStandardTitle();
|
|
127 }
|
|
128 }
|
|
129 },
|
|
130
|
|
131 observe: function(prefBranch, subject, pref) {
|
|
132 nightly.prefChange(pref);
|
|
133 },
|
|
134
|
|
135 getStoredItem: function(type, name) {
|
|
136 name = name.toLowerCase();
|
|
137 var varvalue = null;
|
|
138 try {
|
|
139 return nightly.preferences.getCharPref(type+"."+name);
|
|
140 }
|
|
141 catch (e) {}
|
|
142 return nightly[type][name];
|
|
143 },
|
|
144
|
|
145 getVariable: function(name) {
|
|
146 return nightly.getStoredItem("variables",name);
|
|
147 },
|
|
148
|
|
149 getTemplate: function(name) {
|
|
150 return nightly.getStoredItem("templates",name);
|
|
151 },
|
|
152
|
|
153 generateText: function(template) {
|
|
154 var start = 0;
|
|
155 var pos = template.indexOf("${",start);
|
|
156 while (pos >= 0) {
|
|
157 if ((pos == 0) || (template.charAt(pos - 1) != "$")) {
|
|
158 var endpos = template.indexOf("}", pos + 2);
|
|
159 if (endpos >= 0) {
|
|
160 var varname = template.substring(pos+2,endpos);
|
|
161 var varvalue = nightly.getVariable(varname);
|
|
162 if (varvalue !== null) {
|
|
163 template = template.substring(0, pos) + varvalue +
|
|
164 template.substring(endpos + 1, template.length);
|
|
165 start = pos + varvalue.length;
|
|
166 }
|
|
167 else {
|
|
168 start = pos + 2;
|
|
169 }
|
|
170 }
|
|
171 else {
|
|
172 start = pos + 2;
|
|
173 }
|
|
174 }
|
|
175 else {
|
|
176 start = pos + 2;
|
|
177 }
|
|
178 pos = template.indexOf("${", start);
|
|
179 }
|
|
180 return template;
|
|
181 },
|
|
182
|
|
183 copyText: function(text) {
|
|
184 var clipboard = Components.classes["@mozilla.org/widget/clipboardhelper;1"].
|
|
185 getService(Components.interfaces.nsIClipboardHelper);
|
|
186 clipboard.copyString(text);
|
|
187 },
|
|
188
|
|
189 copyTemplate: function(template) {
|
|
190 nightly.copyText(nightly.generateText(nightly.getTemplate(template)));
|
|
191 },
|
|
192
|
|
193 menuPopup: function(event, menupopup) {
|
|
194 if (menupopup == event.target) {
|
|
195 var attext = false;
|
|
196
|
|
197 var element = document.commandDispatcher.focusedElement;
|
|
198 if (element) {
|
|
199 var type = element.localName.toLowerCase();
|
|
200 attext = ((type == "input") || (type == "textarea"))
|
|
201 }
|
|
202
|
|
203 var node=menupopup.firstChild;
|
|
204 while (node && node.localName!='menuseparator') {
|
|
205 if (node.id.substring(node.id.length - 7) == "-insert")
|
|
206 node.hidden = !attext;
|
|
207 if (node.id.substring(node.id.length - 5) == "-copy")
|
|
208 node.hidden = attext;
|
|
209 node=node.nextSibling;
|
|
210 }
|
|
211 }
|
|
212 },
|
|
213
|
|
214 insertTemplate: function(template) {
|
|
215 var element = document.commandDispatcher.focusedElement;
|
|
216 if (element) {
|
|
217 var type = element.localName.toLowerCase();
|
|
218 if ((type == "input") || (type == "textarea")) {
|
|
219 var text = nightly.generateText(nightly.getTemplate(template));
|
|
220 var newpos = element.selectionStart+text.length;
|
|
221 var value = element.value;
|
|
222 element.value = value.substring(0, element.selectionStart) + text +
|
|
223 value.substring(element.selectionEnd);
|
|
224 element.selectionStart = newpos;
|
|
225 element.selectionEnd = newpos;
|
|
226 return;
|
|
227 }
|
|
228 }
|
|
229 nightly.showAlert("nightly.notextbox.message", []);
|
|
230 },
|
|
231
|
|
232 insensitiveSort: function(a, b) {
|
|
233 a = a.toLowerCase();
|
|
234 b = b.toLowerCase();
|
|
235 if (a < b)
|
|
236 return -1
|
|
237 if (a > b)
|
|
238 return 1
|
|
239 // a must be equal to b
|
|
240 return 0
|
|
241 },
|
|
242
|
|
243 getExtensionList: function() {
|
|
244 var em = Components.classes["@mozilla.org/extensions/manager;1"]
|
|
245 .getService(Components.interfaces.nsIExtensionManager);
|
|
246
|
|
247 var items = em.getItemList(Components.interfaces.nsIUpdateItem.TYPE_EXTENSION, {});
|
|
248
|
|
249 if (items.length == 0) {
|
|
250 nightly.showAlert("nightly.noextensions.message", []);
|
|
251 return null;
|
|
252 }
|
|
253
|
|
254 var rdfS = Components.classes["@mozilla.org/rdf/rdf-service;1"]
|
|
255 .getService(Components.interfaces.nsIRDFService);
|
|
256 var ds = em.datasource;
|
|
257 var disabledResource = rdfS.GetResource("http://www.mozilla.org/2004/em-rdf#disabled");
|
|
258 var isDisabledResource = rdfS.GetResource("http://www.mozilla.org/2004/em-rdf#isDisabled");
|
|
259 var text = [];
|
|
260 for (var i = 0; i < items.length; i++) {
|
|
261 text[i] = items[i].name + " " + items[i].version;
|
|
262 var source = rdfS.GetResource("urn:mozilla:item:" + items[i].id);
|
|
263 var disabled = ds.GetTarget(source, disabledResource, true);
|
|
264 if (!disabled)
|
|
265 disabled = ds.GetTarget(source, isDisabledResource, true);
|
|
266 try {
|
|
267 disabled=disabled.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
|
268 if (disabled.Value=="true")
|
|
269 text[i]+=" [DISABLED]";
|
|
270 }
|
|
271 catch (e) { }
|
|
272 }
|
|
273 text.sort(nightly.insensitiveSort);
|
|
274 return text.join("\n");
|
|
275 },
|
|
276
|
|
277 insertExtensions: function() {
|
|
278 var element = document.commandDispatcher.focusedElement;
|
|
279 if (element) {
|
|
280 var type = element.localName.toLowerCase();
|
|
281 if ((type == "input") || (type == "textarea")) {
|
|
282 var text = nightly.getExtensionList();
|
|
283 var newpos = element.selectionStart + text.length;
|
|
284 var value = element.value;
|
|
285 element.value = value.substring(0, element.selectionStart) + text +
|
|
286 value.substring(element.selectionEnd);
|
|
287 element.selectionStart = newpos;
|
|
288 element.selectionEnd = newpos;
|
|
289 return;
|
|
290 }
|
|
291 }
|
|
292 nightly.showAlert("nightly.notextbox.message",[]);
|
|
293 },
|
|
294
|
|
295 copyExtensions: function() {
|
|
296 var text = nightly.getExtensionList();
|
|
297 if (text)
|
|
298 nightly.copyText(text);
|
|
299 },
|
|
300
|
|
301 openProfileDir: function() {
|
|
302 var stream = Components.classes["@mozilla.org/network/file-input-stream;1"]
|
|
303 .createInstance(Components.interfaces.nsIFileInputStream);
|
|
304 var directoryService = Components.classes["@mozilla.org/file/directory_service;1"]
|
|
305 .getService(Components.interfaces.nsIProperties);
|
|
306
|
|
307 var profile = directoryService.get("ProfD",Components.interfaces.nsILocalFile);
|
|
308 try {
|
|
309 profile.reveal();
|
|
310 }
|
|
311 catch (ex) {
|
|
312 var uri = Components.classes["@mozilla.org/network/io-service;1"]
|
|
313 .getService(Components.interfaces.nsIIOService)
|
|
314 .newFileURI(profile);
|
|
315 var protocolSvc = Components.classes["@mozilla.org/uriloader/external-protocol-service;1"]
|
|
316 .getService(Components.interfaces.nsIExternalProtocolService);
|
|
317 protocolSvc.loadUrl(uri);
|
|
318 }
|
|
319 },
|
|
320
|
|
321 launch: function(file, args) {
|
|
322 var process = Components.classes["@mozilla.org/process/util;1"]
|
|
323 .createInstance(Components.interfaces.nsIProcess);
|
|
324 process.init(file);
|
|
325 if (args)
|
|
326 process.run(false, args, args.length);
|
|
327 else
|
|
328 process.run(false, null, 0);
|
|
329 },
|
|
330
|
|
331 alertType: function(type) {
|
|
332 var directoryService = Components.classes["@mozilla.org/file/directory_service;1"]
|
|
333 .getService(Components.interfaces.nsIProperties);
|
|
334
|
|
335 var dir = directoryService.get(type, Components.interfaces.nsIFile);
|
|
336 window.alert(dir.path);
|
|
337 },
|
|
338
|
|
339 getScreenshot: function() {
|
|
340 window.openDialog("chrome://nightly/content/screenshot/screenshot.xul", "_blank", "chrome,all,dialog=no");
|
|
341 },
|
|
342
|
|
343 launchOptions: function() {
|
|
344 var wm = Components.classes['@mozilla.org/appshell/window-mediator;1']
|
|
345 .getService(Components.interfaces.nsIWindowMediator);
|
|
346
|
|
347 var win = wm.getMostRecentWindow("NightlyTester:Options");
|
|
348 if (win) {
|
|
349 win.focus();
|
|
350 return;
|
|
351 }
|
|
352
|
|
353 var features;
|
|
354 try {
|
|
355 var prefservice = Components.classes["@mozilla.org/preferences-service;1"]
|
|
356 .getService(Components.interfaces.nsIPrefBranch);
|
|
357 var instantApply = prefservice.getBoolPref("browser.preferences.instantApply");
|
|
358 features = "chrome,titlebar,toolbar,centerscreen" + (instantApply ? ",dialog=no" : ",modal");
|
|
359 }
|
|
360 catch (e) {
|
|
361 features = "chrome,titlebar,toolbar,centerscreen,modal";
|
|
362 }
|
|
363 openDialog("chrome://nightly/content/options/options.xul", "", features);
|
|
364 }
|
|
365
|
|
366 }
|
|
367
|
|
368 window.addEventListener("load", nightly.init, false);
|
|
369 window.addEventListener("unload", nightly.unload, false);
|