Created
February 28, 2010 16:29
-
-
Save xulapp/317659 to your computer and use it in GitHub Desktop.
betterConsole.uc.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==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