/* ***** BEGIN LICENSE BLOCK *****
* Copyright (C) 2011, -.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. This source may not be used in
* proprietary software and programs.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see
* ***** END LICENSE BLOCK ***** */
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/NetUtil.jsm");
Components.utils.import("resource://gre/modules/FileUtils.jsm");
var globals = {
browser: function () {
var glue = Services.wm.getMostRecentWindow("navigator:browser");
return glue.getBrowser();
},
watcher: function (url, name, features) {
return Services.ww.openWindow(null, url, name, features, null);
},
observer: function () {
return Services.obs;
},
classes: function (classID) {
return Components.classes['@mozilla.org/' + classID];
},
sandbox: function (str) {
var box = new Components.utils.Sandbox('about:blank');
var result = Components.utils.evalInSandbox(str, box);
return result;
}
};
var cplus = {
init: function (id) {
return document.getElementById(id);
},
get: function (id) {
return document.getElementById(id).value;
},
set: function (id, s) {
document.getElementById(id).value = s;
},
append: function (id, s, lb) {
if (lb) {
document.getElementById(id).value += s + "\r\n";
} else {
document.getElementById(id).value += s;
}
},
sanitize: function (method, str) {
switch (method) {
case 'mozurl':
str = str.replace(/(<|>|=|"|\s*)/g, '');
break;
case 'classlist':
str = str.replace(/function|\[native\scode\]|\{|\}|\s+/gi, '');
break;
}
return str;
},
logger: function (id, s) {
if (s) {
document.getElementById(id).value = s;
}
},
tree: function (treeid, cells, colorscheme) {
var items = document.createElement('treeitem');
var row = document.createElement('treerow');
if (colorscheme) {
row.setAttribute('properties', 'classlistselect');
}
for (var i = 0; i < cells.length; i++) {
var cell = document.createElement('treecell');
cell.setAttribute('label', cells[i]);
cell.setAttribute('value', true);
cell.setAttribute('editable', true);
row.appendChild(cell);
}
items.appendChild(row);
document.getElementById(treeid).appendChild(items);
},
cleartree: function (tree) {
var list = document.getElementById(tree);
while (list.firstChild) {
list.removeChild(list.firstChild);
}
},
tohex: function (str) {
return ("0" + str.toString(16)).slice(-2);
},
bin2hex: function (str) {
var res = [];
var blank = '';
var clen = str.length;
var hexchars = '0123456789abcdef';
var hex = new Array(clen * 2);
for (var i = 0; i < clen; ++i) {
hex[i * 2] = hexchars.charAt((str.charCodeAt(i) >> 4) & 15);
hex[i * 2 + 1] = hexchars.charAt(str.charCodeAt(i) & 15);
}
return hex.join('');
},
uuid: function (id) {
var uuidGenerator = globals.classes("uuid-generator;1").getService(Components.interfaces.nsIUUIDGenerator);
var uuid = uuidGenerator.generateUUID();
this.tocaret(document.getElementById('CplusEvaluatorResult'),uuid.toString());
return;
},
clearconsole: function (id) {
this.set(id, '');
},
copy: function (copytext) {
if (copytext) {
var str = globals.classes("supports-string;1").createInstance(Components.interfaces.nsISupportsString);
str.data = copytext;
var trans = globals.classes("widget/transferable;1").createInstance(Components.interfaces.nsITransferable);
trans.addDataFlavor("text/unicode");
trans.setTransferData("text/unicode", str, copytext.length * 2);
var clipid = Components.interfaces.nsIClipboard;
var clip = globals.classes("widget/clipboard;1").getService(clipid);
clip.setData(trans, null, clipid.kGlobalClipboard);
}
},
copyconsole: function (id) {
this.copy(this.get(id));
},
copytreerow: function () {
if (this.getSelectedTreeItemName()) {
this.copy(this.getSelectedTreeItemName());
}
},
tocaret: function (element, snippet) {
var selectionEnd = element.selectionStart + snippet.length;
var currentValue = element.value;
var beforeText = currentValue.substring(0, element.selectionStart);
var afterText = currentValue.substring(element.selectionEnd, currentValue.length);
element.value = beforeText + snippet + afterText;
element.focus();
element.setSelectionRange(selectionEnd, selectionEnd);
},
readconsole: function (i) {
this.ConsoleListener = {
console: this,
observe: function (consoleMsg) {
if (consoleMsg.message != '') {
var rl = document.getElementById("richlist").firstChild;
var items = document.createElement("richlistitem");
if (i % 2) {
items.setAttribute("class", "richlistA");
} else {
items.setAttribute("class", "richlistB");
}
var description = document.createElement("description");
description.appendChild(document.createTextNode(consoleMsg.message.replace(/%20/g, " ")));
items.appendChild(description);
rl.parentNode.insertBefore(items, rl);
}
i++;
}
};
try {
isupports = Components.classes['@mozilla.org/consoleservice;1'].getService();
service = isupports.QueryInterface(Components.interfaces.nsIConsoleService);
service.registerListener(this.ConsoleListener);
} catch (e) {
return;
}
},
enumerate: function (method) {
switch (method) {
case 'classes':
var compound = new Array();
var names = Components.classes;
var classlist = [];
for (i in names) {
if (names[i].toString().indexOf("function") == -1 && names[i].toString() != '') {
classlist.push(names[i].toString().replace(/\@mozilla\.org\//g, ''));
}
}
classlist.sort();
for (var j = 0; j < classlist.length; j++) {
var menu = document.getElementById("classesmenu");
var item = document.createElement("menuitem");
item.setAttribute("label", classlist[j]);
item.setAttribute("value", 'Components.classes["@mozilla.org/' + classlist[j] + '"]');
menu.appendChild(item);
var menu_ref = document.getElementById("classesmenu_ref");
var item = document.createElement("menuitem");
item.setAttribute("label", classlist[j]);
item.setAttribute("value", classlist[j]);
menu_ref.appendChild(item);
}
break;
case 'interfaces':
var compound = new Array();
var names = Components.interfaces;
var interfacelist = [];
for (i in names) {
if (names[i].toString().indexOf("function") == -1) {
interfacelist.push(names[i].toString());
}
}
interfacelist.sort();
for (var j = 0; j < interfacelist.length; j++) {
var menu = document.getElementById("interfacesmenu");
var item = document.createElement("menuitem");
item.setAttribute("label", interfacelist[j]);
item.setAttribute("value", 'Components.interfaces.' + interfacelist[j]);
menu.appendChild(item);
}
break;
}
},
enumeratelist: function (list) {
switch (list) {
case 'elements':
var elem = elementsXul.sort();
for (var j = 0; j < elem.length; j++) {
var rl = document.getElementById("elementsmenu").firstChild;
var items = document.createElement("richlistitem");
var description = document.createElement("description");
description.appendChild(document.createTextNode('<' + elem[j] + '>'));
items.appendChild(description);
items.label = '<' + elem[j] + '>';
rl.parentNode.insertBefore(items, rl);
}
break;
case 'attributes':
var elem = attributesXul.sort();
for (var j = 0; j < elem.length; j++) {
var rl = document.getElementById("attributesmenu").firstChild;
var items = document.createElement("richlistitem");
var description = document.createElement("description");
description.appendChild(document.createTextNode('' + elem[j] + ''));
items.appendChild(description);
items.label = elem[j];
rl.parentNode.insertBefore(items, rl);
}
break;
case 'events':
var elem = eventsXul.sort();
for (var j = 0; j < elem.length; j++) {
var rl = document.getElementById("eventsmenu").firstChild;
var items = document.createElement("richlistitem");
var description = document.createElement("description");
description.appendChild(document.createTextNode('on' + elem[j] + ''));
items.appendChild(description);
items.label = 'on' + elem[j] + '';
rl.parentNode.insertBefore(items, rl);
}
break;
}
},
enumerateclass: function (id) {
// clear trees first, if any.
this.cleartree('tree-children-interfacelist');
this.cleartree('tree-children-classlist');
var result = '';
var num = this.get('classesmenu_main_ref');
var ref = globals.classes(num);
k = 0;
for (i in ref) {
if (k == 0) {
this.tree('tree-children-classlist', [i, this.sanitize('classlist', ref[i].toString())], true);
} else {
this.tree('tree-children-classlist', [i, this.sanitize('classlist', ref[i].toString())]);
}
k++;
}
var names = Components.interfaces;
for (n in names) {
try {
var test = globals.classes(num);
var y = test.getService(Components.interfaces[names[n]]);
if (y) {
k = 0;
for (t in y) {
if (k == 0) {
this.tree('tree-children-interfacelist', [names[n], this.sanitize('classlist', y[t].toString())], true);
} else {
this.tree('tree-children-interfacelist', [names[n], this.sanitize('classlist', y[t].toString())]);
}
k++;
}
}
} catch (e) {}
}
},
closetag: function (id) {
if(document.getElementById(id).selectedItem.label) {
this.tocaret(document.getElementById('CplusXulText'),document.getElementById(id).selectedItem.label.replace(/= 1) {
for (var i = 1; i < items.length; ++i) {
list.removeChild(items[i]);
}
}
},
clearval: function () {
this.set('CplusEvaluatorResult', '');
},
run: function (custom) {
var msg = '';
var code = this.get('CplusTextboxEval');
try {
// first try the sandbox, if it fails use a iframe.
var compiler = globals.sandbox(code); // create private function.
try {
if (compiler) {
msg = "> " + compiler.toString();
} else {}
} catch (e) {
try {
// try iframe
var doc = document.getElementById("CplusEvaluator");
doc.contentWindow.location = "javascript: " + code.replace(/%/g, "%25");
} catch (exf) {
msg = "> error compiling javascript command: " + exf.message + "\r\n";
}
}
} catch (ex) {
try {
msg = "> " + code.toString();
// try iframe
var doc = document.getElementById("CplusEvaluator");
doc.contentWindow.location = "javascript: " + code.replace(/%/g, "%25");
} catch (exf) {
msg = "> error compiling javascript command: " + exf.message + "\r\n";
}
}
if (msg) {
this.append("CplusEvaluatorResult", msg, true);
}
code = '';
},
loadxul: function () {
var data = 'data:application/vnd.mozilla.xul+xml,';
data += '';
data += '';
data += '';
data += '';
data += this.get('CplusXulText');
data += '';
globals.watcher(data, "mozilla:extensions", "chrome,resizable=yes,all,width=" + this.get('xulwidth') + ",height=" + this.get('xulheight') + "");
},
loader: function (action) {
switch (action) {
case 'memory':
var classIDCACHE = globals.classes('network/cache-service;1');
var cacheService = classIDCACHE.getService(Components.interfaces.nsICacheService);
cacheService.evictEntries(Components.interfaces.nsICache.STORE_IN_MEMORY);
break;
case 'profile':
var directoryService = globals.classes('file/directory_service;1')
.getService(Components.interfaces.nsIProperties);
var profileFolder = directoryService.get("ProfD", Components.interfaces.nsIFile);
var fileLocal = globals.classes('file/local;1')
.getService(Components.interfaces.nsILocalFile);
fileLocal.initWithPath(profileFolder.path);
fileLocal.launch();
break;
case 'reloadchrome':
var c = globals.classes('chrome/chrome-registry;1')
.getService(Components.interfaces.nsIXULChromeRegistry);
c.reloadChrome();
break;
case 'boot':
var flash = globals.classes('toolkit/app-startup;1')
.getService(Components.interfaces.nsIAppStartup);
flash.quit(Components.interfaces.nsIAppStartup.eForceQuit | Components.interfaces.nsIAppStartup.eRestart);
break;
case 'ext':
globals.watcher("chrome://mozapps/content/extensions/extensions.xul?type=extensions", "mozilla:extensions", "chrome,resizable=yes,all,width=600,height=400");
break;
case 'stopjs':
globals.browser().docShell.allowJavascript = false;
break;
case 'startjs':
globals.browser().docShell.allowJavascript = true;
break;
}
},
shutdown: function () {
try {
service.unregisterListener(this.ConsoleListener);
service = null;
} catch (e) {}
try {
var xulbox = document.getElementById("CplusXulText");
xulbox.removeEventListener('keypress', tabCaptureXul, false);
var xulbox2 = document.getElementById("CplusXulText");
xulbox2.removeEventListener('keypress', tabCaptureEvent, false);
} catch (e) {
// whatever... at least we tried to prevent leaks.
}
}
};
window.addEventListener("load", function () {
function tabCaptureXul(e) {
if (e.keyCode == 9) {
cplus.tocaret(document.getElementById("CplusXulText"), "\t");
document.getElementById("CplusXulText").focus();
e.preventDefault();
}
}
function tabCaptureEvent(e) {
if (e.keyCode == 9) {
cplus.tocaret(document.getElementById("CplusTextboxEval"), "\t");
document.getElementById("CplusTextboxEval").focus();
e.preventDefault();
}
}
var xulbox = document.getElementById("CplusXulText");
xulbox.addEventListener('keypress', tabCaptureXul, true);
var eventbox = document.getElementById("CplusTextboxEval");
eventbox.addEventListener('keypress', tabCaptureEvent, true);
}, false);