// ==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; } })();