How to use userChrome script - 20110521更新
第一步,首先要安装userChrome扩展,点这里安装
第二步,修改profiles/chrome目录下的userChrome.js文件,添加加载规则,如下图
第三步,把userChrome脚本文件放到profiles/chrome目录下,重启firefox加载。
ps:userChrome脚本文件只支持.js或者.xul两种后缀。
推荐几个交流userChrome脚本的地方
——————————————————————————–
其他内容索引:
——————————————————————————–
-> userChrome.js文件下载:
对于安装userChromeJs扩展没有自动生成userChrome.js文件的用户,可以自己手动创建,或者直接点击下面的链接下载。
点击下载
——————————————————————————–
-> chrome目录找不到的看这:
Help -> TroubleShooting 进入问题诊断页面

点击后进入profile目录,chrome是其一个子目录。
——————————————————————————–
-> 高级加载规则:
上面的步骤是让uc脚本工作的最简单办法。
通过userChrome.js文件,我们还可以实现一些更有效更高级的脚本加载策略和文件管理。
- 默认情况下,在每一个chrome窗口(location是chrome://开头的)load完后,userChrome.js都会被执行,所以上面的规则会把所有的脚本都执行一遍。然而,大部分的uc脚本都是针对主窗口chrome的(就是主体的浏览窗口),其他的比如侧边栏、下载页面等是没必要加载的。利用下面这个规则,可以使main文件夹下的脚本只在主窗口chrome load完时加载
- 如果你还有一些针对其他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"); } - userChrome.import函数支持灵活地加载文件,便于对脚本进行文件管理。
使用绝对路径加载文件(注意反斜线要转义)userChrome.import("C:\\Program Files\\Mozilla\\scripts\\myscript.js");使用绝对路径加载目录中的所有js和xul
userChrome.import("C:\\Program Files\\Mozilla\\scripts");使用相对路径时,需要使用第二个参数token来指定起始目录。
这是支持的所有值。
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') {
......
}
——————————————————————————–
-> 已知问题:
- 如果有多个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 - 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
- Tab Kit - tab相关的一些小脚本 for firefox4
- [userChrome script]flybar - 居中地址栏和搜索框 (扩展版 - flybar)
- pentadactyl试用记
- Customize firefox shortcuts - 自定义firefox快捷键
- [KeySnail]编辑模式下使用可输入字符作为快捷键


Pingback: Xiao Shan » Customize my firefox4 – 折腾Firefox4
有个叫UC的扩展,就是userChrome的图形化版+增强版……推荐下支持到最新的每小时版firefox ^ ^
这个还真不知道,感谢分享,回头试用一下,研究研究有什么增强