privilegedmonkey
privilegedMinibufferちぎって書いた。ひどかった。結局使わなくなった。
var PrivilegedMonkey = ( function () { var DEBUG = 1; function trace() { var fn; if ( typeof Firebug == 'undefined' ) { fn = console; } else if ( Firebug && Firebug.Console && Firebug.Console.log ) { fn = Firebug.Console; } if ( fn ) { if ( arguments.length == 1 ) { fn.log(arguments[0]); } else { var args = []; for (var i = 0; i < arguments.length; i++) { args.push(arguments[i]); } fn.log(args); } } } var obs = Components.classes["@mozilla.org/observer-service;1"]. getService(Components.interfaces.nsIObserverService); var self = { VERSION: '0.0.1', utils: null, obs: null, waitForGreasemonkeyReady: function ( callback ) { var interval = 1000; if ( self.initailzed ) return; self.initTimerid = window.setInterval( self.timerHandler, interval ); self.initailzed = true; }, timerHandler: function () { var stop = ( GM_BrowserUI || retry < 0 ); if ( GM_BrowserUI ) { var browser = GM_BrowserUI.tabBrowser. getBrowserForDocument(window.content.document); if ( ! browser ) { stop = true; } else if ( ! self.success ) { if ( DEBUG ) { TabWatcher.addListener( { watchWindow: function (ctx, w) { try { self.loadScript(); Firebug.Console.log("gm rewrited."); } catch(e) { Firebug.Console.log("load error." , e); } } } ); } else { self.hackIntoGreasemonkey(); } } } if ( stop ) { window.clearInterval(self.initTimerid); self.initTimerid = null; } }, hackIntoGreasemonkey: function () { try { trace('initialize'); var interceptor = "chromeWin.PrivilegedMonkey.onExecute"; var completion = "chromeWin.PrivilegedMonkey.onInjectionEnd"; var replacement = "this\.evalInSandbox"; trace(top, GM_BrowserUI, top.GM_BrowserUI); var wo = GM_BrowserUI.gmSvc.wrappedJSObject; var code = wo.injectScripts.toString(); if ( code.indexOf(interceptor) < 0 ) { var re = new RegExp(replacement); code = code.replace(re, " try{ " + interceptor + '&&' + interceptor + "(sandbox,script);" + " } catch(e){ chromeWin.Firebug.Console.log(e); }" + replacement); code = code.replace(/}(.*?)$/, completion + '&&' + completion + '(sandbox); }$1' ); wo.injectScripts = eval(code, wo); trace("end", code); } } catch(e) { trace(e); } return true; }, onExecute: function (sandbox, script) { trace("on exec" , script); obs.notifyObservers(sandbox, "GM_execute", script.name); }, onInjectionEnd: function (sandbox) { trace("on injection end"); obs.notifyObservers(sandbox, "GM_injectionEnd", null); }, } return self; } )();