home *** CD-ROM | disk | FTP | other *** search
- const CLASSNAME = "GM_GreasemonkeyService";
- const CONTRACTID = "@greasemonkey.mozdev.org/greasemonkey-service;1";
- const CID = Components.ID("{77bf3650-1cd6-11da-8cd6-0800200c9a66}");
-
- const Cc = Components.classes;
- const Ci = Components.interfaces;
-
- const appSvc = Cc["@mozilla.org/appshell/appShellService;1"]
- .getService(Ci.nsIAppShellService);
-
- function alert(msg) {
- Cc["@mozilla.org/embedcomp/prompt-service;1"]
- .getService(Ci.nsIPromptService)
- .alert(null, "message from your mom", msg);
- }
-
-
- var greasemonkeyService = {
-
- browserWindows: [],
-
-
- // nsISupports
- QueryInterface: function(aIID) {
- if (!aIID.equals(Ci.nsIObserver) &&
- !aIID.equals(Ci.nsISupports) &&
- !aIID.equals(Ci.nsIWebProgressListener) &&
- !aIID.equals(Ci.nsISupportsWeakReference) &&
- !aIID.equals(Ci.gmIGreasemonkeyService) &&
- !aIID.equals(Ci.nsIWindowMediatorListener))
- throw Components.results.NS_ERROR_NO_INTERFACE;
-
- return this;
- },
-
-
- // nsIObserver
- observe: function(aSubject, aTopic, aData) {
- if (aTopic == "http-startup") {
- this.startup();
- }
- },
-
-
- // gmIGreasemonkeyService
- registerBrowser: function(browserWin) {
- var existing;
-
- for (var i = 0; existing = this.browserWindows[i]; i++) {
- if (existing == browserWin) {
- throw new Error("Browser window has already been registered.");
- }
- }
-
- this.browserWindows.push(browserWin);
- },
-
- unregisterBrowser: function(browserWin) {
- var existing;
-
- for (var i = 0; existing = this.browserWindows[i]; i++) {
- if (existing == browserWin) {
- this.browserWindows.splice(i, 1);
- return;
- }
- }
-
- throw new Error("Browser window is not registered.");
- },
-
- domContentLoaded: function(wrappedWindow) {
- var unsafeWin = wrappedWindow.wrappedJSObject;
- var unsafeLoc = new XPCNativeWrapper(unsafeWin, "location").location;
- var href = new XPCNativeWrapper(unsafeLoc, "href").href;
- var scripts = this.initScripts(href);
-
- if (scripts.length > 0) {
- this.injectScripts(scripts, href, unsafeWin);
- }
- },
-
-
- startup: function() {
- Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader)
- .loadSubScript("chrome://global/content/XPCNativeWrapper.js");
-
- Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader)
- .loadSubScript("chrome://greasemonkey/content/prefmanager.js");
-
- Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader)
- .loadSubScript("chrome://greasemonkey/content/utils.js");
-
- Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader)
- .loadSubScript("chrome://greasemonkey/content/config.js");
-
- Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader)
- .loadSubScript("chrome://greasemonkey/content/convert2RegExp.js");
-
- Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader)
- .loadSubScript("chrome://greasemonkey/content/miscapis.js");
-
- Cc["@mozilla.org/moz/jssubscript-loader;1"]
- .getService(Ci.mozIJSSubScriptLoader)
- .loadSubScript("chrome://greasemonkey/content/xmlhttprequester.js");
-
- loggify(this, "GM_GreasemonkeyService");
- },
-
-
- initScripts: function(url) {
- var config = new Config(getScriptFile("config.xml"));
- var scripts = [];
- config.load();
-
- outer:
- for (var i = 0; i < config.scripts.length; i++) {
- var script = config.scripts[i];
- if (script.enabled) {
- for (var j = 0; j < script.includes.length; j++) {
- var pattern = convert2RegExp(script.includes[j]);
-
- if (pattern.test(url)) {
- for (var k = 0; k < script.excludes.length; k++) {
- pattern = convert2RegExp(script.excludes[k]);
-
- if (pattern.test(url)) {
- continue outer;
- }
- }
-
- scripts.push(script);
-
- continue outer;
- }
- }
- }
- }
-
- log("* number of matching scripts: " + scripts.length);
- return scripts;
- },
-
- injectScripts: function(scripts, url, unsafeContentWin) {
- var sandbox;
- var script;
- var logger;
- var storage;
- var xmlhttpRequester;
- var safeWin = new XPCNativeWrapper(unsafeContentWin);
-
- for (var i = 0; script = scripts[i]; i++) {
- sandbox = new Components.utils.Sandbox(safeWin);
-
- logger = new GM_ScriptLogger(script);
- storage = new GM_ScriptStorage(script);
- xmlhttpRequester = new GM_xmlhttpRequester(unsafeContentWin,
- appSvc.hiddenDOMWindow);
-
- sandbox.window = safeWin;
- sandbox.document = sandbox.window.document;
- sandbox.unsafeWindow = unsafeContentWin;
-
- // hack XPathResult since that is so commonly used
- sandbox.XPathResult = Ci.nsIDOMXPathResult;
-
- // add our own APIs
- sandbox.GM_addStyle = function(css) { GM_addStyle(sandbox.document, css) };
- sandbox.GM_log = GM_hitch(logger, "log");
- sandbox.GM_setValue = GM_hitch(storage, "setValue");
- sandbox.GM_getValue = GM_hitch(storage, "getValue");
- sandbox.GM_openInTab = GM_hitch(this, "openInTab", unsafeContentWin);
- sandbox.GM_xmlhttpRequest = GM_hitch(xmlhttpRequester,
- "contentStartRequest");
- sandbox.GM_registerMenuCommand = GM_hitch(this,
- "registerMenuCommand",
- unsafeContentWin);
-
- sandbox.__proto__ = safeWin;
-
- try {
- this.evalInSandbox("(function(){\n" +
- getContents(getScriptFileURI(script.filename)) +
- "\n})()",
- url,
- sandbox);
- } catch (e) {
- GM_logError(e);
- }
- }
- },
-
- registerMenuCommand: function(unsafeContentWin, commandName, commandFunc,
- accelKey, accelModifiers, accessKey) {
- var command = {name: commandName,
- accelKey: accelKey,
- accelModifiers: accelModifiers,
- accessKey: accessKey,
- doCommand: commandFunc,
- window: unsafeContentWin };
-
- for (var i = 0; i < this.browserWindows.length; i++) {
- this.browserWindows[i].registerMenuCommand(command);
- }
- },
-
- openInTab: function(unsafeContentWin, url) {
- var unsafeTop = new XPCNativeWrapper(unsafeContentWin, "top").top;
-
- for (var i = 0; i < this.browserWindows.length; i++) {
- this.browserWindows[i].openInTab(unsafeTop, url);
- }
- },
-
- evalInSandbox: function(code, codebase, sandbox) {
- // DP beta+
- if (Components.utils && Components.utils.Sandbox) {
- Components.utils.evalInSandbox(code, sandbox);
- // DP alphas
- } else if (Components.utils && Components.utils.evalInSandbox) {
- Components.utils.evalInSandbox(code, codebase, sandbox);
- // 1.0.x
- } else if (Sandbox) {
- evalInSandbox(code, sandbox, codebase);
- } else {
- throw new Error("Could not create sandbox.");
- }
- },
- };
-
- //loggify(greasemonkeyService, "greasemonkeyService");
-
-
-
- /**
- * XPCOM Registration goop
- */
- var Module = new Object();
-
- Module.registerSelf = function(compMgr, fileSpec, location, type) {
- compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
- compMgr.registerFactoryLocation(CID,
- CLASSNAME,
- CONTRACTID,
- fileSpec,
- location,
- type);
-
- var catMgr = Cc["@mozilla.org/categorymanager;1"]
- .getService(Ci.nsICategoryManager);
-
- catMgr.addCategoryEntry("http-startup-category",
- CLASSNAME,
- CONTRACTID,
- true,
- true);
- }
-
- Module.getClassObject = function(compMgr, cid, iid) {
- if (!cid.equals(CID)) {
- throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
- }
-
- if (!iid.equals(Ci.nsIFactory)) {
- throw Components.results.NS_ERROR_NO_INTERFACE;
- }
-
- return Factory;
- }
-
- Module.canUnload = function(compMgr) {
- return true;
- }
-
-
- var Factory = new Object();
-
- Factory.createInstance = function(outer, iid) {
- if (outer != null) {
- throw Components.results.NS_ERROR_NO_AGGREGATION;
- }
-
- return greasemonkeyService;
- }
-
-
- function NSGetModule(compMgr, fileSpec) {
- return Module;
- }
-
- //loggify(Module, "greasemonkeyService:Module");
- //loggify(Factory, "greasemonkeyService:Factory");
-