【Firefox扩展】XPInstall的安装脚本浅析

        JavaScript功能很强大,但是在处理大规模的程序设计时需要拥有很多经验才能游刃有余,而XPCOM则正是长于处理那些用JavaScript不容易处理的部分,譬如将工程模块化。

        用C++构建出XPCOM组件后,会生成链接库dll文件和类型库xpt文件后,需要注册我们的XPCOM组建,基本上有两种方法注册:
        1.XPInstall技术;
        2.Gecko SDK的regxpcom。
        如果你从网上搜一下,会搜到如下的注册步骤:
注册新组件到Mozilla中

a. 拷贝 MyComponent.so
/ MyComponent.dll和IMyComponent.xpt 到Mozilla的components目录。在Windows下这个目录一般在 C:Program FilesMozilla Firefoxcomponents. Linux下 ~/ firefox / components (或 ~/ mozilla / components)

b. 运行Gecko SDK 提供的regxpcom注册新组件,你可以用 regxpcom 
- x components路径 来注册,或者在Mozilla安装路径下创建.autoreg,让它自动注册。

c. 删除Mozilla配置目录下的 xpti.dat 和compreg.dat. Windows配置目录在C:Documents and SettingsUSERNAMEApplication DataMozillaFirefoxProfiles
default . ??? , Linux下的在 ~/ .mozilla / firefox / default . ???  下。
        很麻烦,而且如果删掉这两个文件后,会把用户的一些配置信息一同delete掉,有些阴毒,所以还是自己写一个install.js的安装脚本比较好,这就要用到XPInstall相关技术。

        当然XPI安装文件可以包含install.js用来注册xpcom的组件,但是这种方法不会像用install.rdf的方式可以在Firefox的工具栏中的工具->附加软件中卸载,也不会提示安装结束这样的东东,但是还是会用于基于Gecko的软件中,Mozilla扩展中,或独立组件的安装注册。
         要理解安装脚本install.js,需要理解Mozilla的目录结构,如Chrome、和Profile都是些什么,这里只简单的说一下Chrome。Firefox的Chrome就像windows平台下的注册表,它管理安装到基于Gecko软件、皮肤、扩展、PlugIN等东西。可以理解为一个数据库,我们编写的xpt、dll、jar等形式的文件注册到chrome里后,才可以被firefox使用。
         基于XPInstall做出的安装脚本须命名为install.js,而且它必须位于一个XPI扩展包的最上层,所以将xpt和dll文件准备好,放在同一个文件夹中,然后用你喜欢的编辑器编辑js脚本,最简单的安装脚本如下:
var  err  =  initInstall( " WebLock " " weblock " 1.0 );
var  componentsDir  =  getFolder( " Components " );
var  cf  =  getFolder(“Chrome”);

addFile (
" weblock.dll " 1.0 , " weblock.dll " , componentsDir,  "" );

addFile (
" weblock.xpt " , “ 1.0 " , " weblock.xpt " , componentsDir,  "" );

err = addDirectory (“weblock”, “1.0”,“”, chromeDir, ““)

registerChrome(CONTENT, getFolder(cf,
" weblock.xpi " ), " weblock " );
registerChrome(SKIN, getFolder(cf, “weblock.xpi”),”weblock”);

if (err==SUCCESS)
      performInstall();
else
      cancelInstall(err);
        第一步是初始化安装,其函数原型为int  initInstall(String displayName,String package,InstallVersion version);三个参数分别为扩展的名称、扩展包的路径和扩展的版本,该函数有很多重载形式,比如扩展版本可以是一个字符串类型。这个函数主要负责初始化我们要安装的软件和版本。
        第二步是确定Firefox目录结构中的组件位置和Chrome位置,XPInstall提供的api函数getFolder可以完成此项功能,虽然getFolder的参数是一个String,但是这个String是被定制的,或者说,我们只能传给他一些特定的String,如例子中的Components和Chrome。当然还有其他的一些文件夹地址,这里略去不说。
        第三步是将我们准备好的dll和xpt文件放到Components文件夹中,同样是XPInstall的api函数addFile完成这项操作,我们需要做的只是填写它的参数,分别是组建的注册名、版本号、组件当前位置、组件的目标位置(components文件夹)和一个可选的为将来升级等操作用的布尔值。这个函数的作用是把我们写好的组件“安装”到Firefox中去。
         第四步是在chrome文件夹下建立一个子目录,用于保存我们注册的组件和xpi。
         第五步是在chrome中注册我们的组件,这里的两个 registerChrome主要用途是注册UI等信息。
         第六步是在确定之前几步没有出问题后,运行实际安装注册过程。
         总的来说是一个这样的过程,初始化->找到组件文件夹把xpt和dll放进去->找到chrome文件夹将xpi放进去->注册到chrome->运行安装。

         但是我在实际操作中,做了更多的简化,网上的很多资料比较老,很多东西对于现在的Firefox2.0.0.*会造成这样那样的问题,在分析了MDC中的Using XPInstall to Install Plugins中给出的一个安装脚本的模板后,我大胆的删掉了很多东西,剩下的就只有初始化、找到Component文件夹并将xpt和dll放进去,最后就是运行安装。其中关于chrome的操作都被delete掉了,打包成xpi后,是可以运行的,而且编写的js文件可以调用到xpcom编写的dll中的组件。(不过加了许多错误处理,由于是公司项目调研阶段的成果,不能把代码发到网上,但是和上面的代码大同小异)
        能够运行的原因我也找了很多资料,主要是Firefox每次启动都会像windows那样扫描注册表,而Firefox会加载扫描到了的xpt中类型信息,这其中包括了dll中组件的接口,所以就可以使用dll的组件。

        打包成xpi的方法很简单,用WinRAR以Zip为压缩文件格式,以.xpi为扩展名压缩即可,就可以安装到Firefox了。


        由于我也是初学,可能有很多地方有不妥之处,希望路过的朋友发现后给我留言并指出,不胜感激!      

你可能感兴趣的:(firefox,扩展,脚本,mozilla,components,chrome)