Опубликован: 10.12.2007 | Доступ: свободный | Студентов: 822 / 20 | Оценка: 5.00 / 5.00 | Длительность: 58:33:00
Лекция 12:

Оверлеи и Chrome

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >

12.2. Регистр chrome

Регистр chrome Mozilla - это множество RDF-сообщений, описывающих приложения, установленные в chrome. Он используется, чтобы поддерживать URL вида "chorme:" и чтобы накладывать некоторые простые ограничения на приложения. Он используется автоматически, когда загружаются XUL-документы и устанавливаются новые пакеты.

Использование термина "регистр" не вполне удачно, потому что Mozilla имеет несколько регистров, и все в различных форматах. Более точно, регистр chrome - база данных о системе и ее функционировании. Регистр chrome используется на уровне работы приложений платформы. Другой регистр, регистр Mozilla, используется на более низком уровне функционирования самой платформы.

Без chrome платформе пришлось бы выполнять поиск файлов по всему дереву поддиректорий директории chrome. Пришлось бы искать пакеты, скины и информацию, зависящую от локализации для каждого XUL документа. С помощью chrome информация в формате RDF может быть быстро найдена в базе данных (хранилище фактов), расположенной в оперативной памяти, и путь к любому файлу может быть найден до обращения к диску. Это оперативное хранилище сообщений можно использовать для переключения тем и локализаций и для добавления новых пакетов. Теоретически эти изменения можно выполнять даже не перезапуская платформу, но текущая реализация платформы все же требует рестарта.

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

chrome://package-name/content/

Так же как и система оверлеев, регистр chrome транслирует исходные файлы, созданные программистом приложения, в генерируемые файлы. Оба множества файлов имеют RDF синтаксис. Исходные файлы - это файлы описания contents.rdf для пакетов, тем и локализаций. Регистр chrome игнорирует информацию об оверлеях в этих файлах. Есть только один генерируемый файл, он называется chrome.rdf и имеет URL resource:/chrome/chrome.rdf.

В разделе "Практика" лекций "Верстка с XUL" , "Статическое содержимое" , и "Первые элементы управления и темы" мы приводили примеры RDF chrome описаний для пакетов, локализаций и тем соответственно. Здесь мы рассмотрим систему, которую эти примеры иллюстрировали, в целом.

Каждый файл chrome.rd - полнофункциональная копия модели данных регистра chrome. Просмотрите содержимое этого файла, чтобы увидеть свойства модели, которые мы будем обсуждать далее. Файл contents.rdf содержит только часть модели данных. Эта часть касается лишь информации о конкретном пакете, локализации и тем.

RDF-информация для chrome основана на модели данных, состоящей из последовательности URNs. Эти URNs начинаются с трех RDF <Seq> контейнеров:

urn:mozilla:package:root 
urn:mozilla:locale:root 
urn:mozilla:skin:root

Каждый контейнер указывает, какие пакеты, локализации или темы доступны платформе. Хотя возможны некоторые отступления, URN-имена конкретного пакета, локализации и темы, то есть содержание контейнеров, должны иметь форму:

urn:mozilla:package:{package-name} 
urn:mozilla:locale:{locale-name}
urn:mozilla:skin:{skin-name}/{skin-version}

Вот пример некоторых URN:

urn:mozilla:package:navigator
urn:mozilla:locale:en-US 
urn:mozilla:skin:classic/1.0

Эти URN можно уточнить парами свойство/значение в формате RDF. Другими словами, они могут быть подлежащими фактов. Предикаты этих сообщений должны быть взяты из следующего пространства имен:

http://www.mozilla.org/rdf/chrome#

Доступные предикаты перечислены в Таблице 12.1

Таблица 12.1. Предикаты верхнего уровня регистра chrome
Предикат Применение Значение Цель
accessKey скин символ Клавиатурный ключ в классическом браузере, используемый для смены тем
author пакет, локализация, скин любой текст Создатель пакета
baseURL пакет URL Расположение пакета; не используйте схему chrome:
disabled пакет "true" Запрещает внешние оверлеи, не используйте значение "false"
displayName Пакет, скин любой текст видимое имя
hasOverlays пакет "true" XUL оверлеи существуют; не используйте значение "false"
hasStylesheets пакет "true" CCS2 оверлеи существуют; не используйте значение "false"
name пакет Название пакета Имя пакета должно соответствовать имени директории
name скин любой текст Имя скина, любой текст
image скин URL Изображение, иллюстрирующее скин; не используйте схему chrome:
localeVersion пакет номер версии Минимальная версия локати, требуемая пакетом
locType пакет, скин Install, profile Место, где установлен пакет или скин
packages локализация,скин URN Тег <Seq>, содержащий вторичные контейнеры
previewURL URL Документ, иллюстрирующий пакет; не используйте схему chrome:
selectedLocale URN Текущая локализация; применим только к глобальным пакетам

В дополнение к главным контейнерам существует два множества вторичных контейнеров. Они доступны из URN локализации и скина, через предикат packages. Эти добавочные контейнеры содержат информацию о реализациях тем и локализаций, специфичных для конкретного приложения. Это также контейнеры вида <Seq> и они имеют следующие имена:

urn:mozilla:locale:{locale-name}:packages
urn:mozilla:skin:{skin-name}:packages

Каждый из этих контейнеров может содержать информацию о списке специфичных реализаций. URN данной реализации должен быть одним из следующих:

urn:mozilla:locale:{locale-name}:{package-name}
urn:mozilla:skin:{skin-name}/{skin-version}:{package-name}

Например, если пакет Navigator (классический браузер) получает французскую локализацию (FR), то требуется вот такой URN, чтобы платформа "знала", что эта локализация реализована и доступна.

urn:mozilla:locale:FR:navigator

Каждый из этих специфичных скинов или локализационных ресурсов может быть уточнен с помощью RDF пар вида свойство/значение. Доступные предикаты перечислены в Таблице 12.2

Более новые версии Браузера Mozilla несколько расширяют Таблицы 12.1 и 12.2 дополнительными предикатами.

Таблица 12.2. Предикаты верхнего уровня регистра chrome
Предикат Применение Значение Цель
allowScripts скин "true" Скин может иметь скрипт; не используйте значение "false"
baseURL локализация,скин URL Расположение реализации; не используйте схему chrome:
localeVersion локализация Номер версии Версия реализации
package локализация,скин URN Пакет, использующий данную реализацию
skinVersion скин Номер версии Версия реализации

12.3. Сохранение состояния окна

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

Система сохранения информации состоит из одного RDF-файла и одного XUL-атрибута и автоматически инициируется платформой Mozilla. Она записывает состояние (значение) одного или более атрибутов определенных XUL-тегов. Иногда это выполняется автоматически, а иногда требует указания со стороны программиста приложения. Поскольку атрибут может содержать произвольную строку, некритичную информацию можно добавить в атрибут позже. Для программиста приложения это альтернатива использованию cookies.

RDF-файл сохранения состояния называется localstore.rdf, он сохраняется в профиле пользователя. Он записывается каждый раз, когда закрывается какое-нибудь окно. Для каждого сохраняемого атрибута файл содержит два сообщения. Одно утверждает, что XUL-документ (URL-подлежащее) сохраняет (сказуемое-предикат) кое-что в некотором теге (дополнение). Нужно лишь сообщение для всех сохраняемых атрибутов конкретного тега. Во втором сообщении тег (URL-подлежащее) имеет предикат/свойство, равное имени атрибута, и строку-подлежащее, равное значению атрибута. Листинг 12.11 демонстрирует эти сообщения для тега в документе editor.xul, имеющем id="editorWindow" и атрибут width.

<RDF:Description about="chrome://editor/content/
 editor.xul">
  <NC:persist resource="chrome://editor/content/
  editor.xul#editorWindow"/>
</RDF:Description> 
<RDF:Description about="chrome://editor/content/
  editor.xul#editorWindow" width="884"/>
Листинг 12.11. Пример данных, сохраняемых в localstore.rdf.

Никакие атрибуты по умолчанию не сохраняются. Каждый атрибут может быть сохранен для данного окна или диалогового окна. Вот некоторые из обычно сохраняемых атрибутов:

checked collapsed height hidden moz-collapsed open offsetX 
offsetY ordinal screenX screenY sizemode state width

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

Сохраняемые значения атрибута - это его текущие значения. Если некоторые значения не прописаны в XUL, например, размеры окна, сохранятся текущие значения.

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

persist

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

<window dir="ltr" orient="vertical" persist="dir orient"/>

Если используется сохранение атрибутов, их тег должен иметь id.

12.4. Родственные AOM и XPCOM объекты

Оверлеи и регистр chrome реализованы с помощью следующих свойств XPCOM:

@mozilla.org/chrome/chrome-registry;1 nsIXULChromeRegistry

Некоторые методы этого интерфейса поддерживают простые операции с системой оверлеев, но они не позволяют программисту управлять системой оверлеев полностью вручную. Использования этого интерфейса требуют весьма редкие задачи. Например, создание инструмента, подобного DOM Inspector или собственной инсталляционной системы.

Чтобы сохранить атрибут из JavaScript, используйте этот системный вызов:

document.persist(tagid, attname);

Это сохранит значение атрибута attname тега с id равным tagid.

< Лекция 11 || Лекция 12: 12345 || Лекция 13 >