В этой лекции описывается инфраструктура оверлеев и каталога
Система оверлеев позволяет единому, финальному XUL-документу быть
сконструированным из одного или нескольких XUL-документов. Процесс
слияния документов можно организовать несколькими разными способами.
Система оверлеев - это
Пример документа, использующего оверлеи, приведен в листинге 12.1
<?xml version="1.0"?> <?xul-overlay href="chrome://test/content/overlayA.xul"?> <?xul-overlay href="chrome://test/content/overlayB.xul"?> <window xmlns="http://www.mozilla.org/keymaster/ gatekeeper/there.is.only.xul"> <description id="start">Anything</description> </window>
Этот документ забирает контент из двух файлов: overlayA.xul и overlayB.xul. Эти два файла также содержат XUL-код. Этот совокупный контент добавляется к содержимому исходного файла. Мы видим результат. Ни один из исходных файлов при этом не изменяется.
Регистр
Разрабатываемый нами пример, NoteTaker, использовал структуру
директории
На диаграмме в начале этой лекции показана небольшая часть
платформы, связанная с
Оверлеи и регистр overlayinfo и база данных
Система оверлеев довольно проста. Один XUL-документ является мастером. Он - стартовая точка для финального контента. Любой иной XUL документ - это оверлей. Контент оверлея присоединяется, или добавляется, к мастер-документу. Это происходит в оперативной памяти и не оказывает эффекта на исходные файлы.
Оверлей - это XUL-документ, основанный на теге <
вместо тега <window>. Такой файл имеет расширение .xul и
является корректным (well-formed) XML, но он не предназначается для
самостоятельного использования. Mozilla может показать оверлей сам по
себе, но это имеет смысл только для тестирования.
Mozilla также поддерживает стилевые оверлеи. Это обычные <.
crome классической Mozilla содержит также так называемые
JavaScript- оверлеи. Это не оверлеи в прямом смысле этого слова, это
обычные JavaScript файлы с расширением .js. Они присоединяются к
оверлею с помощью тега <script> в любом месте оверлей-файла. В
этом они не отличаются от обычного XUL.
И мастер, и оверлеи могут содержать синтаксис, специфичный для системы оверлеев.
Система оверлеев имеет два метода, чтобы решить, какие файлы следует сливать вместе. Эти методы называются "сверху-вниз" и "снизу-вверх", потому что первый инициируется мастер- файлом (сверху-вниз), а второй - особой базой данных оверлеев (снизу- вверх).
Система оверлеев использует один механизм слияния файлов. Этот
механизм основан на XUL id -атрибуте и имеет несколько незначительных
вариаций.
Вот пример работы оверлеев. Незначащий код удален для простоты. Предположим, что мастер-документ взят из листинга 12.2
<window>
<box id="one"/>
<box id="two">
<label value="Amber"/>
</box>
</window>
Предположим далее, что оверлей-документы приведены в листинге 12.3
<overlay>
<box id="one">
<label="Red"/>
</box>
<box id="three">
<label="Purple"/>
</box>
</overlay>
<overlay>
<box id="two">
<label value="Green"/>
</box>
</overlay>
Если эти два оверлея сольются с мастер-документом, то результирующий документ представлен в листинге 12.4
<window>
<box id="one">
<label="Red"/>
<box id="two">
<label value="Amber"/>
<label value="Green"/>
</box>
</window>
Если атрибут id в мастер-документе совпадает с id оверлея, дочерние
теги оверлея копируются в мастер. Они добавляются к содержанию тега в
мастере, если таковое содержание было. Если совпадающего id не
обнаруживается (случай Purple ), к мастеру ничего не добавляется. Если
не считать некоторых тонких моментов, это и есть вся система
оверлеев.
Система оверлеев добавляет к тегам, которые понимает Mozilla, еще
два: <?xul- и <. На процесс слияния
влияют еще четыре новых атрибута.
<?xul- - это расширение XML, допустимое XML-
стандартом. Это инструкция, специфичная для Mozilla. Данная инструкция
означает: пожалуйста, добавьте содержание указанного документа к
данному документу. Этот тег имеет один специальный атрибут:
href
href можно присвоить значение любого корректного URL,
т.е. оверлея, который следует добавить.
Этот тег используется в мастере системой слияния, называемой сверху- вниз. Его можно поместить и в оверлей, в этом случае он сам окажется мастером. Таким образом, используя эту директиву, можно оформить в иерархию целую серию документов.
Mozilla не поддерживает тег <?xul- для
файлов HTML.
Тег < используется вместо тега <window> в
оверлей-документе. Так же как < или <page>, < демонстрирует специальное использование XUL контента.
В отличие от этих тегов, < подразумевает неполный
документ. Пример приведен в листинге 12.5.
<?xml version="1.0"?> <overlay xmlns="http://www.mozilla.org/keymaster/ gatekeeper/there.is.only.xul" id="style-id" > <description>Sample content</description> </overlay>
Атрибут xmlns по-прежнему требуется. Тег < имеет три
специальных атрибута:
id class style
Все три имеют те же значения, что и в XUL и HTML.
Стили <
может полностью передать свое содержание тегам мастера и,
следовательно, исчезнуть. В этом случае
Существует соглашение присваивать id тегу < в любом
случае. Этот атрибут полезен только если выполняется одно из следующих
условий:
Оверлей включает другой оверлей (иерархия оверлеев).
Этот id используется в процессе слияния файлов.
Наоборот, по умолчанию оверлей не следует добавлять, если нет
соответствующего id.
Эти три условия - следствия обсуждаемого здесь процесса слияния файлов.
Тег < необязательно ведет себя как блочный тег. Если
мы добавим верстальный атрибут, такой как, например, orient, это
будет иметь эффект, только если < сольется с подходящим
тегом в мастере.
Тег <overlaytarget> иногда используется, чтобы указать id,
соответствующий id в оверлее. Это тег без какого-либо
специального значения.
Прежде чем система оверлеев сольет что-либо воедино, она должна решить, какие файлы имеют походящее содержание.
Первый метод обнаружения файлов называется "сверху-вниз".
Для него требуется, чтобы программист указал в мастере все оверлеи.
Этот метод эквивалентен технике включения одного файла в другой,
которой обладают многие языки программирования. В C/C++ есть #include,
в Perl use и require, а в XUL есть the <?xul-.
Метод сверху-вниз дает программисту приложения возможность разбить XUL документ на иерархию отдельных файлов.
Второй метод называется "снизу-вверх". Он требует, чтобы
программист указал в базе данных все оверлеи и их мастер-файл. База
данных, называемая overlayinfo, опрашивается в момент старта
платформы. Этот метод эквивалентен make(1) and
ld(1) в UNIX. Это также напоминает концепции проектов в программных
инструментах IDE наподобие Visual Basic.
Метод снизу-вверх дает программисту возможность добавлять содержание к существующему XUL-файлу, не меняя его.
Один мастер-документ может наполняться обоими методами сразу.
Листинг 12.1 использует метод сверху-вниз. Однако невозможно сказать,
глядя на XUL-документ, используется ли метод снизу-вверх. Это можно
узнать, лишь заглянув в базу overlayinfo.
Пакет приложений классической Mozilla включает множество оверлеев, и еще больше может быть добавлено. Таким образом можно улучшить пакет. Наш NoteTaker основан на этой системе, как и большинство экспериментов на сайте http://www.mozdev.org. Подобно этому, оверлеи классической Mozilla могут быть добавлены в отдельное приложение. В любом случае, это пример неоднократного использования XUL-контента.
Оверлеи могут быть вызваны прямо из XUL мастер-документа. Это можно
сделать в любом XUL-файле. Доступ к
Чтобы присоединить файл-оверлей методом сверху-вниз, нужно включить одну строчку в мастер-документ:
<?xul-overlay href="chrome://mytest/content/Overlay.xul"?>
Обычно эту строчку помещают в начало документа, после <?xml?>
заголовка. Если добавляется более одного такого тега, указанные файлы
добавляются в порядке этих строк. Если файл указан дважды, он будет
присоединен дважды. Указываемые файлы не обязаны находиться в каталоге
Простой пример сверху-вниз оверлеев можно найти в коде консоли
JavaScript. См. файл console.xul в
Если тег <?xul- используется, чтобы загрузить не
оверлей-документ, Mozilla может вести себя неадекватно и даже
упасть.
Метод загрузки оверлеев снизу вверх не использует тег <?xul-. Вместо этого Mozilla получает информацию из базы данных
в
Этот метод позволяет сделать приложения Mozilla расширяемыми. Пакет
приложения Mozilla, добавленный в
Самый общий пример дизайна снизу-вверх - это Классический Браузер,
включающий пакет navigator, инсталлированный в
Простой пример - DOM Inspector. Он доступен по умолчанию в
классической Mozilla, но не в Netscape 7.0. Нет ни DOM Inspector, ни
соответствующего элемента меню. Однако DOM Inspector может быть
установлен позже. После его установки появляется элемент в меню Tools
| Web Development в окне Навигатора. Это меню содержится в новом
оверлее, появившемся при установке приложения DOM Inspector.
Необязательно интегрировать оверлеи с классической Mozilla и ее приложениями. Любое окно XUL может быть мастер-документом.
Чтобы использовать подход снизу-вверх, нужно знать, как работать с
База данных оверлеев - это множество директорий и
Эта директория порождается из других файлов и может быть
уничтожена, когда ее работа завершается. Mozilla читает эту
директорию, когда стартует и воссоздает ее, если она не существует.
Эта порожденная база данных представляет собой набор поддиректорий.
Каждая из них имеет
Внутри каждой директории overlayinfo/package есть поддиректория
content, в которой лежит файл make(1) makefile для отдельного пакета. Он действует как множество <?xul- инструкций для этого пакета. В нем хранится
набор фактов о каждом
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<Seq about="chrome://editor/content/editor.xul">
<li> chrome://messenger/content/mailEditorOverlay.xul </li>
<li> chrome://cascades/content/cascadesOverlay.xul </li>
</Seq>
</RDF>
В нем сказано, что при загрузке URL
Во многих случаях мастер-документ, упоминаемый в этом файле, сам по
себе оверлей, один из тех, что грузятся в мастер-документ сверху-вниз.
Эта техника слияния имеет своей целью работу с id тегов, описанных в
оверлее, но не в самом главном документе. Эти id значимы для
промежуточного оверлея, сконструированного специально для этой цели.
Данный промежуточный оверлей иногда определяется в id. Сливаясь с главным, он потянет за собой весь свой контент.
Отдельно от базы данных overlayinfo, но все еще в
hasOverlays hasStylesheets disabled
hasOverlays и hasStylesheets используются, чтобы отметить, что
XUL-оверлей или CSS оверлей-файлы имеют место для данного пакета. disabled
утверждает, что данный пакет не должен принимать оверлеи из внешнего
мира, вне самого пакета. Другими словами, оверлеи не могут быть
импортированы ни в один документ данного пакета из иных пакетов.
Факт с этими предикатами имеет своим подлежащим , а дополнением строку "true".
В этих сообщениях подлежащее не может быть "false". Чтобы
придать ему занчение "false", нужно удалить всю строчку.
Пример такого сообщения:
<- urn:mozilla:package:editor, hasOverlays, "true" ->
Так что типичная строчка в файле
<Description about="urn:mozilla:package:editor" hasOverlays="true"/>
База данных оверлеев Mozilla сконструирована так, чтобы поддерживать автодетектирование новых оверлеев. Она тесно связана с инсталляционной системой XPInstall, описываемой в лекции 17, "Установка". Несмотря на это ее легко использовать и вручную.
Заглядывая вперед, в систему XPInstall, мы видим следующее:
Прикладные пакеты при установке добавляют строчки в
Mozilla должна быть перезапущена после установки нового пакета, чтобы изменения вступили в силу.
Когда Mozilla стартует, она считывает файл installed-
Если installed-
Это означает, что все изменения, которые мы можем внести вручную в базу данных оверлеев, исчезнут, если установлен новый пакет. Изменения, внесенные вручную, годятся только для тестирования.
Чтобы добавить новый оверлей в базу данных вручную, нужно
остановить платформу и отредактировать файл <Seq>. В
Листинге 12.6 приведено все, что
необходимо.
Способ сделать эти изменения еще более постоянными - создать файл
contents.
Чтобы новые оверлеи были добавлены на постоянной основе, файл contents.rd рассматриваемого пакета должен содержать два добавочных сообщения. Первое - о том, что требуемый мастер-документ теперь имеет оверлей типа снизу-вверх. Другими словами, что отныне мастер-документ требует специальной обработки. Второе сообщение - какие именно существуют оверлеи для данного мастер-файла. Оба сообщения нужно упаковать в правильные контейнеры, чтобы все сработало:
<!-- Указывает документ, получающий оверлей --> <Seq about="urn:mozilla:overlays"> <li resource="chrome://package1/content/master.xul"/> </Seq> <!-- указывает оверлей, добавляемый к мастеру --> <Seq about="chrome://package1/content/master.xul"> <li> chrome://package2/content/overlay.xul</li> </Seq>
Контейнер <Seq about=" - это
служебный список
Чтобы изменить конфигурационную информацию об оверлеях в
nsIXULChromeRegistry, обсуждаемый в
разделе "Объекты XPCOM" лекции
17. Этот файл можно также модифицировать, используя систему
XPInstall, или добавляя сообщения в файлы contents.
Оверлеи присоединяются на основе id атрибута. Если идентификаторы
отсутствуют, используется более простая система. Другие специальные
случаи зависят от атрибутов, модифицирующих способ, которым
обрабатываются .
В следующем обсуждении id источника - это id оверлея. id цели, или
целевой id - это id мастер-документа.
В простейшем случае оверлей просто присоединяется к мастер-документу.
Если в мастер включаются несколько оверлеев, то они
присоединяются в том порядке, в каком система обрабатывает записи о
них. В этом случае требуется, чтобы в оверлее вообще не было id.
Если в мастер-документе тег <window> или < имеет
атрибут dir=", контент оверлея будет присоединен в
начало, а не в конец, но в обратном порядке. Если мастер имеет orient=", контент оверлея появится справа. И так
далее.
Мощь системы оверлеев базируется на идентификаторах id тегов XUL-а.
Можно использовать , чтобы влить оверлей в мастер часть за частью.
Это делается так.
Предположим, мастер-документ имеет тег с целевым id. Этот тег -
контейнер для любых тегов внутри него, но он может быть и пуст. Далее,
предположим, что оверлей имеет тег с тем же самым id ( id источника).
Тег c id источника тоже имеет теги внутри.
Когда два документа сливаются, происходит следующий процесс.
id тега-цели и id -тега источника совпадают.id источника добавляется к содержанию контента тега с id цели.Первый и второй пункты добавляют контент в мастер-документ. Третий затрагивает верстку, стили и любые другие аспекты поведения тега, основанные на атрибутах.
Достоинство этой системы состоит в том, что она действует
выборочно. Оверлей может иметь несколько фрагментов, каждый со своим
id. Эти фрагменты будут слиты с различными частями мастера, а именно с
теми, где обнаружится соответствующий id. Таким образом, оверлеи -
более мощный инструмент, чем C/C +'s #include или директива use
языка Perl. Эти системы могут вставить контент (код) только в одном
месте.
Вот пример. Листинг 12.7 - мастер-документ с двумя целевыми id.
Листинги 12.8 и
12.9 показывают два оверлея,
соответствующие id мастера. Стилевые таблицы опущены для
краткости.
<?xml version="1.0"?>
<?xul-overlay href="part1.xul"?>
<?xul-overlay href="part2.xul"?>
<window xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<vbox id="osite1">
<description>Main Box A</description>
</vbox>
<vbox id="osite2">
<description>Main Box B</description>
</vbox>
</window>
Мастер имеет два блока, каждый из которых имеет один тег.
<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<box id="osite1">
<description>Box C</description>
</box>
<box id="osite2">
<description>Box D</description>
</box>
</overlay>
Этот оверлей имеет два тега с id, соответствующим id мастера
( osite1, osite2 ). Листинг 12.9
точно такой же, с тем только отличием, что его контент "Box E, Box F" вместо "Box C, Box D"
и блок с id="osite2" имеет один добавочный атрибут: orient=".
<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<box id="osite1">
<description>Box E</description>
</box>
<box id="osite2" orient="horizontal">
<description>Box F</description>
</box>
</overlay>
(рис 12.1) показывает мастер-документ с этими оверлеями и без них.Контент обоих оверлеев был добавлен к контенту мастера. К каждому
тегу было добавлено соответствующее содержание. Тег со вторым целевым id изменил свой внешний вид, благодаря дополнительному атрибуту. Не
имеет значения то, что мастер-документ имеет теги <, а
оверлеи - <box>. Имена тегов в оверлеях не имеют значения. Но
использование подходящего имени упрощает чтение кода.
Этот пример можно слегка усложнить. Мастер-документ можно изменить следующим образом:
<vbox id="osite1"> <description>Main Box A </description> </vbox>
На это:
<vbox id="osite1"> <description>Main Box A </description> <box id="innersite"/> </vbox>
А любой из оверлеев пусть имеет следующий тег:
<box id="innersite"> <description>Inner Content </description> </box>
Неважно, где именно в оверлее он появится, он может быть даже вложенным тегом. Результат этих двух добавлений показан на рисунке 12.2
Новый контент был добавлен на новом месте. Он появился перед
добавленным контентом первого блока, потому что принадлежит
существующему тегу в мастере. Он был добавлен к контенту тега <box> мастера, а не тега <.
(рис 12.2) Мастер-документ с дополнительным контентомЭтот пример с добавлением контента к блокам довольно прост. В
реальном XUL есть множество тегов, очень чувствительных к добавляемому
контенту. В <commandset> можно добавить новые команды. В < - новые слои. В <menupopup> - новые элементы. < может получить новые <toolbarbutton>.
Основанная на id система слияния может слегка модифицироваться.
Контент оверлея не всегда должен быть присоединен к контенту мастера.
XML-атрибуты могут модифицировать место назначения контента. Следующие
атрибуты предоставляют эти дополнительные возможности:
position insertbefore insertafter removeelement
position используется как дополнение к атрибуту id. Его значение -
индекс позиции. Он присваивается одному или нескольким тегам внутри
тега, имеющего исходный id. Контент тега с этим атрибутом будет
добавлен к контенту тега, имеющего позицию, равную индексу, внутри
тега с целевым id. То есть position="3" добавит контент к
тегу после двух первых тегов внутри тега с соответствующим id. При
этом не может возникать
insertbefore и insertafter используются вместо id исходного тега.
Вместо того чтобы добавить контент тега с исходным id в мастер-документ,
туда добавляется сам исходный тег (и его контент). То есть в
мастере становится на один тег больше. insertbefore вставляет контент
перед тегом с указанным id, insertafter - после. В обоих случаях
вставляемый контент в иерархии DOM - братский тег указанному с помощью id.
removeelement может иметь значение true и используется вместе с
атрибутом id. Если этот атрибут установлен, соответствующий тег
попросту будет уничтожен. Нет смысла присваивать тегу с этим атрибутом
какой-либо контент.
Листинг 12.10 иллюстрирует этот синтаксис.
<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/ there.is.only.xul">
<box insertbefore="Box1">
<description>insertbefore="Box1"</description>
</box>
<box insertafter="Box2">
<description>insertafter="Box2"</description>
</box>
<box id="Box3">
<description position="3">position="3"
in content item</description>
</box>
<box id="Box4" removeelement="true"/>
</overlay>
На рисунке 12.3 показаны все эти параметры в простом мастер-
документе. Верхний снимок - мастер без оверлеев. Нижний -
результирующий документ после присоединения всех оверлеев. Заметим,
что блок 4 отсутствует из-за атрибута removeelement.
(рис 12.3) Мастер-документ. Параметры слияния за работой.
Регистр
Использование термина "регистр" не вполне удачно, потому
что Mozilla имеет несколько регистров, и все в различных форматах.
Более точно, регистр
Без
Основной способ использования регистра
chrome://package-name/content/
Так же как и система оверлеев, регистр
В разделе "Практика" лекций 2,
3, и 4 мы приводили примеры
Каждый файл
<Seq>
контейнеров:
urn:mozilla:package:root urn:mozilla:locale:root urn:mozilla:skin:root
Каждый контейнер указывает, какие пакеты, локализации или темы
доступны платформе. Хотя возможны некоторые отступления,
urn:mozilla:package:{package-name}
urn:mozilla:locale:{locale-name}
urn:mozilla:skin:{skin-name}/{skin-version}
Вот пример некоторых
urn:mozilla:package:navigator urn:mozilla:locale:en-US urn:mozilla:skin:classic/1.0
Эти
http://www.mozilla.org/rdf/chrome#
Доступные предикаты перечислены в Таблице 12.1
| Предикат | Применение | Значение | Цель |
|---|---|---|---|
accessKey |
символ | Клавиатурный ключ в классическом браузере, используемый для смены тем | |
author |
пакет, локализация, |
любой текст | Создатель пакета |
baseURL |
пакет | URL | Расположение пакета; не используйте схему |
disabled |
пакет | "true" | Запрещает внешние оверлеи, не используйте значение "false" |
displayName |
Пакет, |
любой текст | видимое имя |
hasOverlays |
пакет | "true" | XUL оверлеи существуют; не используйте значение "false" |
hasStylesheets |
пакет | "true" | CCS2 оверлеи существуют; не используйте значение "false" |
name |
пакет | Название пакета | |
name |
любой текст | Имя |
|
image |
URL | Изображение, иллюстрирующее |
|
localeVersion |
пакет | номер версии | Минимальная версия локати, требуемая пакетом |
locType |
пакет, |
Install, profile | Место, где установлен пакет или |
packages |
локализация, |
Тег <Seq>, содержащий вторичные контейнеры |
|
previewURL |
URL | Документ, иллюстрирующий пакет; не используйте схему |
|
selectedLocale |
Текущая локализация; применим только к глобальным пакетам |
В дополнение к главным контейнерам существует два множества
вторичных контейнеров. Они доступны из packages. Эти добавочные контейнеры содержат информацию о
реализациях тем и локализаций, специфичных для конкретного приложения.
Это также контейнеры вида <Seq> и они имеют следующие имена:
urn:mozilla:locale:{locale-name}:packages
urn:mozilla:skin:{skin-name}:packages
Каждый из этих контейнеров может содержать информацию о списке
специфичных реализаций.
urn:mozilla:locale:{locale-name}:{package-name}
urn:mozilla:skin:{skin-name}/{skin-version}:{package-name}
Например, если пакет Navigator (классический браузер) получает
французскую локализацию (FR), то требуется вот такой
urn:mozilla:locale:FR:navigator
Каждый из этих специфичных скинов или локализационных ресурсов
может быть уточнен с помощью
Более новые версии Браузера Mozilla несколько расширяют Таблицы 12.1 и 12.2 дополнительными предикатами.
| Предикат | Применение | Значение | Цель |
|---|---|---|---|
allowScripts |
"true" | ||
baseURL |
локализация, |
URL | Расположение реализации; не используйте схему |
localeVersion |
локализация | Номер версии | Версия реализации |
package |
локализация, |
Пакет, использующий данную реализацию | |
skinVersion |
Номер версии | Версия реализации |
Система сохранения состояния окон подобна системе оверлеев и
регистру
Система сохранения информации состоит из одного
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"/>
Никакие атрибуты по умолчанию не сохраняются. Каждый атрибут может быть сохранен для данного окна или диалогового окна. Вот некоторые из обычно сохраняемых атрибутов:
checked collapsed height hidden moz-collapsed open offsetX offsetY ordinal screenX screenY sizemode state width
Будет ли сохраняться данный атрибут - в конечном счете, вопрос дизайна приложения, но не возможностей платформы.
Сохраняемые значения атрибута - это его текущие значения. Если некоторые значения не прописаны в XUL, например, размеры окна, сохранятся текущие значения.
Указание, которое программист приложения помещает в XUL-код, чтобы сохранить некоторый атрибут, также есть XUL-атрибут:
persist
может содержать список атрибутов данного тега,
разделенных пробелом или запятой.
<window dir="ltr" orient="vertical" persist="dir orient"/>
Если используется сохранение атрибутов, их тег должен иметь id.
Оверлеи и регистр
@mozilla.org/chrome/chrome-registry;1 nsIXULChromeRegistry
Некоторые методы этого интерфейса поддерживают простые операции с системой оверлеев, но они не позволяют программисту управлять системой оверлеев полностью вручную. Использования этого интерфейса требуют весьма редкие задачи. Например, создание инструмента, подобного DOM Inspector или собственной инсталляционной системы.
Чтобы сохранить атрибут из JavaScript, используйте этот системный вызов:
document.persist(tagid, attname);
Это сохранит значение атрибута attname тега с id равным tagid.
В этом коротком разделе "Практика" мы перенесем фрагмент кода NoteTaker, ответственный за панель инструментов, в оверлей, который корректно встроится в окошко браузера Mozilla. Действия, которые следует предпринять, очевидны.
Найти id, который можно использовать, чтобы встроить панель
инструментов NoteTaker в окно классического браузера.
Найти id, который можно использовать, чтобы встроить меню NoteTaker
в окно классического браузера.
Пересмотреть код панели, чтобы включить пункт меню Tools,
подходящие и тег <.
Отредактировать регистр , чтобы внести в него новый
оверлей.
Уничтожить существующую базу данных оверлеев и перезапустить платформу, чтобы посмотреть результат.
Чтобы определить , нам нужно заглянуть в XUL код
мастер-документа приложения "классическая Mozilla" (то есть тот
документ, который содержит тег <window> для браузера).
Посмотрим в директорию " -
это аббревиатура слова Communicator. Этот .<, <page>, или < документы. А в файле
navigator.xul директории content/navigator содержится многообещающий
код:
<window id="main-window" ... >
Мы можем проверить, не является ли файл navigator.xul стартовой точкой классического браузера, просто загрузив его:
mozilla -chrome "chrome://navigator/content/navigator.xul"
Если мы так сделаем, то увидим, что действительно обнаружили
стартовую точку браузера. Необходимый нам id находится или в этом
файле, или в одном из его оверлеев. Мы можем использовать DOM
Inspector для исследования финального объединенного XUL документа или
просто исследовать код, для чего нужно знать полный список всех
оверлеев документа. Чтобы получить список, объедините:
<?xul-overlay ?>Повторите оба пункта для всех оверлеев, обнаруженных на первом и втором шаге.
В нашем случае это все необязательно, поскольку подходящий id обнаруживается в самом файле navigator.xul.
Для панели инструментов NoteTaker мы находим:
<toolbox id="navigator-toolbox" class="toolbox-top" deferattached="true">
Для меню NoteTaker:
<menu id="tasksMenu"> <menupopup id="taskPopup">
Тег <menupopup> - подходящее место для добавочного пункта
меню. Это может быть и не идеальное место, но здесь мы хотим найти
что-нибудь более или менее подходящее.
Заглянув в код нашей панели инструментов, мы видим, что сливать
нужно тег <commandset>. Для него мы находим в navigator.xul
строку <commandset id="commands">
Содержание тега <script> выполняется непосредственно после и
не нуждается в слиянии с мастером.
Мы переименовываем
<?xml version="1.0"?>
<!DOCTYPE overlay>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<script src="controllers.js"/>
<script src="toolbar_action.js"/>
<commandset id="commands">
... existingcommands go here ...
</commandset>
<menupopup id="taskPopup">
<menuitem label="Edit Note" command="
notetaker.toolbar.command.edit"/>
</menupopup>
<toolbox id="navigator-toolbox">
<toolbar id="notetaker-toolbar">
... existing toolbar content goes here ...
</toolbar>
</toolbox>
</overlay>
Если мы используем стиль оверлеев снизу-вверх, то нам не нужно
модифицировать код классического браузера. Мы сделаем это именно таким
образом. Все, что нам остается сделать, это зарегистрировать
<?xml version="1.0"?> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:chrome="http://www.mozilla.org/rdf/chrome#"> <Seq about="urn:mozilla:package:root"> <li resource="urn:mozilla:package:notetaker"/> </Seq> <Description about="urn:mozilla:package:notetaker" chrome:displayName="NoteTaker" chrome:author="Nigel McFarlane" chrome:name="notetaker"> </Description> </RDF>
(рис 12.4) Мастер-документ с содержанием, добавленным из оверлеевВ этом файле сказано, что приложение NoteTaker существует. Теперь мы должны добавить туда сообщение, что URL оверлея и целевой URL также существуют. Целевой URL - это документ, к которому оверлей будет присоединен. Эти добавочные сообщения приведены в листинге 12.14.
<!-- State the document that receives the overlay --> <Seq about="urn:mozilla:overlays"> <li resource="chrome://navigator/content/navigator.xul"/> </Seq> <!-- state the overlay that applies to the target --> <Seq about="chrome://navigator/content/navigator.xul"> <li>chrome://notetaker/content/browserOverlay.xul</li> </Seq>
В далеком прошлом имена оверлеев были строками, а не URL. Поэтому
последний <li> тег не использует форму resource= attribute. Это
верно вплоть до версии 1.4.
После того, как все изменения будут сделаны, классический браузер
будет выглядеть как на рисунке 12.4. Чтобы увидеть эти изменения, мы
должны остановить платформу, удалить существующий файл
На этом заканчивается раздел "Практика" данной лекции.
Оверлеи просты и не требуют сложного процесса отладки, но есть пара "ухабов", которые лучше объехать.
Самое узкое место с оверлеями находится в файле contents.
<li resource="chrome://package/content/overlay.xul"/>
Следует писать так:
<li>chrome://package/content/overlay.xul</li>
Если документ сам является мастером (то есть сам включает оверлеи),
то он должен быть описан как атрибут resource при регистрации его
мастер-документом. А когда его регистрируют как оверлей, его нужно
описать как XML. Эта нелогичность - дефект системы
Если в оверлее содержится
Оверлеи, встраиваемые снизу-вверх, можно ловко использовать, модифицируя всплывающие окна, генерируемые web-сайтами. Когда web-сайт пытается открыть такое окошко, все ваши панели инструментов или другие оверлеи по-прежнему сработают. Это может быть удобно, если вы web-разработчик и любите посмотреть на код страниц своих коллег. Обычно код всплывающих окон недоступен, если окно лишено всех привычных элементов управления.
Система оверлеев Mozilla дает программисту крупно- или, в крайнем
случае, средне-блочную технологию для работы. Это компонентная
технология годится для основанных на XML
Оверлеи, регистр <listbox> и <tree>. Кроме того,
что они сами по себе необходимы, они продвинут нас еще на один шаг
вперед к полноценному программированию
В этой лекции описывается инфраструктура оверлеев и каталога
Система оверлеев позволяет единому, финальному XUL-документу быть
сконструированным из одного или нескольких XUL-документов. Процесс
слияния документов можно организовать несколькими разными способами.
Система оверлеев - это
Пример документа, использующего оверлеи, приведен в листинге 12.1
<?xml version="1.0"?> <?xul-overlay href="chrome://test/content/overlayA.xul"?> <?xul-overlay href="chrome://test/content/overlayB.xul"?> <window xmlns="http://www.mozilla.org/keymaster/ gatekeeper/there.is.only.xul"> <description id="start">Anything</description> </window>
Этот документ забирает контент из двух файлов: overlayA.xul и overlayB.xul. Эти два файла также содержат XUL-код. Этот совокупный контент добавляется к содержимому исходного файла. Мы видим результат. Ни один из исходных файлов при этом не изменяется.
Регистр
Разрабатываемый нами пример, NoteTaker, использовал структуру
директории
На диаграмме в начале этой лекции показана небольшая часть
платформы, связанная с
Оверлеи и регистр overlayinfo и база данных
Система оверлеев довольно проста. Один XUL-документ является мастером. Он - стартовая точка для финального контента. Любой иной XUL документ - это оверлей. Контент оверлея присоединяется, или добавляется, к мастер-документу. Это происходит в оперативной памяти и не оказывает эффекта на исходные файлы.
Оверлей - это XUL-документ, основанный на теге <
вместо тега <window>. Такой файл имеет расширение .xul и
является корректным (well-formed) XML, но он не предназначается для
самостоятельного использования. Mozilla может показать оверлей сам по
себе, но это имеет смысл только для тестирования.
Mozilla также поддерживает стилевые оверлеи. Это обычные <.
crome классической Mozilla содержит также так называемые
JavaScript- оверлеи. Это не оверлеи в прямом смысле этого слова, это
обычные JavaScript файлы с расширением .js. Они присоединяются к
оверлею с помощью тега <script> в любом месте оверлей-файла. В
этом они не отличаются от обычного XUL.
И мастер, и оверлеи могут содержать синтаксис, специфичный для системы оверлеев.
Система оверлеев имеет два метода, чтобы решить, какие файлы следует сливать вместе. Эти методы называются "сверху-вниз" и "снизу-вверх", потому что первый инициируется мастер- файлом (сверху-вниз), а второй - особой базой данных оверлеев (снизу- вверх).
Система оверлеев использует один механизм слияния файлов. Этот
механизм основан на XUL id -атрибуте и имеет несколько незначительных
вариаций.
Вот пример работы оверлеев. Незначащий код удален для простоты. Предположим, что мастер-документ взят из листинга 12.2
<window>
<box id="one"/>
<box id="two">
<label value="Amber"/>
</box>
</window>
Предположим далее, что оверлей-документы приведены в листинге 12.3
<overlay>
<box id="one">
<label="Red"/>
</box>
<box id="three">
<label="Purple"/>
</box>
</overlay>
<overlay>
<box id="two">
<label value="Green"/>
</box>
</overlay>
Если эти два оверлея сольются с мастер-документом, то результирующий документ представлен в листинге 12.4
<window>
<box id="one">
<label="Red"/>
<box id="two">
<label value="Amber"/>
<label value="Green"/>
</box>
</window>
Если атрибут id в мастер-документе совпадает с id оверлея, дочерние
теги оверлея копируются в мастер. Они добавляются к содержанию тега в
мастере, если таковое содержание было. Если совпадающего id не
обнаруживается (случай Purple ), к мастеру ничего не добавляется. Если
не считать некоторых тонких моментов, это и есть вся система
оверлеев.
Система оверлеев добавляет к тегам, которые понимает Mozilla, еще
два: <?xul- и <. На процесс слияния
влияют еще четыре новых атрибута.
<?xul- - это расширение XML, допустимое XML-
стандартом. Это инструкция, специфичная для Mozilla. Данная инструкция
означает: пожалуйста, добавьте содержание указанного документа к
данному документу. Этот тег имеет один специальный атрибут:
href
href можно присвоить значение любого корректного URL,
т.е. оверлея, который следует добавить.
Этот тег используется в мастере системой слияния, называемой сверху- вниз. Его можно поместить и в оверлей, в этом случае он сам окажется мастером. Таким образом, используя эту директиву, можно оформить в иерархию целую серию документов.
Mozilla не поддерживает тег <?xul- для
файлов HTML.
Тег < используется вместо тега <window> в
оверлей-документе. Так же как < или <page>, < демонстрирует специальное использование XUL контента.
В отличие от этих тегов, < подразумевает неполный
документ. Пример приведен в листинге 12.5.
<?xml version="1.0"?> <overlay xmlns="http://www.mozilla.org/keymaster/ gatekeeper/there.is.only.xul" id="style-id" > <description>Sample content</description> </overlay>
Атрибут xmlns по-прежнему требуется. Тег < имеет три
специальных атрибута:
id class style
Все три имеют те же значения, что и в XUL и HTML.
Стили <
может полностью передать свое содержание тегам мастера и,
следовательно, исчезнуть. В этом случае
Существует соглашение присваивать id тегу < в любом
случае. Этот атрибут полезен только если выполняется одно из следующих
условий:
Оверлей включает другой оверлей (иерархия оверлеев).
Этот id используется в процессе слияния файлов.
Наоборот, по умолчанию оверлей не следует добавлять, если нет
соответствующего id.
Эти три условия - следствия обсуждаемого здесь процесса слияния файлов.
Тег < необязательно ведет себя как блочный тег. Если
мы добавим верстальный атрибут, такой как, например, orient, это
будет иметь эффект, только если < сольется с подходящим
тегом в мастере.
Тег <overlaytarget> иногда используется, чтобы указать id,
соответствующий id в оверлее. Это тег без какого-либо
специального значения.
Прежде чем система оверлеев сольет что-либо воедино, она должна решить, какие файлы имеют походящее содержание.
Первый метод обнаружения файлов называется "сверху-вниз".
Для него требуется, чтобы программист указал в мастере все оверлеи.
Этот метод эквивалентен технике включения одного файла в другой,
которой обладают многие языки программирования. В C/C++ есть #include,
в Perl use и require, а в XUL есть the <?xul-.
Метод сверху-вниз дает программисту приложения возможность разбить XUL документ на иерархию отдельных файлов.
Второй метод называется "снизу-вверх". Он требует, чтобы
программист указал в базе данных все оверлеи и их мастер-файл. База
данных, называемая overlayinfo, опрашивается в момент старта
платформы. Этот метод эквивалентен make(1) and
ld(1) в UNIX. Это также напоминает концепции проектов в программных
инструментах IDE наподобие Visual Basic.
Метод снизу-вверх дает программисту возможность добавлять содержание к существующему XUL-файлу, не меняя его.
Один мастер-документ может наполняться обоими методами сразу.
Листинг 12.1 использует метод сверху-вниз. Однако невозможно сказать,
глядя на XUL-документ, используется ли метод снизу-вверх. Это можно
узнать, лишь заглянув в базу overlayinfo.
Пакет приложений классической Mozilla включает множество оверлеев, и еще больше может быть добавлено. Таким образом можно улучшить пакет. Наш NoteTaker основан на этой системе, как и большинство экспериментов на сайте http://www.mozdev.org. Подобно этому, оверлеи классической Mozilla могут быть добавлены в отдельное приложение. В любом случае, это пример неоднократного использования XUL-контента.
Оверлеи могут быть вызваны прямо из XUL мастер-документа. Это можно
сделать в любом XUL-файле. Доступ к
Чтобы присоединить файл-оверлей методом сверху-вниз, нужно включить одну строчку в мастер-документ:
<?xul-overlay href="chrome://mytest/content/Overlay.xul"?>
Обычно эту строчку помещают в начало документа, после <?xml?>
заголовка. Если добавляется более одного такого тега, указанные файлы
добавляются в порядке этих строк. Если файл указан дважды, он будет
присоединен дважды. Указываемые файлы не обязаны находиться в каталоге
Простой пример сверху-вниз оверлеев можно найти в коде консоли
JavaScript. См. файл console.xul в
Если тег <?xul- используется, чтобы загрузить не
оверлей-документ, Mozilla может вести себя неадекватно и даже
упасть.
Метод загрузки оверлеев снизу вверх не использует тег <?xul-. Вместо этого Mozilla получает информацию из базы данных
в
Этот метод позволяет сделать приложения Mozilla расширяемыми. Пакет
приложения Mozilla, добавленный в
Самый общий пример дизайна снизу-вверх - это Классический Браузер,
включающий пакет navigator, инсталлированный в
Простой пример - DOM Inspector. Он доступен по умолчанию в
классической Mozilla, но не в Netscape 7.0. Нет ни DOM Inspector, ни
соответствующего элемента меню. Однако DOM Inspector может быть
установлен позже. После его установки появляется элемент в меню Tools
| Web Development в окне Навигатора. Это меню содержится в новом
оверлее, появившемся при установке приложения DOM Inspector.
Необязательно интегрировать оверлеи с классической Mozilla и ее приложениями. Любое окно XUL может быть мастер-документом.
Чтобы использовать подход снизу-вверх, нужно знать, как работать с
База данных оверлеев - это множество директорий и
Эта директория порождается из других файлов и может быть
уничтожена, когда ее работа завершается. Mozilla читает эту
директорию, когда стартует и воссоздает ее, если она не существует.
Эта порожденная база данных представляет собой набор поддиректорий.
Каждая из них имеет
Внутри каждой директории overlayinfo/package есть поддиректория
content, в которой лежит файл make(1) makefile для отдельного пакета. Он действует как множество <?xul- инструкций для этого пакета. В нем хранится
набор фактов о каждом
<?xml version="1.0"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<Seq about="chrome://editor/content/editor.xul">
<li> chrome://messenger/content/mailEditorOverlay.xul </li>
<li> chrome://cascades/content/cascadesOverlay.xul </li>
</Seq>
</RDF>
В нем сказано, что при загрузке URL
Во многих случаях мастер-документ, упоминаемый в этом файле, сам по
себе оверлей, один из тех, что грузятся в мастер-документ сверху-вниз.
Эта техника слияния имеет своей целью работу с id тегов, описанных в
оверлее, но не в самом главном документе. Эти id значимы для
промежуточного оверлея, сконструированного специально для этой цели.
Данный промежуточный оверлей иногда определяется в id. Сливаясь с главным, он потянет за собой весь свой контент.
Отдельно от базы данных overlayinfo, но все еще в
hasOverlays hasStylesheets disabled
hasOverlays и hasStylesheets используются, чтобы отметить, что
XUL-оверлей или CSS оверлей-файлы имеют место для данного пакета. disabled
утверждает, что данный пакет не должен принимать оверлеи из внешнего
мира, вне самого пакета. Другими словами, оверлеи не могут быть
импортированы ни в один документ данного пакета из иных пакетов.
Факт с этими предикатами имеет своим подлежащим , а дополнением строку "true".
В этих сообщениях подлежащее не может быть "false". Чтобы
придать ему занчение "false", нужно удалить всю строчку.
Пример такого сообщения:
<- urn:mozilla:package:editor, hasOverlays, "true" ->
Так что типичная строчка в файле
<Description about="urn:mozilla:package:editor" hasOverlays="true"/>
База данных оверлеев Mozilla сконструирована так, чтобы поддерживать автодетектирование новых оверлеев. Она тесно связана с инсталляционной системой XPInstall, описываемой в лекции 17, "Установка". Несмотря на это ее легко использовать и вручную.
Заглядывая вперед, в систему XPInstall, мы видим следующее:
Прикладные пакеты при установке добавляют строчки в
Mozilla должна быть перезапущена после установки нового пакета, чтобы изменения вступили в силу.
Когда Mozilla стартует, она считывает файл installed-
Если installed-
Это означает, что все изменения, которые мы можем внести вручную в базу данных оверлеев, исчезнут, если установлен новый пакет. Изменения, внесенные вручную, годятся только для тестирования.
Чтобы добавить новый оверлей в базу данных вручную, нужно
остановить платформу и отредактировать файл <Seq>. В
Листинге 12.6 приведено все, что
необходимо.
Способ сделать эти изменения еще более постоянными - создать файл
contents.
Чтобы новые оверлеи были добавлены на постоянной основе, файл contents.rd рассматриваемого пакета должен содержать два добавочных сообщения. Первое - о том, что требуемый мастер-документ теперь имеет оверлей типа снизу-вверх. Другими словами, что отныне мастер-документ требует специальной обработки. Второе сообщение - какие именно существуют оверлеи для данного мастер-файла. Оба сообщения нужно упаковать в правильные контейнеры, чтобы все сработало:
<!-- Указывает документ, получающий оверлей --> <Seq about="urn:mozilla:overlays"> <li resource="chrome://package1/content/master.xul"/> </Seq> <!-- указывает оверлей, добавляемый к мастеру --> <Seq about="chrome://package1/content/master.xul"> <li> chrome://package2/content/overlay.xul</li> </Seq>
Контейнер <Seq about=" - это
служебный список
Чтобы изменить конфигурационную информацию об оверлеях в
nsIXULChromeRegistry, обсуждаемый в
разделе "Объекты XPCOM" лекции
17. Этот файл можно также модифицировать, используя систему
XPInstall, или добавляя сообщения в файлы contents.
Оверлеи присоединяются на основе id атрибута. Если идентификаторы
отсутствуют, используется более простая система. Другие специальные
случаи зависят от атрибутов, модифицирующих способ, которым
обрабатываются .
В следующем обсуждении id источника - это id оверлея. id цели, или
целевой id - это id мастер-документа.
В простейшем случае оверлей просто присоединяется к мастер-документу.
Если в мастер включаются несколько оверлеев, то они
присоединяются в том порядке, в каком система обрабатывает записи о
них. В этом случае требуется, чтобы в оверлее вообще не было id.
Если в мастер-документе тег <window> или < имеет
атрибут dir=", контент оверлея будет присоединен в
начало, а не в конец, но в обратном порядке. Если мастер имеет orient=", контент оверлея появится справа. И так
далее.
Мощь системы оверлеев базируется на идентификаторах id тегов XUL-а.
Можно использовать , чтобы влить оверлей в мастер часть за частью.
Это делается так.
Предположим, мастер-документ имеет тег с целевым id. Этот тег -
контейнер для любых тегов внутри него, но он может быть и пуст. Далее,
предположим, что оверлей имеет тег с тем же самым id ( id источника).
Тег c id источника тоже имеет теги внутри.
Когда два документа сливаются, происходит следующий процесс.
id тега-цели и id -тега источника совпадают.id источника добавляется к содержанию контента тега с id цели.Первый и второй пункты добавляют контент в мастер-документ. Третий затрагивает верстку, стили и любые другие аспекты поведения тега, основанные на атрибутах.
Достоинство этой системы состоит в том, что она действует
выборочно. Оверлей может иметь несколько фрагментов, каждый со своим
id. Эти фрагменты будут слиты с различными частями мастера, а именно с
теми, где обнаружится соответствующий id. Таким образом, оверлеи -
более мощный инструмент, чем C/C +'s #include или директива use
языка Perl. Эти системы могут вставить контент (код) только в одном
месте.
Вот пример. Листинг 12.7 - мастер-документ с двумя целевыми id.
Листинги 12.8 и
12.9 показывают два оверлея,
соответствующие id мастера. Стилевые таблицы опущены для
краткости.
<?xml version="1.0"?>
<?xul-overlay href="part1.xul"?>
<?xul-overlay href="part2.xul"?>
<window xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<vbox id="osite1">
<description>Main Box A</description>
</vbox>
<vbox id="osite2">
<description>Main Box B</description>
</vbox>
</window>
Мастер имеет два блока, каждый из которых имеет один тег.
<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<box id="osite1">
<description>Box C</description>
</box>
<box id="osite2">
<description>Box D</description>
</box>
</overlay>
Этот оверлей имеет два тега с id, соответствующим id мастера
( osite1, osite2 ). Листинг 12.9
точно такой же, с тем только отличием, что его контент "Box E, Box F" вместо "Box C, Box D"
и блок с id="osite2" имеет один добавочный атрибут: orient=".
<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<box id="osite1">
<description>Box E</description>
</box>
<box id="osite2" orient="horizontal">
<description>Box F</description>
</box>
</overlay>
(рис 12.1) показывает мастер-документ с этими оверлеями и без них.Контент обоих оверлеев был добавлен к контенту мастера. К каждому
тегу было добавлено соответствующее содержание. Тег со вторым целевым id изменил свой внешний вид, благодаря дополнительному атрибуту. Не
имеет значения то, что мастер-документ имеет теги <, а
оверлеи - <box>. Имена тегов в оверлеях не имеют значения. Но
использование подходящего имени упрощает чтение кода.
Этот пример можно слегка усложнить. Мастер-документ можно изменить следующим образом:
<vbox id="osite1"> <description>Main Box A </description> </vbox>
На это:
<vbox id="osite1"> <description>Main Box A </description> <box id="innersite"/> </vbox>
А любой из оверлеев пусть имеет следующий тег:
<box id="innersite"> <description>Inner Content </description> </box>
Неважно, где именно в оверлее он появится, он может быть даже вложенным тегом. Результат этих двух добавлений показан на рисунке 12.2
Новый контент был добавлен на новом месте. Он появился перед
добавленным контентом первого блока, потому что принадлежит
существующему тегу в мастере. Он был добавлен к контенту тега <box> мастера, а не тега <.
(рис 12.2) Мастер-документ с дополнительным контентомЭтот пример с добавлением контента к блокам довольно прост. В
реальном XUL есть множество тегов, очень чувствительных к добавляемому
контенту. В <commandset> можно добавить новые команды. В < - новые слои. В <menupopup> - новые элементы. < может получить новые <toolbarbutton>.
Основанная на id система слияния может слегка модифицироваться.
Контент оверлея не всегда должен быть присоединен к контенту мастера.
XML-атрибуты могут модифицировать место назначения контента. Следующие
атрибуты предоставляют эти дополнительные возможности:
position insertbefore insertafter removeelement
position используется как дополнение к атрибуту id. Его значение -
индекс позиции. Он присваивается одному или нескольким тегам внутри
тега, имеющего исходный id. Контент тега с этим атрибутом будет
добавлен к контенту тега, имеющего позицию, равную индексу, внутри
тега с целевым id. То есть position="3" добавит контент к
тегу после двух первых тегов внутри тега с соответствующим id. При
этом не может возникать
insertbefore и insertafter используются вместо id исходного тега.
Вместо того чтобы добавить контент тега с исходным id в мастер-документ,
туда добавляется сам исходный тег (и его контент). То есть в
мастере становится на один тег больше. insertbefore вставляет контент
перед тегом с указанным id, insertafter - после. В обоих случаях
вставляемый контент в иерархии DOM - братский тег указанному с помощью id.
removeelement может иметь значение true и используется вместе с
атрибутом id. Если этот атрибут установлен, соответствующий тег
попросту будет уничтожен. Нет смысла присваивать тегу с этим атрибутом
какой-либо контент.
Листинг 12.10 иллюстрирует этот синтаксис.
<?xml version="1.0"?>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/ there.is.only.xul">
<box insertbefore="Box1">
<description>insertbefore="Box1"</description>
</box>
<box insertafter="Box2">
<description>insertafter="Box2"</description>
</box>
<box id="Box3">
<description position="3">position="3"
in content item</description>
</box>
<box id="Box4" removeelement="true"/>
</overlay>
На рисунке 12.3 показаны все эти параметры в простом мастер-
документе. Верхний снимок - мастер без оверлеев. Нижний -
результирующий документ после присоединения всех оверлеев. Заметим,
что блок 4 отсутствует из-за атрибута removeelement.
(рис 12.3) Мастер-документ. Параметры слияния за работой.
Регистр
Использование термина "регистр" не вполне удачно, потому
что Mozilla имеет несколько регистров, и все в различных форматах.
Более точно, регистр
Без
Основной способ использования регистра
chrome://package-name/content/
Так же как и система оверлеев, регистр
В разделе "Практика" лекций 2,
3, и 4 мы приводили примеры
Каждый файл
<Seq>
контейнеров:
urn:mozilla:package:root urn:mozilla:locale:root urn:mozilla:skin:root
Каждый контейнер указывает, какие пакеты, локализации или темы
доступны платформе. Хотя возможны некоторые отступления,
urn:mozilla:package:{package-name}
urn:mozilla:locale:{locale-name}
urn:mozilla:skin:{skin-name}/{skin-version}
Вот пример некоторых
urn:mozilla:package:navigator urn:mozilla:locale:en-US urn:mozilla:skin:classic/1.0
Эти
http://www.mozilla.org/rdf/chrome#
Доступные предикаты перечислены в Таблице 12.1
| Предикат | Применение | Значение | Цель |
|---|---|---|---|
accessKey |
символ | Клавиатурный ключ в классическом браузере, используемый для смены тем | |
author |
пакет, локализация, |
любой текст | Создатель пакета |
baseURL |
пакет | URL | Расположение пакета; не используйте схему |
disabled |
пакет | "true" | Запрещает внешние оверлеи, не используйте значение "false" |
displayName |
Пакет, |
любой текст | видимое имя |
hasOverlays |
пакет | "true" | XUL оверлеи существуют; не используйте значение "false" |
hasStylesheets |
пакет | "true" | CCS2 оверлеи существуют; не используйте значение "false" |
name |
пакет | Название пакета | |
name |
любой текст | Имя |
|
image |
URL | Изображение, иллюстрирующее |
|
localeVersion |
пакет | номер версии | Минимальная версия локати, требуемая пакетом |
locType |
пакет, |
Install, profile | Место, где установлен пакет или |
packages |
локализация, |
Тег <Seq>, содержащий вторичные контейнеры |
|
previewURL |
URL | Документ, иллюстрирующий пакет; не используйте схему |
|
selectedLocale |
Текущая локализация; применим только к глобальным пакетам |
В дополнение к главным контейнерам существует два множества
вторичных контейнеров. Они доступны из packages. Эти добавочные контейнеры содержат информацию о
реализациях тем и локализаций, специфичных для конкретного приложения.
Это также контейнеры вида <Seq> и они имеют следующие имена:
urn:mozilla:locale:{locale-name}:packages
urn:mozilla:skin:{skin-name}:packages
Каждый из этих контейнеров может содержать информацию о списке
специфичных реализаций.
urn:mozilla:locale:{locale-name}:{package-name}
urn:mozilla:skin:{skin-name}/{skin-version}:{package-name}
Например, если пакет Navigator (классический браузер) получает
французскую локализацию (FR), то требуется вот такой
urn:mozilla:locale:FR:navigator
Каждый из этих специфичных скинов или локализационных ресурсов
может быть уточнен с помощью
Более новые версии Браузера Mozilla несколько расширяют Таблицы 12.1 и 12.2 дополнительными предикатами.
| Предикат | Применение | Значение | Цель |
|---|---|---|---|
allowScripts |
"true" | ||
baseURL |
локализация, |
URL | Расположение реализации; не используйте схему |
localeVersion |
локализация | Номер версии | Версия реализации |
package |
локализация, |
Пакет, использующий данную реализацию | |
skinVersion |
Номер версии | Версия реализации |
Система сохранения состояния окон подобна системе оверлеев и
регистру
Система сохранения информации состоит из одного
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"/>
Никакие атрибуты по умолчанию не сохраняются. Каждый атрибут может быть сохранен для данного окна или диалогового окна. Вот некоторые из обычно сохраняемых атрибутов:
checked collapsed height hidden moz-collapsed open offsetX offsetY ordinal screenX screenY sizemode state width
Будет ли сохраняться данный атрибут - в конечном счете, вопрос дизайна приложения, но не возможностей платформы.
Сохраняемые значения атрибута - это его текущие значения. Если некоторые значения не прописаны в XUL, например, размеры окна, сохранятся текущие значения.
Указание, которое программист приложения помещает в XUL-код, чтобы сохранить некоторый атрибут, также есть XUL-атрибут:
persist
может содержать список атрибутов данного тега,
разделенных пробелом или запятой.
<window dir="ltr" orient="vertical" persist="dir orient"/>
Если используется сохранение атрибутов, их тег должен иметь id.
Оверлеи и регистр
@mozilla.org/chrome/chrome-registry;1 nsIXULChromeRegistry
Некоторые методы этого интерфейса поддерживают простые операции с системой оверлеев, но они не позволяют программисту управлять системой оверлеев полностью вручную. Использования этого интерфейса требуют весьма редкие задачи. Например, создание инструмента, подобного DOM Inspector или собственной инсталляционной системы.
Чтобы сохранить атрибут из JavaScript, используйте этот системный вызов:
document.persist(tagid, attname);
Это сохранит значение атрибута attname тега с id равным tagid.
В этом коротком разделе "Практика" мы перенесем фрагмент кода NoteTaker, ответственный за панель инструментов, в оверлей, который корректно встроится в окошко браузера Mozilla. Действия, которые следует предпринять, очевидны.
Найти id, который можно использовать, чтобы встроить панель
инструментов NoteTaker в окно классического браузера.
Найти id, который можно использовать, чтобы встроить меню NoteTaker
в окно классического браузера.
Пересмотреть код панели, чтобы включить пункт меню Tools,
подходящие и тег <.
Отредактировать регистр , чтобы внести в него новый
оверлей.
Уничтожить существующую базу данных оверлеев и перезапустить платформу, чтобы посмотреть результат.
Чтобы определить , нам нужно заглянуть в XUL код
мастер-документа приложения "классическая Mozilla" (то есть тот
документ, который содержит тег <window> для браузера).
Посмотрим в директорию " -
это аббревиатура слова Communicator. Этот .<, <page>, или < документы. А в файле
navigator.xul директории content/navigator содержится многообещающий
код:
<window id="main-window" ... >
Мы можем проверить, не является ли файл navigator.xul стартовой точкой классического браузера, просто загрузив его:
mozilla -chrome "chrome://navigator/content/navigator.xul"
Если мы так сделаем, то увидим, что действительно обнаружили
стартовую точку браузера. Необходимый нам id находится или в этом
файле, или в одном из его оверлеев. Мы можем использовать DOM
Inspector для исследования финального объединенного XUL документа или
просто исследовать код, для чего нужно знать полный список всех
оверлеев документа. Чтобы получить список, объедините:
<?xul-overlay ?>Повторите оба пункта для всех оверлеев, обнаруженных на первом и втором шаге.
В нашем случае это все необязательно, поскольку подходящий id обнаруживается в самом файле navigator.xul.
Для панели инструментов NoteTaker мы находим:
<toolbox id="navigator-toolbox" class="toolbox-top" deferattached="true">
Для меню NoteTaker:
<menu id="tasksMenu"> <menupopup id="taskPopup">
Тег <menupopup> - подходящее место для добавочного пункта
меню. Это может быть и не идеальное место, но здесь мы хотим найти
что-нибудь более или менее подходящее.
Заглянув в код нашей панели инструментов, мы видим, что сливать
нужно тег <commandset>. Для него мы находим в navigator.xul
строку <commandset id="commands">
Содержание тега <script> выполняется непосредственно после и
не нуждается в слиянии с мастером.
Мы переименовываем
<?xml version="1.0"?>
<!DOCTYPE overlay>
<overlay xmlns="http://www.mozilla.org/keymaster/
gatekeeper/there.is.only.xul">
<script src="controllers.js"/>
<script src="toolbar_action.js"/>
<commandset id="commands">
... existingcommands go here ...
</commandset>
<menupopup id="taskPopup">
<menuitem label="Edit Note" command="
notetaker.toolbar.command.edit"/>
</menupopup>
<toolbox id="navigator-toolbox">
<toolbar id="notetaker-toolbar">
... existing toolbar content goes here ...
</toolbar>
</toolbox>
</overlay>
Если мы используем стиль оверлеев снизу-вверх, то нам не нужно
модифицировать код классического браузера. Мы сделаем это именно таким
образом. Все, что нам остается сделать, это зарегистрировать
<?xml version="1.0"?> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:chrome="http://www.mozilla.org/rdf/chrome#"> <Seq about="urn:mozilla:package:root"> <li resource="urn:mozilla:package:notetaker"/> </Seq> <Description about="urn:mozilla:package:notetaker" chrome:displayName="NoteTaker" chrome:author="Nigel McFarlane" chrome:name="notetaker"> </Description> </RDF>
(рис 12.4) Мастер-документ с содержанием, добавленным из оверлеевВ этом файле сказано, что приложение NoteTaker существует. Теперь мы должны добавить туда сообщение, что URL оверлея и целевой URL также существуют. Целевой URL - это документ, к которому оверлей будет присоединен. Эти добавочные сообщения приведены в листинге 12.14.
<!-- State the document that receives the overlay --> <Seq about="urn:mozilla:overlays"> <li resource="chrome://navigator/content/navigator.xul"/> </Seq> <!-- state the overlay that applies to the target --> <Seq about="chrome://navigator/content/navigator.xul"> <li>chrome://notetaker/content/browserOverlay.xul</li> </Seq>
В далеком прошлом имена оверлеев были строками, а не URL. Поэтому
последний <li> тег не использует форму resource= attribute. Это
верно вплоть до версии 1.4.
После того, как все изменения будут сделаны, классический браузер
будет выглядеть как на рисунке 12.4. Чтобы увидеть эти изменения, мы
должны остановить платформу, удалить существующий файл
На этом заканчивается раздел "Практика" данной лекции.
Оверлеи просты и не требуют сложного процесса отладки, но есть пара "ухабов", которые лучше объехать.
Самое узкое место с оверлеями находится в файле contents.
<li resource="chrome://package/content/overlay.xul"/>
Следует писать так:
<li>chrome://package/content/overlay.xul</li>
Если документ сам является мастером (то есть сам включает оверлеи),
то он должен быть описан как атрибут resource при регистрации его
мастер-документом. А когда его регистрируют как оверлей, его нужно
описать как XML. Эта нелогичность - дефект системы
Если в оверлее содержится
Оверлеи, встраиваемые снизу-вверх, можно ловко использовать, модифицируя всплывающие окна, генерируемые web-сайтами. Когда web-сайт пытается открыть такое окошко, все ваши панели инструментов или другие оверлеи по-прежнему сработают. Это может быть удобно, если вы web-разработчик и любите посмотреть на код страниц своих коллег. Обычно код всплывающих окон недоступен, если окно лишено всех привычных элементов управления.
Система оверлеев Mozilla дает программисту крупно- или, в крайнем
случае, средне-блочную технологию для работы. Это компонентная
технология годится для основанных на XML
Оверлеи, регистр <listbox> и <tree>. Кроме того,
что они сами по себе необходимы, они продвинут нас еще на один шаг
вперед к полноценному программированию
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.