Skip to content

Instantly share code, notes, and snippets.

@xulapp
Created February 28, 2010 16:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xulapp/317659 to your computer and use it in GitHub Desktop.
Save xulapp/317659 to your computer and use it in GitHub Desktop.
betterConsole.uc.js
// ==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/04/03 16:10 +09:00 細かなミスを修正。3.7a3 で動作確認
// ==/UserScript==
// @version 2010/03/30 19:10 +09:00 WrappedNative でのバージョン指定をサポート
// @version 2010/03/01 01:30 +09:00
(function betterConsole() {
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
const XHTML_NS = 'http://www.w3.org/1999/xhtml';
var toolbar_mode = $('ToolbarMode');
var toolbar_eval = $('ToolbarEval');
var typeGroup = $E(
<radiogroup id="typeGroup" orient="horizontal">
<radio id="BetterConsole:typeChrome" label="Chrome" value="Chrome" selected="true"/>
<radio id="BetterConsole:typeContent" label="Content" value="Content"/>
<radio id="BetterConsole:typeWrappedNative" label="WrappedNative" value="WrappedNative"/>
</radiogroup>
);
var versionGroup = $E(
<radiogroup id="versionGroup" orient="horizontal">
<radio id="BetterConsole:versionDefault" label="default" value="" selected="true"/>
<radio id="BetterConsole:version1.6" label="JS1.6" value="1.6"/>
<radio id="BetterConsole:version1.7" label="JS1.7" value="1.7"/>
<radio id="BetterConsole:version1.8" label="JS1.8" value="1.8"/>
</radiogroup>
);
toolbar_mode.appendChild(typeGroup);
toolbar_mode.appendChild(versionGroup);
toolbar_mode.addEventListener('command', function() gTextBoxEval.focus(), false);
toolbar_eval.insertBefore(
$E(<toolbarbutton id="ButtonReset" label={U('クリア')} accesskey="c" oncommand="gTextBoxEval.value = ''"/>),
$('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.textContent = '(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;
}
log(result);
};
function createSandbox(win) {
win = XPCNativeWrapper(win);
var sandbox = Cu.Sandbox(win);
sandbox.window = win;
sandbox.document = win.document;
sandbox.console = {
log: log,
};
sandbox.__proto__ = win;
return sandbox;
}
function log() {
gConsole.mCService.logStringMessage(Array.join(arguments));
}
function U(text) 1 < 'あ'.length ? decodeURIComponent(escape(text)) : text;
function $(id) document.getElementById(id);
function $E(xml, doc) {
doc = doc || document;
xml = <root xmlns={doc.documentElement.namespaceURI}/>.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;
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment