Chrome 注册

什么是 chrome?

Chrome 是应用程序窗口中位于窗口内容区域之外的用户界面元素的集合。工具栏、菜单栏、进度条和窗口标题栏都是通常属于 chrome 的元素示例。

chrome.manifest 文件用于注册 chrome 协议的 XPCOM 组件和源。每个应用程序都提供一个根 chrome.manifest 文件,Mozilla 在启动时读取该文件。

Chrome 提供程序

给定窗口类型(例如,浏览器窗口)的 chrome 供应商称为 chrome 提供程序。提供程序协同工作,为特定窗口提供一组完整的 chrome,从工具栏按钮上的图像到描述窗口本身的文本、内容和外观的文件。

有三种基本的 chrome 提供程序类型

内容

窗口描述的主要源文件来自内容提供程序,它可以是 Mozilla 内部可查看的任何文件类型。它通常是 XUL 文件,因为 XUL 旨在描述窗口和对话框的内容。定义用户界面的 JavaScript 文件也包含在内容包中。

语言环境

可本地化的应用程序将其所有本地化信息保存在语言环境提供程序和 Fluent FTL 文件中,这些文件是单独处理的。这允许翻译人员插入不同的 chrome 包来翻译应用程序,而无需更改其余源代码。在 chrome 提供程序中,可本地化文件主要是 Java 风格的属性文件。

皮肤

皮肤提供程序负责提供描述 chrome 的视觉外观的一组完整文件。通常,皮肤提供程序将提供 CSS 文件和图像。

Chrome 注册表

Gecko 运行时维护一项称为 chrome 注册表的服务,该服务提供从 chrome 包名称到磁盘上 chrome 包物理位置的映射。

此 chrome 注册表是可配置且持久的,因此用户可以安装不同的 chrome 提供程序,并选择首选的皮肤和语言环境。这是通过 xpinstall 和扩展管理器实现的。

为了通知 chrome 注册表可用的 chrome,使用文本清单:此清单位于扩展、主题或 XULRunner 应用程序根目录下的“chrome.manifest”中。

纯文本 chrome 清单采用简单的基于行的格式。每行都单独解析;如果该行可解析,则 chrome 注册表将执行该行标识的操作,否则 chrome 注册表将忽略该行(并在运行时错误控制台中打印警告消息)。

locale packagename localename path/to/files
skin packagename skinname path/to/files

注意

包名称中不允许使用字符 @ # ; : ? /。

清单指令

注释

# this line is a comment - you can put here whatever you want

如果一行以字符“#”开头,则该行就是注释。同一行中的任何后续字符都将被忽略。

清单

manifest subdirectory/foo.manifest [flags]

这将加载辅助清单文件。这对于分离组件和 chrome 注册指令或分离特定于平台的注册数据很有用。

组件

component {00000000-0000-0000-0000-000000000000} components/mycomponent.js [flags]

通知 Mozilla 有关由 JavaScript(或其他脚本语言,如果适用)中实现的 XPCOM 组件实现的组件 CID。ClassID {0000…} 必须与组件实现的 ClassID 匹配。要生成唯一的 ClassID,请使用 UUID 生成器程序或站点。

契约

contract @foobar/mycontract;1 {00000000-0000-0000-0000-000000000000} [flags]

将契约 ID(可读字符串)映射到特定实现的 ClassID。通常,契约 ID 将与紧接其前的组件条目配对。

类别

category category entry-name value [flags]

类别管理器 中注册条目。类别条目的特定格式和含义取决于类别。

内容

内容包使用以下行注册

content packagename uri/to/files/ [flags]

这将注册一个位置,在解析 URI chrome://packagename/content/... 时使用。URI 可以是绝对的,也可以相对于清单文件的位置。注意:它必须以“/”结尾。

语言环境

语言环境包使用以下行注册

locale packagename localename uri/to/files/ [flags]

解析 URI chrome://packagename/locale/… 时,这将注册语言环境包。localename 通常是纯语言标识符“en”或语言国家/地区标识符“en-US”。如果为一个包注册了多个语言环境,则 chrome 注册表将使用用户的首选项选择最合适的语言环境。

皮肤

皮肤包使用以下行注册

skin packagename skinname uri/to/files/ [flags]

解析 URI chrome://packagename/skin/… 时,这将注册皮肤包。skinname 是一个不透明字符串,用于识别已安装的皮肤。如果为一个包注册了多个皮肤,则 chrome 注册表将使用用户的首选项选择最合适的皮肤。

样式

样式叠加层(将应用于 chrome 页面的自定义 CSS)使用以下语法注册

style chrome://URI-to-style chrome://stylesheet-URI [flags]

覆盖

在某些情况下,扩展或嵌入器可能希望覆盖应用程序或 XULRunner 提供的 chrome 文件。为了允许这样做,chrome 注册清单允许使用“覆盖”指令

override chrome://package/type/original-uri.whatever new-resolved-URI [flags]

注意:覆盖不是递归的(因此,使用 file:///home/john/blah/ 覆盖 chrome://foo/content/bar/ 通常不会达到您想要或期望的结果)。此外,被覆盖文件内的路径相对于被覆盖的路径,而不是原始路径(例如,这在 CSS 文件中可能很烦人或有用)。

资源

可以使用 resource 指令创建别名

resource aliasname uri/to/files/ [flags]

这将为 resource://<aliasname>/ URI 创建映射到给定路径。

注意

注意:没有安全限制阻止 Web 内容包含 resource: URI 中的内容,因此请注意您在那里公开的内容。

清单标志

清单行可以在注册行的末尾添加多个以空格分隔的标志。这些标志标记该包中 chrome 的特殊属性,或限制使用该行的条件。

应用程序

扩展程序可以安装到多个应用程序中。可能有一些 chrome 注册行仅适用于一个特定的应用程序。标志

application=app-ID

指示仅当扩展程序安装到由 app-ID 标识的应用程序中时,才应用该指令。可以在一行中包含多个应用程序标志,在这种情况下,如果任何标志匹配,则应用该行。

此示例显示了如何为不同的应用程序使用不同的叠加层

overlay chrome://browser/content/browser.xul chrome://myaddon/content/ffOverlay.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
overlay chrome://messenger/content/mailWindowOverlay.xul chrome://myaddon/content/tbOverlay.xul application={3550f703-e582-4d05-9a08-453d09bdfdc6}
overlay chrome://songbird/content/xul/layoutBaseOverlay.xul chrome://myaddon/content/sbOverlay.xul application=songbird@songbirdnest.com

应用程序版本

扩展程序可以安装到应用程序的多个版本中。可能有一些 chrome 注册行仅适用于特定应用程序版本。标志

appversion=version
appversion<version
appversion<=version
appversion>version
appversion>=version

指示仅当扩展程序安装到标识的应用程序版本中时,才应用该指令。可以在一行中包含多个 appversion 标志,在这种情况下,如果任何标志匹配,则应用该行。版本字符串必须符合 工具包版本格式

平台版本

在支持多个应用程序时,扩展程序指定其兼容的 Gecko 版本通常会更方便。这对于二进制组件尤其如此。如果有一些 chrome 注册行仅适用于特定 Gecko 版本,则标志

platformversion=version
platformversion<version
platformversion<=version
platformversion>version
platformversion>=version

指示仅当扩展程序安装到使用标识的 Gecko 版本的应用程序中时,才应用该指令。可以在一行中包含多个 platformversion 标志,在这种情况下,如果任何标志匹配,则应用该行。

内容可访问

不再可以从加载自不受信任来源的内容中包含的或添加到其中的 <img>、<script> 或其他元素中引用 Chrome 资源。此限制适用于不受信任来源定义的元素以及受信任扩展添加的元素。如果需要明确允许此类引用,请将 contentaccessible 标志设置为 yes 以获取 Firefox 旧版本中的行为。请参阅 错误 436989

contentaccessible 标志仅适用于内容包:语言环境或皮肤注册不识别它。但是,匹配的语言环境和皮肤包也将公开给内容。

注意:由于 Firefox 的旧版本不理解 contentaccessible 标志,因此任何旨在同时与 Firefox 3 和 Firefox 旧版本一起使用的扩展程序都需要提供回退。例如

content packagename chrome/path/
content packagename chrome/path/ contentaccessible=yes

操作系统

扩展程序(或主题)可能会根据 Firefox 运行的操作系统提供不同的功能。该值将与平台的 OS_TARGET 值进行比较。

os=WINNT
os=Darwin

操作系统版本

扩展程序或主题可能需要根据正在运行的操作系统版本以不同的方式运行。例如,主题可能希望在 Mac OS X 10.5 上采用与 10.4 不同的外观

osversion>=10.5

ABI

如果组件仅与特定 ABI 兼容,则可以使用此指令指定该 ABI/操作系统。该值取自 nsIXULRuntime 的 OS 和 XPCOMABI 值(用下划线连接)。例如

binary-component component/myLib.dll abi=WINNT_x86-MSVC
binary-component component/myLib.so abi=Linux_x86-gcc3

平台(特定于平台的包)

一些软件包被标记了一个特殊的标志,表明它们是特定于平台的。内容、皮肤和语言环境的某些部分可能会根据运行的平台而有所不同。这些软件包包含三套不同的文件,分别适用于 Windows 和 OS/2、Macintosh 和类 Unix 平台。例如,对话框中“确定”和“取消”按钮的顺序不同,某些项目的名称也不同。

“platform”(平台)修饰符仅用于内容注册;它不被用于语言环境或皮肤注册。但是,当指定时,它适用于软件包的内容、语言环境和皮肤部分。

进程

在电解质中,注册可以设置为仅应用于主进程或任何内容进程。 “process”(进程)标志在这两者之间进行选择。这可以允许您为同一个契约 ID 注册不同的组件,或确保组件只能在主进程中加载。

component {09543782-22b1-4a0b-ba07-9134365776ee} maincomponent.js process=main
component {98309951-ac89-4642-afea-7b2b6216bcef} contentcomponent.js process=content

remoteenabled

多进程 Firefox中,默认情况下,给定的 chrome: URI 将始终加载到 chrome 进程中。如果设置了“remoteenabled”(远程启用)标志,则页面将加载到与加载它的browser相同的进程中。

content packagename chrome/path/ remoteenabled=yes

remoterequired

多进程 Firefox中,默认情况下,给定的 chrome: URI 将始终加载到 chrome 进程中。如果设置了“remoterequired”(远程必需)标志,则页面将始终加载到子进程中。

content packagename chrome/path/ remoterequired=yes

Chrome 清单示例

类型

引擎

语言

网址

内容

品牌

browser/content/branding/

contentaccessible=yes

内容

浏览器

browser/content/browser/

contentaccessible=yes

覆盖

chrome://global/content/license.html

chrome://browser/content/license.html

资源

支付

browser/res/payments/

皮肤

浏览器

classic/1.0 browser/skin/classic/browser/

语言环境

品牌

en-US

en-US/locale/branding/

语言环境

浏览器

en-US

en-US/locale/browser/

语言环境

浏览器区域

en-US

en-US/locale/browser-region/