Что такое chrome?

Chrome — это набор всех элементов UI в окне приложения, за исключением самого контента web-страницы. Панели инструментов, строки меню, индикаторы загрузки и панели заголовков окон — все это примеры элементов, которые обычно являются частью chrome.

Mozilla находит и считывает корневой chrome.manifest файл в поисках расширений и тем оформления.

Примечание: В версии Gecko 1.9.2 и старше Mozilla считывает chrome/*.manifest файлы из приложений. Начиная с Gecko 2.0, корневой chrome.manifestединственный используемый манифест; добавить дополнительные манифесты можно с помощью команды manifest, прописанной в корневом манифесте.

Chrome-провайдеры

Источник chrome для определенного типа окон (например, для окна браузера) называется chrome-провайдером (англ. provider — поставщик). Провайдеры, или поставщики, работают совместно, чтобы обеспечить полный набор элементов chrome для каждого конкретного окна, начиная от иконок на панелях инструментов, заканчивая файлами описания текста, контента и внешнего вида окна как такового.

Существует три основных вида ресурсов chrome:

Content
Главный исходный файл для описания окна исходит от провайдера content, он может быть любого типа, который сможеть обработать Mozilla. Скорее всего это будет XUL-файл, поскольку XUL спроектирован для описания содержимого окон и диалогов. JavaScript файлы, описывающие UI, также приведены в пакетах провайдера content, равно как и большинство XBL файлов сборки.
Locale
Локализуемые приложения содержат все переводы и связанную с локализацией информацию в провайдере locale. Такой подход позволяет переводчикам переводить только сами chrome-пакеты, не затрагивая основной исходный код. Два основных типа файлов локализации: DTD файлы и Java-подобные файлы свойств.
Skin
Провайдер skin отвечает за предоставление полного набора файлов, описывающих внешний вид chrome. Обычно это CSS файлы и изображения.

Примечание: Скрипты (включая те, которые найдены в XBL), загруженные из провайдера skin, не будут запущены на исполнение.

Реестр chrome

Среда Gecko предоставляет сервис, известный как реестр chrome. Этот сервис обеспечивает преобразование имен из chrome-пакетов в физическое расположение этих пакетов на диске.

Реестр chrome настраиваем и имеет строгую структуру, поэтому пользователь может устанавливать сторонние провайдеры chrome, и, таким образом, изменять внешний вид и локализацию. Это делается при помощи XPInstall и менеджера расширений.

Для того, чтобы сообщить реестру о новом доступном chrome, используется текстовый манифест: файл chrome.manifest в корне расширения, темы, или приложения XULRunner.

Текстовый манифест использует простую строчную разметку: каждая строка парсится отдельно. Если строка определяется реестром как валидная, то он выполняет действие или команду, описываемые этой строкой. Иначе строка игнорируется, а в консоль выводится сообщение об ошибке.

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

Примечание: В названии пакета недопустимо использование символов @ # ; : ? /

Предупреждение: Firefox 2, Thunderbird 2 и SeaMonkey 1.1 не увидят chrome, если packagename содержит название, состоящее из букв разных регистров. Если пример выше содержит packagename CamelCasePackage, возникнет ошибка, примерное содержание: "No chrome registered for chrome://camelcasepackage/path/to/files". Firefox 3, Thunderbird 3 и SeaMonkey 2 поддерживают название из букв разного регистра. Баг разрешен в Mozilla 1.9; см. баг 132183.

Инструкции в манифесте

Комментарии

Комментарием считается любая строчка, начинающаяся с символа решётки ('#'). Всё написанное в комментарии игнорируется.

# эта строчка - комментарий. здесь можно писать что угодно

manifest

manifest subdirectory/foo.manifest [flags]

Эта инструкция загрузит вспомогательный манифест. Это может быть полезно для разделения компонента и инструкции регистрации chrome, или разделения регистрационных данных, зависящих от платформы.

binary-component

binary-component components/mycomponent.dll [flags]

Даёт Mozilla указание к регистрации и использованию бинарного компонента. Эта инструкция должны комбинироваться с флагом abi (двоичного интерфейса приложений), так как бинарные компоненты зависят от ABI. Вплоть до Firefox 4 файлы в директориях компонентов регистрировались автоматически.

interfaces

interfaces component/mycomponent.xpt [flags]

Даёт указание загрузить информацию об интерфейсе из typelib-файла, созданного XPIDL.

Instructs Mozilla to load interface information from a typelib file produced by XPIDL. Вплоть до Firefox 4 файлы в директориях компонентов регистрировались автоматически.

component

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

Даёт Mozilla CID компонента, реализованного компонентом XPCOM на JavaScript или любом другом поддерживаемом языке. ClassID {0000...} должен совпадать с ClassID компонента. Для генерации уникального ClassID, можно возпользоваться любым UUID генератором.

contract

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

Сопостовляет читабельный ID договора с ClassID для точной реализации. Обычно ID договора работает в паре с объявлением компонента, указанным непосредственно перед записью contract.

category

category category entry-name value [flags]

Регистрирует запись в менеджер категорий. Особенности формата и значения записей категорий зависят от категории.

content

Пакет content регистрируется строчкой

content packagename uri/to/files/ [flags]

Это нужно для объявления пути, используемого при разрешении URI типа chrome://packagename/content/.... Этот URI может быть как абсолютным, так и относительным по отношению к манифеста. Внимание: он должен заканчиваться слэшем ('/').

locale

Регистрация пакета локализации происходит при помощи строки

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

Такая инструкция зарегистрирует пакет локализации при разрешении URI типа chrome://packagename/locale/... . Обычно localename это текстовой идентификатор страны "ru" или языка-страны "ru-RU". Если для пакета зарегистрировано несколько локализаций, реестр выберет наиболее подходящий для пользователя, учитывая пользовательские настройки языка.

skin

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

Такая инструкция зарегистрирует пакет оформления при разрешении URI типа chrome://packagename/skin/... . skinname это строка, идентифицирующая установленный скин. Если для пакета зарегистрировано несколько оформлений, реестр выберет наиболее подходящий для пользователя, учитывая пользовательские настройки.

overlay

Оверлеи XUL регистрируются следующим образом:

overlay chrome://URI-to-be-overlaid chrome://overlay-URI [flags]

style

Оверлеи стилей (особый CSS-файл, применяющийся к странице chrome) регистрируются следующим образом:

style chrome://URI-to-style chrome://stylesheet-URI [flags]
Примечание: Таким образом могут быть использованы только стили, использующие URI chrome://.
 

override

In some cases an extension or embedder may wish to override a chrome file provided by the application or XULRunner. In order to allow for this, the chrome registration manifest allows for "override" instructions:

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

Note: overrides are not recursive (so overriding chrome://foo/content/bar/ with file:///home/john/blah/ will not usually do what you want or expect it to do). Also, the path inside overridden files is relative to the overridden path, not the original one (this can be annoying and/or useful in CSS files, for example).

Note: There was a bug in Gecko 1.8.1.5 (Firefox 2.0.0.5) and earlier where you could not use a relative URL for the new-resolved-URI parameter. You needed to provide an absolute URL. See баг 323455.

resource

Aliases can be created using the resource instruction:

resource aliasname uri/to/files/ [flags]

This will create a mapping for resource://<aliasname>/ URIs to the path given.

Note: There are no security restrictions preventing web content from including content at resource: URIs, so take care what you make visible there.

Manifest flags

Manifest lines can have multiple, space-delimited flags added at the end of the registration line. These flags mark special attributes of chrome in that package, or limit the conditions under which the line is used.

application

Extensions may install into multiple applications. There may be chrome registration lines which only apply to one particular application. The flag

application=app-ID

indicates that the instruction should only be applied if the extension is installed into the application identified by app-ID. Multiple application flags may be included on a single line, in which case the line is applied if any of the flags match.

This example shows how a different overlay can be used for different applications:

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

appversion

Extensions may install into multiple versions of an application. There may be chrome registration lines which only apply to a particular application version. The flag

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

indicates that the instruction should only be applied if the extension is installed into the application version identified. Multiple appversion flags may be included on a single line, in which case the line is applied if any of the flags match. The version string must conform to the Toolkit version format.

Note: Versions of Gecko before Gecko 1.8.0.13 and Gecko 1.8.1.5 contained a bug where if you use the comparisons <, > or =, the version string had be two or more characters long. If not, you would get a message in the error console that the appversion flag was not recognized. See баг 380398.

platformversion

When supporting more then one application, it is often more convenient for an extension to specify which Gecko version it is compatible with. This is particularly true for binary components. If there are chrome registration lines which only apply to a particular Gecko version, the flag

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

indicates that the instruction should only be applied if the extension is installed into an application using the Gecko version identified. Multiple platformversion flags may be included on a single line, in which case the line is applied if any of the flags match.

contentaccessible

Chrome resources can no longer be referenced from within <img>, <script>, or other elements contained in, or added to, content that was loaded from an untrusted source. This restriction applies to both elements defined by the untrusted source and to elements added by trusted extensions. If such references need to be explicitly allowed, set the contentaccessible flag to yes to obtain the behavior found in older versions of Firefox. See баг 436989.

The contentaccessible flag applies only to content packages: it is not recognized for locale or skin registration. However, the matching locale and skin packages will also be exposed to content.

n.b.: Because older versions of Firefox do not understand the contentaccessible flag, any extension designed to work with both Firefox 3 and older versions of Firefox will need to provide a fallback. For example:

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

os

Extensions (or themes) may offer different features depending on the operating system on which Firefox is running. The value is compared to the value of OS_TARGET for the platform.

os=WINNT
os=Darwin

See OS_TARGET for a more complete list of os names. The os name is case insensitive.

osversion

An extension or theme may need to operate differently depending on which version of an operating system is running. For example, a theme may wish to adopt a different look on Mac OS X 10.5 than 10.4:

osversion>=10.5

abi

If a component is only compatible with a particular ABI, it can specify which ABI/OS by using this directive. The value is taken from the nsIXULRuntime OS and XPCOMABI values (concatenated with an underscore). For example:

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

See XPCOM ABI for more details.

platform (Platform-specific packages)

Some packages are marked with a special flag indicating that they are platform specific. Some parts of content, skin, and locales may be different based on the platform being run. These packages contain three different sets of files, for Windows and OS/2, Macintosh, and Unix-like platforms. For example, the order of the "OK" and "Cancel" buttons in a dialog is different, as well as the names of some items.

The "platform" modifier is only parsed for content registration; it is not recognized for locale or skin registration. However, it applies to content, locale, and skin parts of the package, when specified.

To indicate that a package is platform-specific, add the "platform" modifier to the "content" line after the path, for example:

content global-platform jar:toolkit.jar!/toolkit/content/global-platform/ platform

Once that is specified in your manifest you then ensure that under the directory global-platform are subdirectories win (Windows/OS2), mac (OS9/OSX), or unix (Everything Else). Anything residing outside of these subdirectories will be ignored.

xpcnativewrappers

Chrome packages can decide whether to use the XPCNativeWrapper security mechanism to automatically protect their code against malicious content that they might access. See Safely accessing content DOM from chrome for details.

This flag is enabled by default since Firefox 1.5. Disabling it manually was possible by specifying xpcnativewrappers=no until Firefox 4.

Note: Support for this flag has been removed in Gecko 2.0. You can no longer disable XPCNativeWrappers. To update your add-on to work without this flag:

  • If your add-on depends upon XBL bindings attached to content objects (that is, it needs to be able to call functions or get and set properties created by the XBL binding), you'll need to use the object's wrappedJSObject property to obtain a wrapped object.
  • If you need to call functions or access properties defined by the content -- for example, if your add-on wants to add a button to the page that calls a JavaScript function defined by the page.

The xpcnativewrappers flag applies only to content packages; it is not recognized for locale or skin registration.

Example chrome manifest

content       necko                   jar:comm.jar!/content/necko/
locale        necko       en-US       jar:en-US.jar!/locale/en-US/necko/
content       xbl-marquee             jar:comm.jar!/content/xbl-marquee/
content       pipnss                  jar:pipnss.jar!/content/pipnss/
locale        pipnss      en-US       jar:en-US.jar!/locale/en-US/pipnss/
# Firefox-only
overlay chrome://browser/content/pageInfo.xul           chrome://pippki/content/PageInfoOverlay.xul application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
# SeaMonkey-only
overlay chrome://navigator/content/pageInfo.xul         chrome://pippki/content/PageInfoOverlay.xul application={92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}
overlay chrome://communicator/content/pref/preftree.xul chrome://pippki/content/PrefOverlay.xul
content       pippki                  jar:pippki.jar!/content/pippki/
locale        pippki      en-US       jar:en-US.jar!/locale/en-US/pippki/
content       global-platform         jar:toolkit.jar!/content/global-platform/ platform
skin          global      classic/1.0 jar:classic.jar!/skin/classic/global/
override chrome://global/content/netError.xhtml jar:embedder.jar!/global/content/netError.xhtml
content       inspector               jar:inspector.jar!/content/inspector/

Instructions supported in bootstrapped add-ons

The following instructions are supported in Bootstrapped extensions:

  • manifest
  • content
  • locale
  • skin
  • override

Debugging a chrome manifest file

The Chrome List extension (for Firefox 3.6 and older) shows all registered chrome. This is very helpful when trying to write a chrome.manifest file as you can inspect where the files are being mapped from (jar files, local directory, etc.)

Old-style contents.rdf manifests

Before the plaintext manifests were introduced (which happened in Firefox 1.5, Toolkit 1.8), RDF manifests named "contents.rdf" were used to register chrome. This format is deprecated; however, SeaMonkey versions before version 2 do not support the plaintext manifest format yet, so contents.rdf manifests are required for extensions that wish to maintain backwards compatibility with Firefox 1.0 or the suite.

Замечание по Gecko 1.9.2
The contents.rdf manifest format is no longer supported at all starting with Gecko 1.9.2; add-ons already installed using this format will continue to work but can no longer be installed. Be sure to remove your add-on and reinstall it to ensure that it installs correctly after updating it to use a plaintext manifest.

Official references for Toolkit API

Official References. Do not add to this list without contacting Benjamin Smedberg. Note that this page is included from the pages listed below. So: Don't Add Breadcrumbs!

Метки документа и участники

 Внесли вклад в эту страницу: chrisdavidmills, Norville, LunaticRL
 Обновлялась последний раз: Norville,