Firefox扩展开发研究

2011-12-31 00:00:00于志良
电脑知识与技术 2011年26期


  摘要:Firefox浏览器自身具有良好的扩展结构,开发人员可以方便地进行扩展。Firefox 扩展可以提升用户体验、解决一些使用Firefox过程中遇到的问题。该文以一个论坛自动回复的Firefox扩展作为案例,详细的介绍了Firefox扩展的开发流程。这其中包括构建开发环境、使用XUL来描述界面、使用JavaScript来为扩展行为。
  关键词:Firefox;浏览器;扩展;XPCOM
  中图分类号:TP393文献标识码:A 文章编号:1009-3044(2011)26-6537-02
  1 构建开发环境
  Firefox扩展是一些Firefox的附加组件,可以改变浏览器的现有功能或增加新的功能,一般由Javascript和XUL来实现,安装在个人的配置文件目录中。开发首先需要构建环境。Firefox 把用户设置和已安装的扩展都保存在一个配置文件中,默认名为 default。通过创建一个专门为开发使用的配置文件,可以不影响正常使用,也不会破坏个人信息。运行firefox–P,新建一个概要文件并运行Firefox。配置好用于开发的扩展:Venkman、Extension Developer's Extension和 Firebug。在地址栏输入about:config打开 Firefox 的参数设置页面。按照如下的设置修改参数:
  javascript.options.showInConsole = true //把 JavaScript 的出错信息显示在错误控制台;
  nglayout.debug.disable_xul_cache =true //禁用 XUL 缓存,使得对窗口和对话框的修改不需要重新加载 XUL文件;
  browser.dom.window.dump.enabled=true //允许dump() 语句向标准控制台输出信息;
  javascript.options.strict= true //在错误控制台中启用严格的 JavaScript 警告信息。
  2 构建扩展目录
  Firefox扩展是以一个xpi文件的形式发布的,其本质上是zip压缩包文件,有时在压缩包里面包含有jar格式文件,也是zip压缩包。解压后的Firefox 扩展的基本目录结构如图1所示[1]。
  content目录存放XUL 文件、JavaScript 文件,分别用于描述扩展的界面和行为;locale 目录存放与本地化相关的文件,如果需要支持英文和中文,可以在 locale 目录下面新建en-US和zh-CN目录来存放相应的本地化字符串;skin 目录存放CSS 文件用来定义扩展的外观;chrome.manifest 是注册的清单文件;install.rdf包含了扩展安装的信息。
  在之前构建的概要文件所在的目录下的extensions目录里新建一个文件install.rdf,指定扩展的 ID、名称、版本、创建者、描述等信息,Firefox就能识别并加载我们添加的扩展了。在对扩展做了一定的修改后,无需重启Firefox,只需要在Tools 菜单中单击 Extension Developer > Reload all Chrome 即可。
  3 构建用户界面
  Firefox扩展使用XUL来描述用户界面。XUL的描述方式基于XML,包括按钮、菜单和工具条等各种组件。Firefox自己的整个界面也是个XUL文件,可以通过chrome://browser/content/browser.xul访问。在chrome.manifest文件中用
  Overlaychrome://browser/content/browser.xul
  chrome://AutoReply_0.1/content/overlay.xul添加自定义的XUL。
  论坛自动回复扩展的chrome/content/overlay.xul文件使用菜单项启动扩展程序:
  
  
  
    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  
  
  
  

  

  menupopup段定义了一个位于“工具”菜单栏下的项目,其中id是菜单项的名称;label属性是菜单项显示的文本;oncommand属性定义菜单被点击后执行 overlay.js里面的方法。为了突出显示,在chrome/skin目录下新建overlay.css文件将其显示为红色:
  #AutoReply {color: red ! important;}
  4 添加菜单项事件响应
  当用户点击 Firefox 上面的Auto Reply菜单项时,调用AutoReply()方法,这是在 overlay.js 中定义的一个 JavaScript 方法。overlay.js 已经由 overlay.xul 包含进来。
  论坛自动回复扩展需要读取本地预置文本内容进行回复,文本内容以txt文件形式存放在指定目录下。
  由于安全问题,Firefox的Javascript文件不能直接操作本地文件,需要首先启用文件系统访问权限:
  netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
  XPCOM(Cross Platform Component Object Module:跨平台组件对象模型)技术可以解决Firefox操作本地文件的问题。XPCOM 是跨平台的组件对象模型,类似于微软的 COM但是实现方式不同,COM组件是注册在系统注册表中的,而XPCOM组件是通过Mozilla自己的注册表注册的,它有多种语言绑定,可以在 JavaScript,Java,Python 和 C++ 中使用和实现 XPCOM 的组件[2]。XPCOM 本身提供了一系列核心组件和类,比如文件和内存管理,线程,基本的数据结构(字符串,数组)等。
  XPCOM通过Components对象进行操作。在指定本地文件路径参数path后,创建nsIFile对象并使用path参数初始化[3],
  var aFile = Components.classes["@mozilla.org/file/local;1"]
  
  .createInstance(Components.interfaces.nsILocalFile);
  if (aFile instanceof Components.interfaces.nsILocalFile){
  aFile.initWithPath(path);
  如果path为网络路径,需要将nsILocalFile参数改为nsIIOService。接下来创建输入流fis并初始化:
  var fis = Components.classes["@mozilla.org/network/file-input-stream;1"]
  .createInstance(Components.interfaces.nsIFileInputStream);
  fis.init(aF