How to use userChrome script - 20110521更新

(16,900 views)
August 13, 2010

第一步,首先要安装userChrome扩展,点这里安装

第二步,修改profiles/chrome目录下的userChrome.js文件,添加加载规则,如下图

userChrome.js加载规则

userChrome.js加载规则

第三步,把userChrome脚本文件放到profiles/chrome目录下,重启firefox加载。

ps:userChrome脚本文件只支持.js或者.xul两种后缀。

推荐几个交流userChrome脚本的地方

——————————————————————————–
其他内容索引

  1. useChrome.js文件下载
  2. chrome目录在哪
  3. 高级加载规则
  4. 已知问题

——————————————————————————–
-> userChrome.js文件下载
对于安装userChromeJs扩展没有自动生成userChrome.js文件的用户,可以自己手动创建,或者直接点击下面的链接下载。
点击下载
——————————————————————————–
-> chrome目录找不到的看这
Help -> TroubleShooting 进入问题诊断页面

点击后进入profile目录,chrome是其一个子目录。
——————————————————————————–
-> 高级加载规则
上面的步骤是让uc脚本工作的最简单办法。
通过userChrome.js文件,我们还可以实现一些更有效更高级的脚本加载策略和文件管理。

  1. 默认情况下,在每一个chrome窗口(location是chrome://开头的)load完后,userChrome.js都会被执行,所以上面的规则会把所有的脚本都执行一遍。然而,大部分的uc脚本都是针对主窗口chrome的(就是主体的浏览窗口),其他的比如侧边栏、下载页面等是没必要加载的。利用下面这个规则,可以使main文件夹下的脚本只在主窗口chrome load完时加载
  2. if (location == "chrome://browser/content/browser.xul") {
        userChrome.import("main", "UChrm");
    }

    【以前写的有错误:在网页窗口load完后userChrome.js不会执行】
    有时在error console(error console本身也是一个chrome窗口)中会有一些uc脚本的异常,其实他们大多数都是由uc脚本在非主窗口load时被加载引起的,因为这些脚本的实现是基于主窗口的,在侧边栏或者历史记录窗口执行,由于很多对象都没有,所以会出错。应用上面这个规则就可以避免这些错误。

    另外,如果在uc脚本开始处加上下面的代码,可以一定程度上避免在非主窗口chrome加载时出错。

    try {
        if(!gBrowser) return;
    }catch(e) {
        return;
    }

    用这个更直接

    if(location == 'chrome://browser/content/browser.xul') {
    ......
    }
    
  3. 如果你还有一些针对其他chrome窗口做了增强的脚本,那么可以把这类脚本放在各自对应的目录中(比如,对应书签管理器窗口的脚本建个bookmark目录),在上面的if语句后添加对应的else语句。
    if (location == "chrome://browser/content/browser.xul") {
        userChrome.import("main", "UChrm");
    } else if(location == "chrome://browser/content/bookmarks/bookmarksManager.xul"){
        userChrome.import("bookmark", "UChrm");
    }
  4. userChrome.import函数支持灵活地加载文件,便于对脚本进行文件管理。
    使用绝对路径加载文件(注意反斜线要转义)

    userChrome.import("C:\\Program Files\\Mozilla\\scripts\\myscript.js");

    使用绝对路径加载目录中的所有js和xul

    userChrome.import("C:\\Program Files\\Mozilla\\scripts");

    使用相对路径时,需要使用第二个参数token来指定起始目录。
    这是支持的所有值。

    firefox special directory

    firefox special directory

——————————————————————————–
-> 已知问题

  1. 如果有多个xul脚本,可能会导致某些xul加载不成功
    只有一个xul脚本时不会存在这个问题。
    导致这个问题的原因是,userChrome通过loadOverlay来加载xul脚本,但是loadOverlay有个限制:在一个overlay加载完成后才能加载下一个,否则的话两个overlay都加载不成功。由于overlay加载完成与否并没有办法识别,所有userChrome是通过设置一个延时来加载下一个,但是延时并不能保证顺序加载,仍然有可能出现连续加载的2个xul都不能加载成功的问题。
    bugzilla里有个bug在追踪这个问题
    Bug 330458 – Cannot dynamically load an overlay using document.loadOverlay until a previous overlay is completely loaded

  2. js脚本中不支持unicode字符
    如果在js中有中文或者其他unicode字符串,不能被正确识别。
    导致这个问题的原因是,userChrome通过mozIJSSubscriptLoader::loadSubScript来加载js脚本,但是API未提供指定字符编码的接口参数,默认都是按照ISO-8859-1来处理。

    firefox4已经修复了这个问题(Bug 377498),4.0rc和每夜版都已支持character encoding参数。
    这样调用:

    loader.loadSubScript(uri, module, "UTF-8");

    Bug 377498 – mozIJSSubscriptLoader::loadSubScript does not support specifying the character encoding (treats all files as ISO-8859-1)
    Bug 506760 – Mozmill tests with UTF-8 characters involved cannot be executed

    下面是一个简单的测试代码

    try {
        var testFilePath = 'E:\\test.uc.js';
        var testFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile);
        testFile.initWithPath(testFilePath);
        Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader).loadSubScript(Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService).getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler).getURLSpecFromFile(testFile), window, 'UTF-8');
    } catch(e) {
        alert(e);
    }
    

    test.uc.js的文件内容

    (function() {
        alert("测试");
    })();
    

    文件以utf-8编码保存。

    执行时,“测试”会正确的alert出来。

    现在只欠userChrome扩展升级使用该参数load脚本即可。
    [!!!]已于作者沟通,1.4开发版已支持unicode编码,不过我还没时间测试,有兴趣的可以试试


related post

(16,900 views)

3 Responses to How to use userChrome script

  1. Pingback: Xiao Shan » Customize my firefox4 – 折腾Firefox4

  2. pein0saga says:

    有个叫UC的扩展,就是userChrome的图形化版+增强版……推荐下支持到最新的每小时版firefox ^ ^

    • admin says:

      这个还真不知道,感谢分享,回头试用一下,研究研究有什么增强

①若要贴代码,请将 "<" 改成 "&lt;",">" 改成 "&gt;".
②若要从他人留言中复制代码,注意检查引号可能是中文的,请手动修改成英文符号,避免不能工作