MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

Начнём с описания того, как обрабатывается XUL в браузере Mozilla.

Как обрабатывается XUL

XUL обрабатывается в Mozilla теми же методами, что и HTML или другие типы содержимого. Когда вы вводите URL HTML-страницы в адресную строку браузера, браузер находит веб-сайт и загружает его содержимое. Механизм рендеринга Mozilla получает содержимое в виде исходного кода HTML и преобразует его в дерево документа. Дерево затем конвертируется в набор объектов, которые уже могут быть отображены на экране. Таблицы стилей (CSS), изображения, и другие технологии, используются для управления отображением. XUL в основном функционирует похожим образом.

На самом деле, в Mozilla, все типы документов, будь то HTML или XUL, или даже SVG, обрабатываются одним и тем же кодом ядра. Это означает, что одни и те же CSS свойства могут использоваться для оформления и HTML и XUL, и многие функции также могут быть доступны обоим. Тем не менее, существуют некоторые особенности, которые являются специфическими для HTML, такие, как формы, и другие, которые являются характерными для XUL такие как оверлеи . Поскольку XUL и HTML обрабатываются сходным образом, постольку вы можете загружать их либо из локальной файловой системы, либо с веб-страницы, либо из дополнения или автономного XULRunner-приложения.

Содержимое удаленных источников, например http://localhost/~username/, независимо от того, HTML это, или XUL или другой тип документа, будет по соображениям безопасности ограничено по типу операций, которое оно может выполнить. Из-за этого Mozilla обеспечивает возможность локальной установки кнтента и регистрации установленных файлов как части её chrome системы. Это позволяет использовать специальный формат URL -- chrome:// URL. Получая доступ к файлу посредством chrome URL, Mozilla обеспечивает этим файлам расширенные права для доступа к локальным файлам, к настройкам и закладкам, и выполнению других привилегированных операций. Очевидно, что у веб-страниц нет таких привилегий, если только они не имеют цифрового сертификата и пользователь не дал разрешение на выполнение таких операций.

Эта регистрация пакетов в chrome системе -- способ Firefox-дополнений добавлять новые функции в браузер. Дополнения это небольшие пакеты из XUL файлов, сценариев JavaScript, таблиц стилей и изображений упакованных в один файл. Такой упакованный файл может быть создан с помощью архиватора ZIP. Когда пользователь загружает дополнение, файлы, содержащиеся в нем устанавливаются на компьютер пользователя. Расширение внедряется в браузер с помощью специального механизма XUL, называемого - оверлей (overlay) и обеспечивающего объединение XUL-кода дополнения и кода XUL браузера. Пользователю может показаться, что дополнение изменило браузер, но на самом деле, код браузера и дополнения разделены, и дополнение может быть легко удалено. Зарегистрированным пакетам, конечно же, использование оверлеев не требуется. Если бы это было не так, то вы не смогли бы получить к ним доступ посредством основного интерфейса браузера, правда, к ним можно все же получить доступ с помощью chrome URL, если вы знаете что это такое.

Автономные XUL приложения могут интегрировать XUL-код похожим способом, но, естественно, XUL для приложения будет включаться как часть установки, вместо того чтобы быть установленным отдельно как дополнение. Однако, этот XUL-код будет зарегистрирован в chrome-системе, чтобы приложение могло отображать интерфейс пользователя.

Следует также отметить, что браузер Mozilla сам представляет собой просто набор пакетов, содержащих файлы XUL, JavaScript и таблицы стилей. Эти файлы доступны через chrome URL, имеют расширенные привилегии и работают так же, как любой другой пакет. Конечно, браузер гораздо больше и более сложен, чем большинство дополнений. Firefox и Thunderbird также как и другие компоненты, все написаны на XUL и все они доступны через chrome URL-ы. Вы можете исследовать эти пакеты, просмотрев каталог chrome, в который установлен Firefox или другое XUL приложение.

Chrome URL всегда начинается с 'chrome://'. Также как 'http://' URL всегда ссылается на веб-сайты используя HTTP и 'file://' URL всегда ссылается на локальные файлы, 'chrome://' URL всегда ссылается на установленные пакеты и дополнения. Подробнее синтаксис chrome URL будет рассмотрен в следующем разделе. Важно отметить, что доступ через chrome URL даёт дополнительные привилегии, описанные выше, чего не дают другие типы URL. Так, например, HTTP URL не имеет каких-либо особых привилегий, и если веб-страница попытается, например, считать локальный файл то произойдет ошибка. А файл, загруженный через chrome URL, может читать файлы имея тот же уровень доступа, что и установленное расширение, которому он принадлежит.

Это различие очень важно. Оно означает, что есть определенные вещи, которые контент веб-страницы не может выполнить, например - прочитать закладки пользователя. Это различие основывается не на типе отображаемого контента, а только на типе используемого URL. И HTML и XUL, размещённые на веб-сайте, не имеют никаких дополнительных разрешений, однако если и HTML и XUL загружены через chrome URL, то они эти разрешения получают.

Если вы собираетесь использовать XUL на веб-сайте, то просто выложите на этот сайт XUL, как обычный HTML файл, а затем загрузите этот URL в браузере http://localhost/xul.php. Проверьте, что ваш веб-сервер отправляет правильный заголовок типа контента content-type (он должен быть равен application/vnd.mozilla.xul+xml, например, для PHP можно использовать header('Content-type: application/vnd.mozilla.xul+xml');). Этот тип контента является механизмом, с помощью которого система Mozilla отличала XUL от HTML. Mozilla не использует расширение файла, если только не считывает файлы из файловой системы, но для XUL файлов вам необходимо использовать расширение .xul. Вы можете загружать XUL файлы с собственного компьютера, открывая их в браузере или двойным щелчком по имени файла в файловом менеджере.

Помните, что XUL, полученный из удаленного источника будет иметь значительные ограничения в действиях, которые он сможет выполнять.

Типы документа: HTML XML XUL CSS

Mozilla использует существенно разные типы объектов документа (DOM) для HTML и XUL, хотя у них много общего в смысле функциональности. В Mozilla есть вВсего три типа документа имеются : HTML, XML, and XUL. Естественно, HTML документ используется для документов HTML, XUL документ используется для документов XUL, и XML документ используется для других типов документов XML. Поскольку XUL это разновидность XML, постольку документ XUL это подмножество более общего XML документа. Однако есть тонкие различия в функциональности. Так, например, когда управляющие элементы формы на HTML странице доступны через свойство document.forms, это свойство не доступно для документов  XUL, так как в XUL нет форм в том смысле, в котором они есть в HTML. Сходным образом специфические возможности XUL, такие как оверлеи и шаблоны, существуют только в документах XUL.

Эти различия очень важны. Можно использовать многие возможности XUL в HTML или XML документах в тех случаях, когда эти возможности не являются специфичными для типа документа; тем не менее для других возможностей необходим правильный тип документа.

Подведя итоги вышесказанного:

  • Mozilla отрисовывает HTML и XUL используя один и тот же механизм и применяет CSS для их отображения.
  • XUL может загружаться с сайта, из локальной файловой системы, или устанавливаться как пакет и быть доступным через chrome URL. Последний вариант как раз и используется для дополнений.
  • Chrome URL могут использоваться для доступа к установленным пакетам и открывать их с расширенными привилегиями.
  • HTML, XML, и XUL имеют различный тип документа. Одни возможности могут использоваться в любых типах документа, а другие возможности - специфичны для конкретного типа.

Следующие несколько разделов описывают chrome пакет, который может устанавливаться в Mozilla. Но, если вы хотите уже начать разработку простого приложения, то вы можете сразу перейти на Создаем окно и вернуться к этому разделу позже.

Устройство пакета

Mozilla устроен таким образом, что вы можете иметь столько компонентов сколько вы захотите установить. Каждое дополнение - это отдельный компонент со своим chrome URL. В Mozilla также есть по одному компоненту для каждого установленного скина и локали. Каждый из этих компонентов, или пакетов, состоит из набора файлов, которые описывают его пользовательский интерфейс. К примеру, компонент messenger содержит описание окна списка почтовых сообщений, описание окна создания письма и описания диалоговых окон адресной книги.

Пакеты, которые предоставляются в составе Mozilla, расположены внутри каталога chrome, который находится в каталоге, в который вы установили Mozilla. В каталоге chrome вы найдете все файлы, описывающие интерфейс самого браузера Mozilla, почтового клиента, и других приложений. Обычно вы размещаете все  XUL файлы в каталоге приложения, однако дополнения устанавливаются в каталоге extensions для каждого отдельного пользователя. Простое копирование XUL файла в каталог chrome не дает ему каких-либо дополнительных привилегий, также он не может быть доступен через chrome URL. Для получения дополнительных привилегий вам необходимо создать manifest-файл и поместить его в каталог chrome. Этот файл легко создать, так как он обычно состоит всего из нескольких строк. Он используется для отображения(связывания) chrome URL-а на путь к файлу или каталогу где лежат XUL файлы. Подробности создания этого файла обсуждаются в разделе далее.

Единственный способ создать контент доступный через chrome URL, это создать пакет, как описано в нескольких нижеследующих разделах. Каталог называется 'chrome', скорее всего потому, что имя оказалось удобным, чтобы запомнить, что он используется для хранения chrome пакетов, содержащихся в Mozilla.

Чтобы увеличить путаницу, отметим, что есть еще два других места, где может появляться слово "chrome". Это параметр -chrome в командной строке и модификатор chrome в функции window.open(). Ни одна из этих возможностей не дает дополнительных привилегий; вместо этого они используются для открытия нового окна верхнего уровня без элементов браузерного интерфейса, таких, как меню и панели инструментов. Вы можете использовать эту возможность в более сложных XUL приложениях если не хотите чтобы интерфейс браузера присутствовал в ваших диалоговых окнах.

Файлы пакета обычно объединяются в JAR файл. Этот файл может быть создан любым ZIP архиватором. Например, вы можете открыть JAR файлы из  каталога chrome Mozill-ы, чтобы посмотреть базовую структуру пакета.  Несмотря на то, что обычно файлы упаковываются в JAR, пакеты могут также быть доступны в несжатой форме внутри каталога. Распространять пакеты таким образом не рекомендуется, но это очень удобно для разработки, так как вы можете править файлы напрямую и перезагружать XUL без необходимости переустановки или переупаковки файлов.

По умолчанию, приложения Mozilla парсят XUL файлы и скрипты, и сохраняют прекомпилированную версию в памяти до конца сессии приложения. Это повышает производительность. Однако, из-за этого XUL не перезагрузится даже если исходные файлы изменятся. Чтобы отключить этот механизм, необходимо изменить опцию nglayout.debug.disable_xul_cache. В Firefox, эта опция может быть добавлена в пользовательские настройки простым вводом "about:config" в адресную строку, и установкой значения опции в true. Или же вы можете вручную отредактировать файл настроек user.js, добавив следующую строчку:

pref("nglayout.debug.disable_xul_cache", true);

Как правило, chrome-пакет состоит из трех частей, хотя ни одна из них не является обязательной. Каждая часть хранится в отдельном каталоге. Эти три части это контент, скин и локаль, все они описываются ниже. Отдельно взятый пакет может содержать один или более скинов и локалей, но пользователи могут заменять их своими собственными. Дополнительно пакет может содержать несколько различных приложений, каждое из которых доступно через свой  отдельный chrome URL. Система упаковки достаточно гибкая, так что вы можете включать любые нужные вам части и разрешать отдельную загрузку других частей, таких как текст для разных языков пользователей.

Три типа chrome-пакетов, это:

  • Content  (Контент)- Окна и скрипты
    Объявление окон и элементов, содержащихся в них. Они сохраняются в XUL файлах, с расширением .xul. Пакет контента может содержать несколько  XUL файлов, однако главное окно должно быть описано в файле с именем, совпадающим с именем самого пакета. Например, пакет редактора будет содержать внутри себя файл с названием editor.xul. Сценарии помещаются в отдельные файлы, размещенные вместе с XUL файлами.
  • Skin (Скин) - Таблицы стилей, изображения и другие спецфичные для тем оформления файлы
    Таблицы стилей описывают детали внешнего вида окна. Они хранятся отдельно от XUL файлов для упрощения внесения изменений в скин (тему) приложения. Все используемые изображения также хранятся здесь.
  • Locale (Локаль) - Файлы, специфичные для локализации
    Все надписи и тексты, отображаемые на элементах интерфейса окна приложения, хранятся отдельно. При этом пользователи могут иметь свои наборы локалей для их языков общения.

Пакеты контента

Имя файла JAR может описывать то, что он содержит, но вы не сможете сказать с уверенностью, соответствует ли название пакета его содержимому, до тех пор пока не просмотрите это содержимое. Приведем пример на основе пакета, имеющегося в составе Firefox. Если вы распакуете файлы из пакета  browser.jar, вы увидите, что он содержит струтуру папок выглядящую скорее всего примерно так:

content
   browser
      browser.xul
      browser.js
      -- other browser XUL and JS files goes here --
      bookmarks
         -- bookmarks files go here --
      preferences
         -- preferences files go here --
.
.
.

Этот пакет можно легко опознать, как пакет контента, поскольку папка самого верхнего уровня называется content. Для скинов эта папка, как правило, будет называться skin, а для локалей - locale. Эта схема поименования не является обязательной, но это общепринятое соглашение для того, чтобы сделать более понятным, какая часть пакета что содержит. Некоторые пакеты могут иметь раздел контента, скин и локаль. В таком случае вы обнаружите по папке для каждого типа. Так например пакет Chatzilla поставляется именно в таком виде.

Папка content/browser содержит набор файлов с расширениями .xul и .js. XUL файлы - это файлы с расширением .xul. Файлы с расширением .js - это файлы сценариев на языке JavaScript, которые обеспечивают собственно функциональность элементов интерфейса окна. Многие XUL файлы имеют файл сценария, связанного с ними, а некоторые могут иметь по несколько таких файлов сценариев.

В вышеприведенном листинге приведены два файла. Конечно в пакете есть и другие файлы, но для простоты изложения они не показаны. Файл browser.xul - это XUL файл, который описывает главное окно браузера. Главное окно для пакета контента должно иметь такое же имя, как пакет с раширением .xul. В данном случае имя пакета - "browser", поэтому мы предполагаем обнаружить файл browser.xul. Некоторые другие XUL файлы описывают отдельные окна. Например, файл pageInfo.xul описывает диалог информации о странице.

Во многие пакеты будет входить файл contents.rdf, который описывает пакет, его автора, и оверлеи, которые использует этот пакет. Однако этот файл устарел и заменен более простым механизмом. Этим механизмом является файл манифеста, упомянутый ранее, вы можете отличить эти файлы в папке chrome по расширению .manifest. Например, browser.manifest описывает пакет браузера.

Несколько подкаталогов, таких, как bookmarks и preferences, представляют дополнительные разделы компонента браузера. Они размещаются в различных папках только для того, чтобы расположение файлов было более организованным.

Скины или Темы

Несмотря на то, что код ядра Mozilla называет такие объекты скинами, а в пользовательском интерфейсе они называются темами, они оба ссылаются на одну и ту же вещь. В файле classic.jar описана тема по умолчанию, поставляемая вместе с Firefox. Структура этих частей  очень напоминает пакеты контента. Например, посмотрите classic.jar:

skin
   classic
      browser
         browser.css
         -- other browser skin files go here --
      global
         -- global skin files go here --
.
.
.

Повторимся, что такая струтура папок не является необходимой и используется исключительно для удобства. В действительности вы можете поместить все файлы в одну папку верхнего уровня и не пользоваться подкаталогами. Однако в случае приложений большого размера подкаталоги используются для разделения разных компонентов. В вышеприведенном примере одна папка предназначена для файлов, связанных с темой для браузера, a другая - для файлов, имеющих отношение к общей для приложения теме оформления. Общая папка содержит файлы тем оформления (скинов), являющиеся общими для всех пакетов. Эти файлы используются во всех компонентах и будут включены в поставку вашего отдельного самостоятельного приложения. Общая часть определяет внешний вид всех общих виджетов XUL, тогда как все прочие папки содержат файлы, специфичные для самих приложений. Firefox содержит в одном архиве и общие файлы темы оформления и файлы темы оформления браузера, но они могут содержаться и по отдельности.

Скин состоит из CSS файлов и набора изображений, используемых для задания внешнего вида интерфейса. Файл browser.css используется файлом browser.xul и содержит стили, которые определяют внешний вид различных частей интерфейса браузера. Повторно отметим, что файл browser.css имеет такое же имя, как и пакет в целом. Путем изменения CSS файлов вы можете менять внешний вид окна, не меняя при этом его функций. Именно таким способом вы можете создать новую тему оформления. Часть XUL остается неизменной, и независимо от нее меняется только часть со скином.

Локали

Файл en-US.jar содержит описание языковой информации для каждого компонента, в данном случае на американском варианте Английского языка. Аналогично скинам, каждый языковой раздел содержит файлы, которые определяют тексты, используемые в пакете для каждого отдельного языка. Структура локали сходна со всеми остальными, поэтому здесь она не приводится.

Локализованный текст хранится в файлах двух типов: DTD и Properties. Файлы DTD имеют расширение .dtd и содержат определения объектов, по одному на каждую строку текста, используемую в окне. Например, файл browser.dtd содержит определения объектов для каждой команды меню. Кроме того для каждой команды определяются сочетания клавиш, так как они могут быть различными для каждого языка. Файлы DTD также используются XUL файлами, по одному файлу DTD на каждый XUL файл в общем случае. Часть локали также содержит .properties файлы, которые похожи на файлы DTD, но используются в скриптах. Например файл browser.properties содержит несколько таких локализованных строк.

Эта структура позволяет вам переводить Mozilla или компонент приложения на разные языки просто добавляя новые локали для этих языков. И при этом вам не нужно менять полностью код XUL. К тому же другой программист может создать отдельный пакет, который добавит скин или локаль к контенту вашего приложения, что позволят создавать новые темы оформления или добавлять языки интерфейса без необходимости менять исходный пакет.

Другие пакеты

Существует специальный пакет, называющийся toolkit (или global). Ранее мы уже видели папку с глобальными данными в скинах. Файл toolkit.jar содержит соответствующие части контента для такого пакета. Он содержит некоторые глобальные диалоги и определения. Также он определяет вид по умолчанию и функциональность различных общих виджетов XUL, таких как текстовые поля и кнопки. Файлы, расположенные в глобальной части пакета скина содержат вид по умолчанию для всех элементов интерфейса XUL. Пакет tolkit используется всеми XUL приложениями.

Добавление пакета

Mozilla помещает пакеты, которые поставляются вместе с дистрибутивом, в папку chrome. Однако это не означает, что они обязательно должны там размещаться. При установке другого пакета вы можете поместить его в любое место на диске, при условии, что файл манифеста указывает на это место.

Традиционно пакеты помещаются в папку chrome просто потому, что это удобно; тем не менее они будут работать точно так же и будучи размещенными в другой папке или даже в каком-нибудь каталоге вашей локальной сети. Но вы не сможете хранить их на удаленном сайте, если только этот сайт не смонтирован как локальная файловая система.

Есть две папки chrome используемых для XUL приложений: одна - в том же месте, в которое установлено приложение, тогда как другая - часть профиля пользователя. Первая предназначена для пакетов, которые используются всеми пользователями, а вторая - для пакетов, применяемых только отдельным пользователем или пользователями. Расширения, будучи установленными в отдельную папку для расширений, также специфичны для каждого пользователя. Любые файлы манифеста, расположенные в любой из вышеприведенных папок, будут проверяться, чтобы определить, какие пакеты установлены.

В следующей главе мы рассмотрим, как ссылаться на chrome пакеты с помощью chrome URL.

Interwiki Language Links

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

Метки: 
 Внесли вклад в эту страницу: jigs12, Roman.Kulikov, teoli, Xprommer
 Обновлялась последний раз: jigs12,