home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 March / PCpro_2006_03.ISO / files / freeware / greasemonkey-0.6.4-fx.xpi / components / greasemonkey.js < prev   
Encoding:
JavaScript  |  2005-11-30  |  8.8 KB  |  298 lines

  1. const CLASSNAME = "GM_GreasemonkeyService";
  2. const CONTRACTID = "@greasemonkey.mozdev.org/greasemonkey-service;1";
  3. const CID = Components.ID("{77bf3650-1cd6-11da-8cd6-0800200c9a66}");
  4.  
  5. const Cc = Components.classes;
  6. const Ci = Components.interfaces;
  7.  
  8. const appSvc = Cc["@mozilla.org/appshell/appShellService;1"]
  9.                  .getService(Ci.nsIAppShellService);
  10.  
  11. function alert(msg) {
  12.   Cc["@mozilla.org/embedcomp/prompt-service;1"]
  13.     .getService(Ci.nsIPromptService)
  14.     .alert(null, "message from your mom", msg);
  15. }
  16.  
  17.  
  18. var greasemonkeyService = {
  19.  
  20.   browserWindows: [],
  21.  
  22.  
  23.   // nsISupports
  24.   QueryInterface: function(aIID) {
  25.     if (!aIID.equals(Ci.nsIObserver) &&
  26.         !aIID.equals(Ci.nsISupports) &&
  27.         !aIID.equals(Ci.nsIWebProgressListener) &&
  28.         !aIID.equals(Ci.nsISupportsWeakReference) &&
  29.         !aIID.equals(Ci.gmIGreasemonkeyService) &&
  30.         !aIID.equals(Ci.nsIWindowMediatorListener))
  31.       throw Components.results.NS_ERROR_NO_INTERFACE;
  32.  
  33.     return this;
  34.   },
  35.  
  36.  
  37.   // nsIObserver
  38.   observe: function(aSubject, aTopic, aData) {
  39.     if (aTopic == "http-startup") {
  40.       this.startup();
  41.     }
  42.   },
  43.  
  44.  
  45.   // gmIGreasemonkeyService
  46.   registerBrowser: function(browserWin) {
  47.     var existing;
  48.  
  49.     for (var i = 0; existing = this.browserWindows[i]; i++) {
  50.       if (existing == browserWin) {
  51.         throw new Error("Browser window has already been registered.");
  52.       }
  53.     }
  54.  
  55.     this.browserWindows.push(browserWin);
  56.   },
  57.  
  58.   unregisterBrowser: function(browserWin) {
  59.     var existing;
  60.  
  61.     for (var i = 0; existing = this.browserWindows[i]; i++) {
  62.       if (existing == browserWin) {
  63.         this.browserWindows.splice(i, 1);
  64.         return;
  65.       }
  66.     }
  67.  
  68.     throw new Error("Browser window is not registered.");
  69.   },
  70.  
  71.   domContentLoaded: function(wrappedWindow) {
  72.     var unsafeWin = wrappedWindow.wrappedJSObject;
  73.     var unsafeLoc = new XPCNativeWrapper(unsafeWin, "location").location;
  74.     var href = new XPCNativeWrapper(unsafeLoc, "href").href;
  75.     var scripts = this.initScripts(href);
  76.  
  77.     if (scripts.length > 0) {
  78.       this.injectScripts(scripts, href, unsafeWin);
  79.     }
  80.   },
  81.  
  82.  
  83.   startup: function() {
  84.     Cc["@mozilla.org/moz/jssubscript-loader;1"]
  85.       .getService(Ci.mozIJSSubScriptLoader)
  86.       .loadSubScript("chrome://global/content/XPCNativeWrapper.js");
  87.  
  88.     Cc["@mozilla.org/moz/jssubscript-loader;1"]
  89.       .getService(Ci.mozIJSSubScriptLoader)
  90.       .loadSubScript("chrome://greasemonkey/content/prefmanager.js");
  91.  
  92.     Cc["@mozilla.org/moz/jssubscript-loader;1"]
  93.       .getService(Ci.mozIJSSubScriptLoader)
  94.       .loadSubScript("chrome://greasemonkey/content/utils.js");
  95.  
  96.     Cc["@mozilla.org/moz/jssubscript-loader;1"]
  97.       .getService(Ci.mozIJSSubScriptLoader)
  98.       .loadSubScript("chrome://greasemonkey/content/config.js");
  99.  
  100.     Cc["@mozilla.org/moz/jssubscript-loader;1"]
  101.       .getService(Ci.mozIJSSubScriptLoader)
  102.       .loadSubScript("chrome://greasemonkey/content/convert2RegExp.js");
  103.  
  104.     Cc["@mozilla.org/moz/jssubscript-loader;1"]
  105.       .getService(Ci.mozIJSSubScriptLoader)
  106.       .loadSubScript("chrome://greasemonkey/content/miscapis.js");
  107.  
  108.     Cc["@mozilla.org/moz/jssubscript-loader;1"]
  109.       .getService(Ci.mozIJSSubScriptLoader)
  110.       .loadSubScript("chrome://greasemonkey/content/xmlhttprequester.js");
  111.  
  112.     loggify(this, "GM_GreasemonkeyService");
  113.   },
  114.  
  115.  
  116.   initScripts: function(url) {
  117.     var config = new Config(getScriptFile("config.xml"));
  118.     var scripts = [];
  119.     config.load();
  120.     
  121.     outer:
  122.     for (var i = 0; i < config.scripts.length; i++) {
  123.       var script = config.scripts[i];
  124.       if (script.enabled) {
  125.         for (var j = 0; j < script.includes.length; j++) {
  126.           var pattern = convert2RegExp(script.includes[j]);
  127.  
  128.           if (pattern.test(url)) {
  129.             for (var k = 0; k < script.excludes.length; k++) {
  130.               pattern = convert2RegExp(script.excludes[k]);
  131.     
  132.               if (pattern.test(url)) {
  133.                 continue outer;
  134.               }
  135.             }
  136.  
  137.             scripts.push(script);
  138.  
  139.             continue outer;
  140.           }
  141.         }
  142.       }
  143.     }
  144.  
  145.     log("* number of matching scripts: " + scripts.length);
  146.     return scripts;
  147.   },
  148.  
  149.   injectScripts: function(scripts, url, unsafeContentWin) {
  150.     var sandbox;
  151.     var script;
  152.     var logger;
  153.     var storage;
  154.     var xmlhttpRequester;
  155.     var safeWin = new XPCNativeWrapper(unsafeContentWin);
  156.  
  157.     for (var i = 0; script = scripts[i]; i++) {
  158.       sandbox = new Components.utils.Sandbox(safeWin);
  159.  
  160.       logger = new GM_ScriptLogger(script);
  161.       storage = new GM_ScriptStorage(script);
  162.       xmlhttpRequester = new GM_xmlhttpRequester(unsafeContentWin, 
  163.                                                  appSvc.hiddenDOMWindow);
  164.  
  165.       sandbox.window = safeWin;
  166.       sandbox.document = sandbox.window.document;
  167.       sandbox.unsafeWindow = unsafeContentWin;
  168.  
  169.       // hack XPathResult since that is so commonly used
  170.       sandbox.XPathResult = Ci.nsIDOMXPathResult;
  171.  
  172.       // add our own APIs
  173.       sandbox.GM_addStyle = function(css) { GM_addStyle(sandbox.document, css) };
  174.       sandbox.GM_log = GM_hitch(logger, "log");
  175.       sandbox.GM_setValue = GM_hitch(storage, "setValue");
  176.       sandbox.GM_getValue = GM_hitch(storage, "getValue");
  177.       sandbox.GM_openInTab = GM_hitch(this, "openInTab", unsafeContentWin);
  178.       sandbox.GM_xmlhttpRequest = GM_hitch(xmlhttpRequester, 
  179.                                            "contentStartRequest");
  180.       sandbox.GM_registerMenuCommand = GM_hitch(this, 
  181.                                                 "registerMenuCommand", 
  182.                                                 unsafeContentWin);
  183.  
  184.       sandbox.__proto__ = safeWin;
  185.  
  186.       try {
  187.         this.evalInSandbox("(function(){\n" +
  188.                            getContents(getScriptFileURI(script.filename)) +
  189.                            "\n})()",
  190.                            url, 
  191.                            sandbox);
  192.       } catch (e) {
  193.         GM_logError(e);
  194.       }
  195.     }
  196.   },
  197.  
  198.   registerMenuCommand: function(unsafeContentWin, commandName, commandFunc, 
  199.                                 accelKey, accelModifiers, accessKey) {
  200.     var command = {name: commandName,
  201.                    accelKey: accelKey,
  202.                    accelModifiers: accelModifiers,
  203.                    accessKey: accessKey,
  204.                    doCommand: commandFunc,
  205.                    window: unsafeContentWin };
  206.  
  207.     for (var i = 0; i < this.browserWindows.length; i++) {
  208.       this.browserWindows[i].registerMenuCommand(command);
  209.     }
  210.   },
  211.  
  212.   openInTab: function(unsafeContentWin, url) {
  213.     var unsafeTop = new XPCNativeWrapper(unsafeContentWin, "top").top;
  214.  
  215.     for (var i = 0; i < this.browserWindows.length; i++) {
  216.       this.browserWindows[i].openInTab(unsafeTop, url);
  217.     }
  218.   },
  219.  
  220.   evalInSandbox: function(code, codebase, sandbox) {
  221.     // DP beta+
  222.     if (Components.utils && Components.utils.Sandbox) {
  223.       Components.utils.evalInSandbox(code, sandbox);
  224.     // DP alphas
  225.     } else if (Components.utils && Components.utils.evalInSandbox) {
  226.       Components.utils.evalInSandbox(code, codebase, sandbox);
  227.     // 1.0.x
  228.     } else if (Sandbox) {
  229.       evalInSandbox(code, sandbox, codebase);
  230.     } else {
  231.       throw new Error("Could not create sandbox.");
  232.     }
  233.   },
  234. };
  235.  
  236. //loggify(greasemonkeyService, "greasemonkeyService");
  237.  
  238.  
  239.  
  240. /** 
  241.  * XPCOM Registration goop
  242.  */
  243. var Module = new Object();
  244.  
  245. Module.registerSelf = function(compMgr, fileSpec, location, type) {
  246.   compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
  247.   compMgr.registerFactoryLocation(CID,
  248.                                   CLASSNAME,
  249.                                   CONTRACTID,
  250.                                   fileSpec,
  251.                                   location,
  252.                                   type);
  253.  
  254.   var catMgr = Cc["@mozilla.org/categorymanager;1"]
  255.                  .getService(Ci.nsICategoryManager);
  256.  
  257.   catMgr.addCategoryEntry("http-startup-category",
  258.                           CLASSNAME,
  259.                           CONTRACTID,
  260.                           true,
  261.                           true);
  262. }
  263.  
  264. Module.getClassObject = function(compMgr, cid, iid) {
  265.   if (!cid.equals(CID)) {
  266.     throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
  267.   }
  268.   
  269.   if (!iid.equals(Ci.nsIFactory)) {
  270.     throw Components.results.NS_ERROR_NO_INTERFACE;
  271.   }
  272.  
  273.   return Factory;
  274. }
  275.  
  276. Module.canUnload = function(compMgr) {
  277.   return true;
  278. }
  279.  
  280.  
  281. var Factory = new Object();
  282.  
  283. Factory.createInstance = function(outer, iid) {
  284.   if (outer != null) {
  285.     throw Components.results.NS_ERROR_NO_AGGREGATION;
  286.   }
  287.  
  288.   return greasemonkeyService;
  289. }
  290.  
  291.  
  292. function NSGetModule(compMgr, fileSpec) {
  293.   return Module;
  294. }
  295.  
  296. //loggify(Module, "greasemonkeyService:Module");
  297. //loggify(Factory, "greasemonkeyService:Factory");
  298.