其实很久都没有认真的总结一下关于配置的使用。
有时候在想,mozilla到底是如何运作的,时而懂时而不懂,说到底还是不清楚。
借此,总结一下。
今天拿到的关于 tree 的 demo 后,发现 defaults 文件夹下多了一个 js 文件。一个不该那样命名的 js 文件出现在这里,困惑,但发现 prefs.js 中并没有启动客户端的任何程序。而所有的配置信息放在了另一个 js 文件夹下。
这才清楚,mozilla 貌似不是在找文件名,而是在找配置选项,不管你是在哪(局限于defaults 文件夹下)定义的。
查看文档,配置分为两种,一个是自定义配置,一个是默认配置。自定义配置可以通过使用GUI设置,也可以在配置文件中使用 user_pref() 方法来实现;默认配置则需要放在扩展中,且需要用 pref() 方法来实现。经此,可验证上述判断是正确的。
(注:其实还有一个方法 lock_pref(),参看 config.file 文档。可通过 general.config.filename 从默认配置中调用到。
)
为 mozilla 创建扩展的话,是需要符合它的规范的,通常命名在 chrome manifest 里。而配置文件也需要有自己的标准路径,即:
再次验证一个说法,就是只需要在这个目录下扔一个js文件即可,mozilla 在加载扩展时会自动读取该路径下的配置文件,并进行配置。跟js的文件命名完全没有关系,但一般,为了方便我们识别这个文件的意图,我们还是用 prefs.js 来为之命名。这个习惯是良好的。
不过,这个 js 文件不是真正的 js 文件,它不能设置变量,一般的函数也无法使用,它真正意义上其实就是一个 ini 文件。如果写错了该文件,程序将没有任何错误提示,这种麻烦最揪心了。所以写的时候还是好好遵守规范吧。
来个例子:
作为初始配置文件,一些基本设置就可以随意设置了。另外,还可以动态的修改这些配置,不过这些配置的修改完成需要等程序关闭时才会体现在配置文件中哦。这一点也曾经害过我。
再了解一下配置文件的加载顺序:
1. 先加载默认配置,与平台无关的js文件先加载,以倒序的形式加载;再加载与平台相关的 js 文件;
2. 根据选项加载 config 文件;
3. 加载自定义配置文件。先是 prefs.js;再 user.js。
另外,配置文件的加载是通过 xpi 包加载的~
下边就说一下怎么动态读取和修改这些配置。这一实现是需要调用 XPCOM 接口的哦。
大致有三个API入口,nsIPrefService, nsIPrefBranch, nsIPrefBranch2 等。
我个人觉得看文档不如看源码,所以这里贴源码了就,然后再简述下,增进理解~
nsIPrefService,这个接口主要是对配置文件的读取,重置,写入,读取分支。(个人理解分支的意思是:分支里的配置项有相同的前缀,分支里包括一个或多个配置项。)
nsIPrefBranch ,这个接口主要是对分支项里每一项进行处理了。基本就是对各类数据项的读取和设置,或者包括子节点列表之类。
nsIPrefBranch2, 这个接口一看名字就知道是对上边的接口的扩充。至于为什么不将此文件写入到上边的那个文件中,可以考虑COM组件的接口定义里涉及到的技术,应该是考虑到编译器上的问题,还不是很清楚的理解,正在整理中。
不过这个接口主要是实现了侦听机制的实现。这个接口目前我还没有使用过~~~
用几个例子说明一下:
对于 pref 里涉及到的复杂类型,比如字符串对象或者文件对象之类。可考虑一下方法:
实例:关于字符串的。
另一个例子:
读取文件中的数据:
设置文件中数据:
对于 nsIPrefBranch2 的例子:
ok,大概就这样了。相对来说比较全面一些。不过关于配置窗口部分没有表述。
我还没用过,回头写个demo再来写。