对于 Firefox 扩展来说,install.rdf 和 chrome.manifest 都很格式化,每个扩展都可以从一个相同的模板少许改动即可。真正重要的是 .xul 界面定义。

XUL 是 Mozilla 基于 XML 的一种界面定义语言,完整的参考文档在这里。对于覆盖技术也不仅是 Firefox 的专利,而是 Mozilla 所有产品通用的。

一个 Firefox 扩展的覆盖 XUL 框架大致是这样: <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet href="chrome://foo/skin/overlay.css" type="text/css"?> <!DOCTYPE overlay SYSTEM "chrome://foo/locale/foo.dtd"> <overlay id="foo-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript" src="chrome://foo/content/overlay.js"></script> <stringbundleset id="stringbundleset"> <stringbundle id="foo-strings" src="chrome://foo/locale/foo.properties"/> </stringbundleset> ... </overlay>

这里面有 XML 的标准头定义,然后是 XUL 控件使用的 CSS 样式表定义,使用文字的本地化定义。主要的内容是覆盖的定义以及下面的 JS 功能脚本以及额外的本地化字符串属性文件。除开覆盖本身的定义,其他的都是可选的。省略号表示的是具体的覆盖内容。比如:

  • 覆盖工具菜单。
  • <menupopup id="menu_ToolsPopup"> <menuitem insertafter="devToolsSeparator" label="Options..." oncommand="foo.showOptions();" /> </menupopup>
  • 覆盖右键弹出菜单(在增加的子菜单中)。
  • <popup id="contentAreaContextMenu"> <menu label="foo"> <menupopup> <menuitem insertafter="devToolsSeparator" label="Options..." oncommand="foo.showOptions();" /> </menupopup> </menu> </popup>
  • 工具栏。
  • <toolbarpalette id="BrowserToolbarPalette"> <toolbarbutton id="foo-toolbar-button" label="Options..." tooltiptext="Foo Options" oncommand="foo.showOptions()" class="toolbarbutton-1 chromeclass-toolbar-additional"/> </toolbarpalette>
  • 状态栏。
  • <statusbar id="status-bar"> <statusbarpanel id="foo-panel" label="Options"/> </statusbar>