// ==UserScript==
// @name betterConsole.uc.js
// @description eval in [content, chrome, WrappedNative] window under the JS version [default, 1.6, 1.7, 1.8]
// @include chrome://global/content/console.xul
// @compatibility Firefox 3.6
// @namespace http://twitter.com/xulapp
// @author xulapp
// @license MIT License
// @version 2010/03/30 19:10 +09:00 WrappedNative でのバージョン指定をサポート
// ==/UserScript==
// @version 2010/03/01 01:30 +09:00
(function betterConsole() {
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
const XUL_NS = 'http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul';
const XHTML_NS = 'http://www.w3.org/1999/xhtml';
var toolbar_mode = $('ToolbarMode');
var toolbar_eval = $('ToolbarEval');
var typeGroup = $E(
);
var versionGroup = $E(
);
toolbar_mode.appendChild(typeGroup);
toolbar_mode.appendChild(versionGroup);
toolbar_mode.addEventListener('command', function() gTextBoxEval.focus(), false);
toolbar_eval.insertBefore(
$E(),
$('ButtonEval').nextSibling
);
gEvaluator.removeEventListener('load', loadOrDisplayResult, true);
evaluateTypein = function evaluateTypein() {
var evaluateType = typeGroup.value;
var evaluateVersion = versionGroup.value;
var result;
var win = evaluateType === 'Chrome'
? gEvaluator.contentWindow
: getActiveContentWindow();
gCodeToEvaluate = gTextBoxEval.value;
switch (evaluateType) {
case 'Chrome':
case 'Content':
let doc = win.document;
let script = doc.createElementNS(XHTML_NS, 'script');
script.id = 'betterConsole_script';
script.type = 'text/javascript' + (evaluateVersion ? ';version=' + evaluateVersion : '');
script.appendChild(doc.createTextNode('(function(result) result !== void 0 && document.getElementById("betterConsole_script").setAttribute("result", !result || result instanceof XML ? uneval(result) : result))(eval(' + uneval(gCodeToEvaluate) + '));'));
doc.documentElement.appendChild(script);
result = script.getAttribute('result');
script.parentNode.removeChild(script);
if (!result) return;
break;
case 'WrappedNative':
let sandbox = createSandbox(win);
let args = [gCodeToEvaluate, sandbox];
if (evaluateVersion)
args.push(evaluateVersion);
result = Cu.evalInSandbox.apply(Cu, args);
if (result === void 0) return;
if (!result || result instanceof XML)
result = uneval(result);
break;
}
gConsole.mCService.logStringMessage(result);
};
function createSandbox(win) {
win = XPCNativeWrapper(win);
var sandbox = Components.utils.Sandbox(win);
sandbox.window = win;
sandbox.document = win.document;
sandbox.console = {
log: function log() {
gConsole.mCService.logStringMessage(Array.join(arguments));
},
};
sandbox.__proto__ = win;
return sandbox;
}
function U(text) 1 < 'あ'.length ? decodeURIComponent(escape(text)) : text;
function $(id) document.getElementById(id);
function $E(xml, doc) {
doc = doc || document;
xml = .appendChild(xml);
var settings = XML.settings();
XML.prettyPrinting = false;
var root = new DOMParser().parseFromString(xml.toXMLString(), 'application/xml').documentElement;
XML.setSettings(settings);
doc.adoptNode(root);
var range = doc.createRange();
range.selectNodeContents(root);
var frag = range.extractContents();
range.detach();
return frag.childNodes.length < 2 ? frag.firstChild : frag;
}
function getMostRecentWindow() {
return Cc['@mozilla.org/appshell/window-mediator;1']
.getService(Ci.nsIWindowMediator)
.getMostRecentWindow('navigator:browser');
}
function getActiveContentWindow() {
var win = getMostRecentWindow();
var fw = win.document.commandDispatcher.focusedWindow;
if (!fw || fw instanceof ChromeWindow)
return win.content;
return fw;
}
})();