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/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( | |
| <radiogroup id="typeGroup" orient="horizontal"> | |
| <radio group="type" id="BetterConsole:typeChrome" label="Chrome" value="Chrome" style="-moz-user-focus: ignore;" selected="true"/> | |
| <radio group="type" id="BetterConsole:typeContent" label="Content" value="Content"/> | |
| <radio group="type" id="BetterConsole:typeWrappedNative" label="WrappedNative" value="WrappedNative"/> | |
| </radiogroup> | |
| ); | |
| var versionGroup = $E( | |
| <radiogroup id="versionGroup" orient="horizontal"> | |
| <radio group="type" id="BetterConsole:versionDefault" label="default" value="" selected="true"/> | |
| <radio group="type" id="BetterConsole:version1.6" label="JS1.6" value="1.6"/> | |
| <radio group="type" id="BetterConsole:version1.7" label="JS1.7" value="1.7"/> | |
| <radio group="type" 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.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 = <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