From cc0637a241575b304921afad07fbae30f7162b31 Mon Sep 17 00:00:00 2001 From: hogelog Date: Fri, 28 Nov 2008 11:09:47 +0000 Subject: * branch gmperator for vimperator 1.2. git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/branches/1.2@25251 d0d07461-0603-4401-acd4-de1884942a52 --- gmperator.js | 403 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 403 insertions(+) create mode 100644 gmperator.js (limited to 'gmperator.js') diff --git a/gmperator.js b/gmperator.js new file mode 100644 index 0000000..24b2e36 --- /dev/null +++ b/gmperator.js @@ -0,0 +1,403 @@ +/** + * ==VimperatorPlugin== + * @name gmperator + * @description Vimperator plugin for Greasemonkey + * @author teramako teramako@gmail.com + * @namespace http://d.hatena.ne.jp/teramako/ + * @version 0.5b + * ==/VimperatorPlugin== + * + * --------------------------- + * Usage: + * --------------------------- + * {{{ + * + * :gmli[st] {filter} -> show user scripts matches {filter} + * :gmli[st]! -> show all user scripts + * :gmli[st] full -> same as :gmli[st]! + * + * :gmlo[ad] {name|filename} -> load the user script to the current page + * but, don't dispatch load event + * so maybe you should edit the scripts before load + * :gmlo[ad]! {name|filename} -> force load the user script + * + * :gmset! -> toggle enable/disable Greasemonkey + * :gmset! {filename} -> toogle enable/disable the script + * :gmset {filename} {options} + * {options}: + * -n[ame] {value} -> change name to {value} + * -i[nclude] {expr[,expr,...]} -> change includes to expr list ("," demiliter) + * -e[xclude] {expr[,expr,...]} -> change excludes to expr list ("," demiliter) + * + * Caution: + * The change is permanent, not only the session. + * And cannot get back. + * + * e.g.) + * :gmset! {filename} -n fooScriptName -i http://*,https://* -e http://example.com/* + * toggle enable or disable, + * name to "fooScriptName", + * includes to "http://*" and "https://*", + * and excludes to "http://example.com/*" + * + * --------------------------- + * Autocommand + * --------------------------- + * Available events: + * 'GMInjectedScript' -> when open either foreground or background + * 'GMActiveScript' -> when TabSelect or open foreground + * e.g.) + * autocmd GMActiveScript scriptName\.user\.js$ :echo "scriptName is executing" + * when any URL and scriptName.user.js is executing + * + * --------------------------- + * Dialog + * --------------------------- + * :dialog userscriptmanager -> open Greasemonkey UserScript Manager + * + * }}} + * --------------------------- + * For plugin developer: + * --------------------------- + * {{{ + * + * you can access to the sandbox of Greasemonkey !!! + * + * liberator.plugins.gmperator => ( + * allItem : return object of key : {panalID}, + * value : {GmContainer} + * {panelID} => @see gBrowser.mTags[].linkedPanel + * currentPanel + * currentContainer : return the current {GmContainer} object + * currentSandbox : return the current sandbox object + * gmScripts : return array of {userScripts} + * {userScripts} => ( + * filename : {String} + * name : {String} + * namespace : {String} + * description: {String} + * enabled : {Boolean} + * includes : {String[]} + * encludes : {String[]} + * ) + * ) + * }}} + */ +(function(){ + +const Cc = Components.classes; +const Ci = Components.interfaces; +const gmID = '@greasemonkey.mozdev.org/greasemonkey-service;1'; +if (!Cc[gmID]) { + log('Greasemonkey is not installed'); + return; +} + +liberator.plugins.gmperator = (function(){ //{{{ + // ----------------------- + // PUBLIC section + // ----------------------- + // {{{ + var manager = { + register: function (uri,sandbox,script){ + var panelID = getPanelID(sandbox.window); + if (!panelID) return; + var gmCon; + if (containers[panelID] && containers[panelID].uri == uri){ + gmCon = containers[panelID]; + } else { + gmCon = new GmContainer(uri,sandbox); + containers[panelID] = gmCon; + this.__defineGetter__(panelID,function() gmCon); + log('gmpeartor: Registered: ' + panelID + ' - ' + uri, 8); + } + gmCon.sandbox = sandbox; + gmCon.addScript(script); + gmCon.uri = uri; + triggerGMEvent('GMInjectedScript', uri, script._filename); + if (panelID == this.currentPanel){ + triggerGMEvent('GMActiveScript', uri, script._filename); + } + }, + get gmScripts() GM_getConfig().scripts, + get allItem() containers, + get currentPanel() getBrowser().mCurrentTab.linkedPanel, + get currentContainer() containers[this.currentPanel] || null, + get currentSandbox(){ + var id = this.currentPanel; + return containers[id] ? containers[id].sandbox : null; + }, + getSandboxFromWindow: function(win){ + for each(var c in containers){ + if(c.sandbox.window == win) return sandbox; + } + return null; + }, + getContainersFromURI: function(uri){ + var list = []; + for each(var c in containers){ + if (c.uri == uri) list.push(c); + } + return list.length > 0 ? list : null; + }, + }; + // }}} + // ----------------------- + // PRIVATE section + // ----------------------- + // {{{ + var containers = {}; + var gmSvc = Cc[gmID].getService().wrappedJSObject; + + function appendCode(target,name,func){ + var original = target[name]; + target[name] = function(){ + var tmp = original.apply(target,arguments); + func.apply(this,arguments); + return tmp; + }; + } + appendCode(gmSvc, 'evalInSandbox', function(code,uri,sandbox,script){ + liberator.plugins.gmperator.register(uri,sandbox,script); + }); + function getPanelID(win){ + var tabs = getBrowser().mTabs; + for (var i=0; tabs.length; i++){ + var tab = tabs.item(i); + if (tab.linkedBrowser.contentWindow == win){ + return tab.linkedPanel; + } + } + } + function updateGmContainerList(event){ + var t = event.target; + if (t && t.localName == 'tab' && t.linkedPanel){ + delete containers[t.linkedPanel]; + delete liberator.plugins.gmperator[t.linkedPanel]; + } + } + function dispatchGMTabSelect(event){ + var panelID = event.originalTarget.linkedPanel; + var container; + if (container = containers[panelID]){ + liberator.log(panelID + '\n' + container.uri +'\n'+ container.scripts.length, 8); + container.scripts.forEach(function(script){ + triggerGMEvent('GMActiveScript', container.uri, script._filename); + }); + } + } + /** + * trigger autocommand + * @param {String} name Event name + * @param {String} uri + * @param {String} filename script filename + */ + function triggerGMEvent(name, uri, filename){ + autocommands.trigger(name, uri+'\n'+filename); + liberator.log('gmpeartor: '+ name + ' ' + uri+'\n'+filename, 8); + } + getBrowser().mTabContainer.addEventListener('TabClose',updateGmContainerList,false); + getBrowser().mTabBox.addEventListener('TabSelect',dispatchGMTabSelect,false); + + config.autocommands.push(["GMInjectedScript","Triggered when UserScript is injected"]); + config.autocommands.push(["GMActiveScript","Triggered when location is changed and injected UserScripts are exist"]); + config.dialogs.push(["userscriptmanager", "Greasemonkey Manager", function(){GM_openUserScriptManager();}]); + // }}} + return manager; +})(); //}}} + +// --------------------------- +// User Command +// --------------------------- +commands.addUserCommand(['gmli[st]','lsgm'], 'list Greasemonkey scripts', //{{{ + function(arg,special){ + var str = ''; + var scripts = GM_getConfig().scripts; + var reg; + if (special || arg == 'full'){ + reg = new RegExp('.*'); + } else if( arg ){ + reg = new RegExp(arg,'i'); + } + if (reg){ + for each(var s in scripts){ + if ( reg.test(s.name) || reg.test(s._filename) ) { + str += scriptToString(s) + '\n'; + } + } + } else { + var table =