home *** CD-ROM | disk | FTP | other *** search
/ PC Professionell 2006 March / PCpro_2006_03.ISO / files / freeware / greasemonkey-0.6.4-fx.xpi / chrome / chromeFiles / content / utils.js < prev    next >
Encoding:
Text File  |  2005-11-30  |  10.9 KB  |  371 lines

  1.  
  2.  
  3. // TODO: properly scope this nastiness
  4. const GUID = "{e4a8a97b-f2ed-450b-b12d-ee082ba24781}";
  5. const NAMESPACE = "http://youngpup.net/greasemonkey";
  6.  
  7. var GM_consoleService = Components.classes["@mozilla.org/consoleservice;1"]        
  8.                         .getService(Components.interfaces.nsIConsoleService);
  9.  
  10. function GM_isDef(thing) {
  11.   return typeof(thing) != "undefined";
  12. }
  13.  
  14. function GM_hitch(obj, meth) {
  15.   if (!obj[meth]) {
  16.     throw "method '" + meth + "' does not exist on object '" + obj + "'";
  17.   }
  18.   
  19.   var staticArgs = Array.prototype.splice.call(arguments, 2, arguments.length);
  20.  
  21.   return function() { 
  22.     // make a copy of staticArgs (don't modify it because it gets reused for
  23.     // every invocation).
  24.     var args = staticArgs.concat();
  25.  
  26.     // add all the new arguments
  27.     for (var i = 0; i < arguments.length; i++) {
  28.       args.push(arguments[i]);
  29.     }
  30.  
  31.     // invoke the original function with the correct this obj and the combined
  32.     // list of static and dynamic arguments.
  33.     return obj[meth].apply(obj, args);
  34.   };
  35. }
  36.  
  37. function GM_listen(source, event, listener, opt_capture) {
  38.   Components.lookupMethod(source, "addEventListener").apply(
  39.     source, [event, listener, opt_capture]);
  40. }
  41.  
  42. function GM_unlisten(source, event, listener, opt_capture) {
  43.   Components.lookupMethod(source, "removeEventListener").apply(
  44.     source, [event, listener, opt_capture]);
  45. }
  46.  
  47. /**
  48.  * Utility to create an error message in the log without throwing an error.
  49.  */
  50. function GM_logError(e, opt_warn) {
  51.   var consoleService = Components.classes['@mozilla.org/consoleservice;1']
  52.     .getService(Components.interfaces.nsIConsoleService);
  53.  
  54.   var consoleError = Components.classes['@mozilla.org/scripterror;1']
  55.     .createInstance(Components.interfaces.nsIScriptError);
  56.  
  57.   var flags = opt_warn ? 1 : 0;
  58.  
  59.   consoleError.init(e.message, e.fileName, e.lineNumber, e.lineNumber,
  60.                     e.columnNumber, flags, null);
  61.  
  62.   consoleService.logMessage(consoleError);
  63. }
  64.  
  65. function GM_log(message, force) {
  66.   if (force || GM_prefRoot.getValue("logChrome", false)) {
  67.     GM_consoleService.logStringMessage(message);
  68.   }
  69. }
  70.  
  71. // TODO: this stuff was copied wholesale and not refactored at all. Lots of
  72. // the UI and Config rely on it. Needs rethinking.
  73.  
  74. function openInEditor(aFile) {
  75.   var editor, editorPath;
  76.   try {
  77.     editorPath = GM_prefRoot.getValue("editor");
  78.   } catch(e) {
  79.     GM_log( "Failed to get 'editor' value:" + e );
  80.     if (GM_prefRoot.exists("editor")) {
  81.       GM_log("A value for 'editor' exists, so let's remove it because it's causing problems");
  82.       GM_prefRoot.remove("editor");
  83.     }
  84.     editorPath = false;
  85.   }
  86.   if (editorPath) {
  87.     // check whether the editor path is valid
  88.     GM_log("Try editor with path " + editorPath);
  89.     editor = Components.classes["@mozilla.org/file/local;1"]
  90.         .createInstance(Components.interfaces.nsILocalFile);
  91.     editor.followLinks = true;
  92.     editor.initWithPath(editorPath);
  93.   } else {
  94.     var nsIFilePicker = Components.interfaces.nsIFilePicker;
  95.     var filePicker = Components.classes["@mozilla.org/filepicker;1"]
  96.       .createInstance(nsIFilePicker);
  97.     
  98.     filePicker.init(window, "Find Text Editor", nsIFilePicker.modeOpen);
  99.     filePicker.appendFilters(nsIFilePicker.filterApplication);
  100.     filePicker.appendFilters(nsIFilePicker.filterAll);
  101.     
  102.     if (filePicker.show() != nsIFilePicker.returnOK) {
  103.       return false;
  104.     }
  105.     editor = filePicker.file;
  106.     GM_log("User selected: " + editor.path);
  107.     GM_prefRoot.setValue("editor", editor.path);
  108.   }
  109.  
  110.   if (editor.exists() && editor.isExecutable()) {
  111.     try {
  112.       GM_log("launching ...");
  113.       
  114.       var mimeInfoService = Components
  115.         .classes["@mozilla.org/uriloader/external-helper-app-service;1"]
  116.         .getService(Components.interfaces.nsIMIMEService);
  117.       var mimeInfo = mimeInfoService
  118.         .getFromTypeAndExtension( "application/x-userscript+javascript", "user.js" );
  119.       mimeInfo.preferredAction = mimeInfo.useHelperApp
  120.       mimeInfo.preferredApplicationHandler = editor;
  121.       mimeInfo.launchWithFile( aFile );
  122.       return true;
  123.     } catch (e) {
  124.       GM_log("Failed to launch editor: " + e, true);
  125.     }
  126.   } else {
  127.     GM_log("Editor '" + editorPath + "' does not exist or isn't executable. " +
  128.            "Put it back, check the permissions, or just give up and reset " +
  129.            "editor using about:config", true)
  130.   }
  131.   return false;
  132. }
  133.  
  134. function parseScriptName(sourceUri) {
  135.   var name = sourceUri.spec;
  136.   name = name.substring(0, name.indexOf(".user.js"));
  137.   name = name.substring(name.lastIndexOf("/") + 1);
  138.   return name;
  139. }
  140.  
  141. function getTempFile() {
  142.   var file = Components.classes["@mozilla.org/file/directory_service;1"]
  143.         .getService(Components.interfaces.nsIProperties)
  144.         .get("TmpD", Components.interfaces.nsILocalFile);
  145.  
  146.   file.append("gm_" + new Date().getTime());
  147.  
  148.   return file;
  149. }
  150.  
  151. function getContents(aURL, charset){
  152.   if( !charset ) {
  153.     charset = "UTF-8"
  154.   }
  155.   var ioService=Components.classes["@mozilla.org/network/io-service;1"]
  156.     .getService(Components.interfaces.nsIIOService);
  157.   var scriptableStream=Components
  158.     .classes["@mozilla.org/scriptableinputstream;1"]
  159.     .getService(Components.interfaces.nsIScriptableInputStream);
  160.   // http://lxr.mozilla.org/mozilla/source/intl/uconv/idl/nsIScriptableUConv.idl
  161.   var unicodeConverter = Components
  162.     .classes["@mozilla.org/intl/scriptableunicodeconverter"]
  163.     .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
  164.   unicodeConverter.charset = charset;
  165.  
  166.   var channel=ioService.newChannelFromURI(aURL);
  167.   var input=channel.open();
  168.   scriptableStream.init(input);
  169.   var str=scriptableStream.read(input.available());
  170.   scriptableStream.close();
  171.   input.close();
  172.  
  173.   try {
  174.     return unicodeConverter.ConvertToUnicode(str);
  175.   } catch( e ) {
  176.     return str;
  177.   }
  178. }
  179.  
  180. function getWriteStream(file) {
  181.   var stream = Components.classes["@mozilla.org/network/file-output-stream;1"]
  182.     .createInstance(Components.interfaces.nsIFileOutputStream);
  183.  
  184.   stream.init(file, 0x02 | 0x08 | 0x20, 420, -1);
  185.  
  186.   return stream;
  187. }
  188.  
  189. function getScriptFileURI(fileName) {
  190.   return Components.classes["@mozilla.org/network/io-service;1"]
  191.                    .getService(Components.interfaces.nsIIOService)
  192.                    .newFileURI(getScriptFile(fileName));
  193. }
  194.  
  195. function getScriptFile(fileName) {
  196.   var file = getScriptDir();
  197.   file.append(fileName);
  198.   return file;
  199. }
  200.  
  201. function getScriptDir() {
  202.   var dir = getNewScriptDir();
  203.  
  204.   if (dir.exists()) {
  205.     return dir;
  206.   } else {
  207.     return getOldScriptDir();
  208.   }
  209. }
  210.  
  211. function getNewScriptDir() {
  212.   var file = Components.classes["@mozilla.org/file/directory_service;1"]
  213.                        .getService(Components.interfaces.nsIProperties)
  214.                        .get("ProfD", Components.interfaces.nsILocalFile);
  215.   file.append("gm_scripts");
  216.   return file;
  217. }
  218.  
  219. function getOldScriptDir() {
  220.   var file = getContentDir();
  221.   file.append("scripts");
  222.   return file;
  223. }
  224.  
  225. function getContentDir() {
  226.   var reg = Components.classes["@mozilla.org/chrome/chrome-registry;1"]
  227.                       .getService(Components.interfaces.nsIChromeRegistry);
  228.  
  229.   var ioSvc = Components.classes["@mozilla.org/network/io-service;1"]
  230.                         .getService(Components.interfaces.nsIIOService);
  231.  
  232.   var proto = Components.classes["@mozilla.org/network/protocol;1?name=file"]
  233.                         .getService(Components.interfaces.nsIFileProtocolHandler);
  234.  
  235.   var chromeURL = ioSvc.newURI("chrome://greasemonkey/content", null, null);
  236.   var fileURL = reg.convertChromeURL(chromeURL);
  237.   var file = proto.getFileFromURLSpec(fileURL.spec).parent;
  238.  
  239.   return file
  240. }
  241.  
  242. /**
  243.  * Takes the place of the traditional prompt() function which became broken
  244.  * in FF 1.0.1. :(
  245.  */
  246. function gmPrompt(msg, defVal, title) {
  247.   var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]       
  248.                                 .getService(Components.interfaces.nsIPromptService);
  249.   var result = {value:defVal};
  250.   
  251.   if (promptService.prompt(null, title, msg, result, null, {value:0})) {
  252.     return result.value;
  253.   }
  254.   else {
  255.     return null;
  256.   }
  257. }
  258.  
  259. function ge(id) {
  260.     return window.document.getElementById(id);
  261. }
  262.  
  263.  
  264. function dbg(o) {
  265.   var s = "";
  266.   var i = 0;
  267.  
  268.   for (var p in o) {
  269.     s += p + ":" + o[p] + "\n";
  270.  
  271.     if (++i % 15 == 0) {
  272.       alert(s);
  273.       s = "";
  274.     }
  275.   }
  276.  
  277.   alert(s);
  278. }
  279.  
  280. function delaydbg(o) {
  281.     setTimeout(function() {dbg(o);}, 1000);
  282. }
  283.  
  284. function delayalert(s) {
  285.     setTimeout(function() {alert(s);}, 1000);
  286. }
  287.  
  288. function GM_deepWrappersEnabled(someXPCObject) {
  289.   // the old school javacript wrappers had this property containing their
  290.   // untrusted variable. the new ones don't.
  291.   return !(new XPCNativeWrapper(someXPCObject).mUntrustedObject);
  292. }
  293.  
  294. function GM_isGreasemonkeyable(url) {
  295.   var scheme = Components.classes["@mozilla.org/network/io-service;1"]
  296.                .getService(Components.interfaces.nsIIOService)
  297.                .extractScheme(url);
  298.  
  299.   return (scheme == "http" || scheme == "https" || scheme == "file") &&
  300.          !/hiddenWindow\.html$/.test(url);
  301. }
  302.  
  303. function GM_isFileScheme(url) {
  304.   var scheme = Components.classes["@mozilla.org/network/io-service;1"]
  305.                .getService(Components.interfaces.nsIIOService)
  306.                .extractScheme(url);
  307.  
  308.   return scheme == "file";
  309. }
  310.  
  311. function GM_getEnabled() {
  312.   return GM_prefRoot.getValue("enabled", true);
  313. }
  314.  
  315. function GM_setEnabled(enabled) {
  316.   GM_prefRoot.setValue("enabled", enabled);
  317. }
  318.  
  319.  
  320. /**
  321.  * Logs a message to the console. The message can have python style %s 
  322.  * thingers which will be interpolated with additional parameters passed.
  323.  */
  324. function log(message) {
  325.   if (GM_prefRoot.getValue("logChrome", false)) {
  326.     logf.apply(null, arguments);
  327.   }
  328. }
  329.  
  330. function logf(message) {
  331.   for (var i = 1; i < arguments.length; i++) {
  332.     message = message.replace(/\%s/, arguments[i]);
  333.   }
  334.  
  335.   dump(message + "\n");
  336. }
  337.  
  338. /**
  339.  * Loggifies an object. Every method of the object will have it's entrance, 
  340.  * any parameters, any errors, and it's exit logged automatically.
  341.  */
  342. function loggify(obj, name) {
  343.   for (var p in obj) {
  344.     if (typeof obj[p] == "function") {
  345.       obj[p] = gen_loggify_wrapper(obj[p], name, p);
  346.     }
  347.   }
  348. }
  349.  
  350. function gen_loggify_wrapper(meth, objName, methName) {
  351. return function() {
  352.      var retVal;
  353.     //var args = new Array(arguments.length);
  354.     var argString = "";
  355.     for (var i = 0; i < arguments.length; i++) {
  356.       //args[i] = arguments[i];
  357.       argString += arguments[i] + (((i+1)<arguments.length)? ", " : "");
  358.     }
  359.     
  360.     log("> %s.%s(%s)", objName, methName, argString);//args.join(", "));
  361.     
  362.     try {
  363.       return retVal = meth.apply(this, arguments);
  364.     } finally {
  365.       log("< %s.%s: %s", 
  366.           objName, 
  367.           methName, 
  368.           (typeof retVal == "undefined" ? "void" : retVal));
  369.     }
  370.   }
  371. }