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;

} )();