Объекты XPCOM
В состав платформы Mozilla входит объектная библиотека, содержащая более тысячи объектов, которые могут использоваться разработчиком при создании собственных приложений. Многие из этих объектов не имеют никакого отношения к графическому интерфейсу пользователя. Задача этой лекции – рассказать, для каких целей разработчик может использовать различные группы объектов платформы.
Тысяча примеров скриптов – слишком много для одной лекции. Здесь мы можем лишь познакомиться с основными типами объектов, а также предложить читателю некоторые рекомендации и ориентиры для дальнейшего освоения библиотеки. Если вы займетесь разработкой на платформе Mozilla, в дополнение к материалу этой лекции вам придется читать определения интерфейсов объектов на языке XPIDL. В лекции приведены многочисленные фрагменты скриптов, демонстрирующие использование этих интерфейсов. Все примеры написаны на JavaScript.
Объектная библиотека Mozilla состоит, главным образом, из компонентов XPCOM. Без этих компонентов возможности разработчика приложений были бы ограничены работой с документами XML, будь то HTML или XUL. Механизмы взаимодействия приложений с внешним миром сводились бы к таким технологиям, как URL, HTTP, SOAP и WDSL. Добавление компонентов XPCOM радикально меняет ситуацию. Компоненты добавляют поддержку работы с сетью, базами данных, файлами и процессами – все, что нужно для разработки полноценных приложений с богатой функциональностью. Компоненты XPCOM доступны на всех платформах, где работает Mozilla, и код, использующий их, полностью переносим, за редким исключением.
Набор компонентов Mozilla сравним с любой современной объектно- ориентированной библиотекой или стандартной библиотекой языка третьего поколения. Подобно языкам C++ и Java, платформа Mozilla использует концепцию потоков ввода-вывода. Подобно языкам С, Perl и множеству прочих, Mozilla предлагает средства для работы с файлами. В целом, объекты Mozilla почти эквивалентны современным универсальным библиотекам классов.
Это "почти" связано с тем, что Mozilla пока достигла лишь версий 1.x. С относительной новизной платформы связана некоторая ограниченность круга объектов, доступных разработчику. Вместо того чтобы предложить широкий диапазон объектов низкого уровня, Mozilla содержит некоторое количество объектов низкого и среднего уровней, а также ряд объектов очень высокого уровня, рассчитанных на приложения определенного типа. Поскольку первоначально платформа была разработана как средство создания браузера и других приложений для работы с Internet, специализированные объекты, созданные для решения этой задачи, присутствуют в библиотеке на всех уровнях абстракции. В отличие, например, от библиотеки классов Java, набор компонентов Mozilla не был с самого начала спроектирован, как мощная универсальная библиотека. Тем не менее, тысяча компонентов – весьма мощный ресурс, который по объему приближается к обширной библиотеке модулей Perl.
Еще одна нетипичная особенность библиотеки Mozilla состоит в том, что многие ее объекты рассчитаны на работу с сетью. Первоначальные приложения Mozilla – навигатор, почтовый клиент и Chatzilla – представляют собой сетевые клиенты, взаимодействующие с серверами. Это наложило на библиотеку определенный отпечаток. Внутренняя реализация некоторых простых действий, например открытия файла, может быть весьма сложной, поскольку файл может оказаться где угодно в Internet. Эта сложность повлияла и на интерфейсы, доступные разработчикам. С другой стороны, возможности некоторых интерфейсов могут быть ограничены системой защиты Mozilla.
Однако даже если разрабатываемое приложение не является браузером, почтовым клиентом или системой работы с документами XML, Mozilla способна предложить множество полезных инструментов, хотя некоторые специализированные объекты высокого уровня окажутся при этом бесполезными. С другой стороны, если приложению необходима функциональность браузера, использование специализированных объектов позволит значительно ускорить процесс разработки.
Как показано на схеме в начале лекции, компоненты XPCOM являются основой прикладной части Mozilla. Технологии XPCOM и XPConnect используют различные вспомогательные файлы, прежде всего реестр (простую базу данных, сходную с системным реестром Microsoft Windows) и библиотеки типов (описания компонентов). Настройки Mozilla и информация о сертификатах также хранятся отдельно от компонентов. С точки зрения разработчика, наиболее интересной частью архитектуры XPCOM являются отдельно хранимые файлы XPIDL, которые содержат описания всех интерфейсов XPCOM в форме, удобном для чтения.
Эта лекция начинается с изложения нескольких концепций, особенно важных для понимания программного окружения, в котором взаимодействуют компоненты XPCOM. Затем мы переходим к обсуждению типичных задач программирования и решений, предлагаемых платформой Mozilla. Сначала рассматриваются более общие задачи, а затем специфичные для отдельных групп приложений. Затем обсуждается платформа в целом и ее система защиты. Практический раздел лекции содержит множество примеров, демонстрирующих использование объектов для работы с JavaScript.
16.1. Концепции и терминология
Обширная библиотека компонентов XPCOM, входящая в состав платформы Mozilla, – особый мир, где действуют свои законы и правила. Чтобы эффективно использовать эту библиотеку, полезно познакомиться со сложившейся терминологией и принятыми соглашениями в этой области.
16.1.1.Читая чужой код: соглашения об именовании
Фактически платформа Mozilla образована множеством различных программ, написанных на разных языках, и разработчику часто приходится обращаться к исходным текстам, чтобы изучить те или иные возможности платформы. В большей части исходного кода Mozilla и документации используется определенный стиль кодирования, к которому надо привыкнуть. Помимо документации, разработчик может обратиться к следующим источникам:
- Файлы на языке XPIDL, содержащие определения существующих интерфейсов XPCOM. Без этой информации разработка на платформе Mozilla практически невозможна.
- Исходный код различных приложений Mozilla, находящийся в каталоге chrome. Разработчик может почерпнуть оттуда многочисленные и разнообразные примеры.
- Исходный код платформы Mozilla на С/С++. Этот код более сложен и имеет меньшую ценность для разработчика приложений, однако также может быть полезным источником информации. Наряду с другими видами исходного кода, он является наиболее авторитетным источником информации по платформе Mozilla.
Из перечисленных источников основным являются определения XPIDL – это необходимый минимум для "выживания" на платформе Mozilla. URL этих файлов можно найти во введении к книге.
Стиль кодирования для платформы Mozilla подразумевает использование определенных соглашений об именовании. Это особенно важно для кода на JavaScript, поскольку этот язык обладает лишь слабыми механизмами типизации по сравнению с такими языками, как Java или C++.
Ниже приведены некоторые примеры соглашений об именовании, применяемых в исходном коде Mozilla.
Для определения характера интерфейсов XPCOM используются префиксы. Наиболее распространенным является префикс nsI (от " n et s cape I nterface"), который применяется для обозначения интерфейсов, предназначенных для использования разработчиками приложений. Существует также ряд более специфичных префиксов, указывающих на связь интерфейса с определенным приложением или технологией, например imgI, inI, jsdI и mozI (от image, inspector, JavaScript debugger и Mozilla соответственно). Все эти интерфейсы тоже доступны для разработчиков приложений. Объекты, имеющие префикс ns (без I) не предназначены для использования разработчиками приложений. Как правило, эти объекты применяются в системном коде платформы.
Для атрибутов и методов интерфейсов используются определенные соглашения об использовании прописных букв.
- Имена констант в интерфейсах, связанных с DOM, записываются прописными буквами ( ALL_UPPERCASE_STYLE ).
- Имена констант в интерфейсах, не связанных с DOM, как правило, записываются со строчной буквы, причем отдельные слова, входящие в состав имени, обозначаются прописной буквой( initCapStyle ).
- Имена переменных и методов записываются таким же образом ( initCapStyle ).
- Интерфейсы, связанные с RDF, составляют исключение – имена их методов записываются с прописной буквы, а отдельные слова, входящие в состав имени, записываются также с прописной ( InitCapStyle ).
В любом случае, прописные и строчные буквы используются одинаковым образом в XPIDL и в JavaScript. В системном коде платформы (C/C++) имена методов транслируются из initCap в InitCap. Имена интерфейсов иногда используются в той же форме, что и в XPIDL, а иногда записываются только прописными буквами ( ALL_CAPS ).
В коде Mozilla часто используются однобуквенные префиксы для имен переменных – атрибутов интерфейсов и аргументов методов. Эта нотация широко используется в связках XBL, системном коде на C/C++, интерфейсах XPIDL и прикладном коде на JavaScript. В последнем случае эти префиксы могут использоваться несколько бессистемно. Основные однобуквенные префиксы, используемые в коде Mozilla, представлены в таблице 16.1.
Еще один используемый префикс – PR, что означает Portable Runtime. Существует также аббревиатура NSPR, которая означает Netscape Portable Runtime – библиотека и стандарт кодирования, которые были разработаны для того, чтобы облегчить перенос Mozilla между различными операционными системами. На платформе Mozilla определен ряд типов, переносимость которых гарантирована, и эти типы имеют префикс PR. разработчик приложений, использующий компоненты XPCOM, в некоторых ситуациях может столкнуться с такой нотацией.
16.1.2. Модульное программирование
Платформа Mozilla использует разнообразные подходы к разделению программ на части или фрагменты. Практически любой термин для "части" или "фрагмента", используемый в разработке ПО, применяется в терминологии платформы Mozilla. Ниже приведены эти термины и их корректное использование в контексте Mozilla:
Связка (binding) – программный интерфейс, написанный на определенном языке программирования. В контексте Mozilla связки существуют в форме интерфейса JavaScript (ECMAScript) к объектной модели документа (DOM), описанного в стандартах Консорциума WWW, либо в форме связок XBL.
Класс. Единственные классы в Mozilla – классы компонентов XPCOM. На основе каждого класса может быть создано ноль или более объектов. JavaScript 2.0 (ECMAScript 1.4) будет поддерживать объектную модель, основанную на классах, но в версии JavaScript1.5, применяемой в Mozilla в настоящий момент, классы отсутствуют.
Компонент представляет собой сущность, имеющую уникальный идентификатор в системе XPCOM. Компонентом может быть класс с CID (идентификатором компонента) и соответствующим ContractID (вида @mozilla.org/test;1 ) или интерфейс с IID (идентификатором интерфейса). Иногда настоящими компонентами считают только классы.
Интерфейс – набор точек доступа к объекту. Интерфейсы XPCOM являются единственным примером интерфейсов в Mozilla. О каждом объекте, который предоставляет точки доступа, соответствующие описанию интерфейса, говорят, что он реализует этот интерфейс. Каждый объект XPCOM и связка XBL реализует ноль или более интерфейсов XPCOM. Объекты JavaScript также могут реализовывать интерфейсы XPCOM.
Библиотека. В состав платформы Mozilla входит несколько динамически подключаемых библиотек, но вряд ли они представляют особенный интерес для разработчика приложений. Иногда библиотеками называют скрипты или группы скриптов на JavaScript, которые могут предоставлять полезную функциональность другим программам. Библиотеки типов представляют собой файлы данных, определяющие интерфейсы XPCOM. Они создаются в момент компиляции платформы и автоматически используются механизмом XPConnect при обращении к интерфейсам.
Модуль. Компоненты XPCOM, входящие в состав платформы, сгруппированы в модули, но этот факт значим только для разработчиков самой платформы. Модули не имеют практического смысла для разработчика приложения, если только он не создает новый модуль XPCOM.
Объект. Mozilla содержит объекты XPCOM и объекты JavaScript. Объект XPCOM является экземпляром определенного класса XPCOM и реализует один или несколько интерфейсов. Объект JavaScript может находиться в широком диапазоне от простой структуры данных, целиком определенной на JavaScript, до сложного объекта платформы. Объекты платформы в скриптах на JavaScript могут быть либо объектами XPCOM, либо объектами Java.
Пакет – группа взаимосвязанных файлов, установленная в chrome. Пакет имеет имя, которое соответствует каталогу (папке) файловой системы.
Прототип – объект JavaScript, используемый в качестве основы для создания нового объекта JavaScript.
16.1.3. Внешние системы типов
Система XPCOM обеспечивает доступ скриптов JavaScript к другим программным окружениям, внешним по отношению к этим скриптам. Эти внешние окружения имеют собственные системы типов. Чтобы скрипты могли работать с ними, внешние типы должны автоматически конвертироваться в типы JavaScript (и обратно), либо быть доступны через специальные интерфейсы XPCOM.
Из скриптов JavaScript доступны пять внешних систем типов:
Базовые типы платформы, реализованные в составе NSPR. Это – переносимые типы C/C++, лежащие в основе платформы Mozilla.
Типы данных RDF. Типы в документах RDF, с которыми может работать Mozilla.
Типы данных схемы XML (XML schema). Mozilla способна выполнять синтаксический анализ файлов этого формата и может определять стандартные типы, встречающиеся в них.
XML RPC XDR. Mozilla поддерживает сетевой протокол RPC-через-XML, включая типы данных XDR, не зависящие от платформы.
Java. Виртуальная машина Java может выполняться как подключаемый модуль (plugin) платформы Mozilla, при этом скрипты могут получать доступ к типизированным объектам Java.
Из пяти перечисленных систем автоматическое преобразование типов выполняется лишь при работе с Java. Остальные четыре системы используют следующие интерфейсы XPCOM:
- Типы NSPR представлены интерфейсами, основанными на интерфейсе nsISupportsPrimitive, например nsISupportsPRInt32.
- Типы данных RDF имеют интерфейсы nsIRDFLiteral, nsIRDFDate и nsIRDFInt, основанные на nsIRDFNode.
- Для доступа к типам данных XML schema используются константы с соответствующими именами, доступные через интерфейсы nsISchemaSimpleType и nsISchemaBuiltinType.
- Кодирование данных XML RPC в формат XDR использует типы NSPR. Интерфейс nsIXmlRpcClient содержит метод-фабрику, который порождает необходимые объекты типов NSPR.
В дополнение к этим внешним системам типов, сама архитектура XPCOM и компоненты, входящие в ее состав, также образуют систему типов, основанную на объектной модели (иерархия классов и интерфейсов). Разработчики сложных приложений широко используют эти классы и интерфейсы.