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

Скрипты

5.5.5. Библиотеки скриптов

Чтобы использовать чью-либо еще функциональность, Mozilla опирается на систему XPCOM, но существуют и небольшие библиотеки, написанные полностью на JavaScript. Эти библиотеки пытаются упростить взаимодействие с отдельными частями XPCOM-системы.

Самые полезные из этих библиотек - JSLib и RDFLib. На самом деле RDFLib - лишь подмножество JSLib. JSLib упрощает работу с файлами и папками. Ее часть RDFLib предназначена для облегчения работы с источниками данных RDF. Эта библиотека предоставляет JavaScript-объекты, упрощающие XPCOM-объекты, на основе которых они созданы.

Эту библиотеку можно загрузить с сайта http://jslib.mozdev.org. Ее файлы написаны в кодировке ASCII с переводом строки, принятым в UNIX.

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

Чтобы пользоваться библиотекой, необходимо включить файл верхнего уровня jslib.js, предоставляющий полезные процедуры и константы. Самая важная из этих процедур - функция include(), которая выполняет те же функции, что и require в Perl (или #include в препроцессоре C). Затем можно включать из JSLib любую нужную функциональность. Библиотека содержит около дюжины подкаталогов, но самые важные из них - io (для работы с файлами) и rdf (для работы с RDF). На рисунке 5.2 показаны зависимости между файлами.

Зависимости между файлами в JSLib и RDFLib

Рис. 5.2. Зависимости между файлами в JSLib и RDFLib

Скрипты, из которых выходят стрелки, требуют, чтобы скрипты, к которым эти стрелки направлены, были загружены первыми. Файлы без зависимостей не показаны. Очевидно, что библиотека разделена на две основные части, которые в этой книге будут называться RDFLib и JSLib. Существует две независимые реализации доступа к RDF-файлам: rdf/rdfFile.js и io/RDF.js. Они представляют собой различные интерфейсы для решения примерно одной задачи; интерфейс rdf/rdfFile.js - более общий и использует подобъекты.

Библиотека задействует метод window.Components.Constructor(), чтобы создавать конструкторы объектов для XPCOM-компонентов (описание того, как это делается, дано в разделе "Другие варианты создания объектов"). Кроме того, она реализует конструкторы объектов JavaScript с помощью системы прототипов JavaScript. Конструктор на основе прототипов используется для создания нового объекта JavaScript. Во время процесса создания конструкторы XPCOM-объектов используются для задания свойств нового объекта JavaScript. Каждое такое свойство хранит один XPCOM- объект. Поэтому окончательный объект JavaScript содержит (или использует) один или несколько XPCOM-объектов и является точкой доступа к этим объектам или их "фасадом". Это очень простая и широко распространенная методика.

Такие новые объекты JavaScript содержат код для проверки ошибок, координации и трансляции, облегчающий работу с XPCOM-компонентами. Они представляют упрощенный или специализированный взгляд на систему компонентов XPCOM для решения распространенных задач. В таблице 5.5 представлены объекты, создаваемые этой библиотекой.

Таблица 5.5. Объекты, создаваемые JSLIb и RDFLib
Конструктор Файл с исходным кодом Использует объекты Цель
include() method jslib.js Включать другие файлы .js
Dir(filePath) io/dir.js FileSystem() Работать с папкой на локальном диске
DirUtils() io/dirUtils Находить каталоги, специфичные для установки
File(filePath) io/file.js FileSystem() Работать с файлом на локальном диске
FileSystem(filePath) io/filesystem.js Работать с любым элементом файловой системы на локальном диске
RDF(url, urn, xmlns, sync_flag) io/rdf.js Записать или прочитать один RDF-контейнер конкретного формата в существующий файл или из него
RDFFile(file_url, urn, xmnls, sync_flag) io/rdf.js RDF() Записать или прочитать один RDF-контейнер конкретного формата в локальный файл или из него
Socket() network/socket.js Создать и читать из сокета или писать в него
SocketListener() network/socket.js Обеспечить асинхронное чтение из сокета
RDF(url, sync_flag) rdf/rdf.js RDFBase() Читать записи из RDF-документа или писать их в него по очереди
RDFBase(datasource) rdf/rdfBase.js Читать записи из RDF-документа или писать их в него по очереди, используя существующий источник данных
RDFContainer(type ownerURI, subjectURI, datasource) rdf/rdfContainer.js RDFResource() Упорядочивать или создавать RDF-контейнеры <Seq>, <bag> или <alt>, используя записи
RDFResource(type, ownerURI, subjectURI, datasource) rdf/rdfContainer.js RDFBase() Изменить или создать URI для работы с ним как с субъектом, объектом или предикатом RDF
Sound(url) sound/sound.js Проиграть звук, находящийся по этому адресу

В таблице 5.5 аргумент datasource - объект nsIRDFDataSource, не URL rdf:. Библиотека JSLib содержит несколько других полезных объектов, но они не такие общие или полные, как объекты, перечисленные в таблице. Например, объект Zip, определенный в файле zip/zip.js, выполняет только часть работы, необходимой для извлечения файла из архива.

Почти все файлы из библиотеки JSLib снабжены хорошей документацией в виде предварительных комментариев. Эти комментарии демонстрируют, как пользоваться предоставляемыми объектами.

5.5.6. XBL-связки

В JavaScript также доступны интерфейсы, предоставляемые XBL-определениями. Эти определения включаются в XML-файл со свойством стиля CSS 2 -moz-binding. Такая связь добавляет определение тегу или тегам. Хотя XBL-определения могут включать какое-то содержимое, можно создавать и определения, содержащие только функциональность - интерфейс. Возможность добавлять любую функциональность к любому тегу - очень мощная функция.

Если для получения объекта Element, соответствующего тегу с XBL-определением, используется стандарт DOM 1, результирующий объект JavaScript будет включать свойства и методы, подразумеваемые этим определением. Этими свойствами и методами затем можно пользоваться как обычно для объектов базового ПО. Платформа автоматически выполнит все необходимые действия.

Таким образом, XBL-определения расширяют функциональность некоторых DOM-объектов. Самими XBL-определениями можно пользоваться и как XPCOM-компонентами, поэтому они доступны через XPConnect. Единственная причина делать это - если XBL-компонент должен быть доступен из кода на C/C++.

В "XBL-связки" , "XBL-связки", XBL рассматривается более подробно.

5.5.7. Изолированные интерфейсы

В Mozilla существует три изолированных интерфейса, доступных из скриптов. У этих интерфейсов есть собственные интерпретаторы JavaScript и собственные глобальные объекты. Так как они изолированы от остальной части Mozilla, у них имеется собственный AOM.

Система настроек Mozilla - первый из этих интерфейсов. Ее AOM состоит из единственного объекта PrefConfig, который играет роль глобального объекта. У него есть всего два свойства, два метода: pref() и user_pref(). Файл настроек, prefs.js, состоит из многих вызовов этих методов, но на самом деле там можно использовать JavaScript полностью. Любая из возможностей языка в лучшем случае неявная. Система настроек также предоставляет два XPCOM-компонента. Они называются

@mozilla.org/preferences-service;1
@mozilla.org/preferences;1

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

Второй такой интерфейс - система сетевой установки компонентов Mozilla. В "Система распространения и установки - XPInstall" , "Система распространения и установки - XPInstall", полностью описывается эта среда и ее AOM. Эта система также предоставляет XPCOM-компоненты для доступа из обычной среды, но эти интерфейсы низкоуровневые и мало полезны для решения обычных задач. Они позволяют уведомлять систему XPInstall о появлении содержимого откуда-нибудь еще (например, из Internet) и принимать это содержимое для обработки. Эти ограниченные интерфейсы свидетельствуют, что XPInstall стоит использовать только для процесса установки.

Третий изолированный интерфейс Mozilla - xpcshell. Это отдельная от платформы Mozilla программа, недоступная в обычных стабильных сборках. Она доступна в нестабильных сборках или если вы собираете Mozilla самостоятельно (требует параметра --enable-debug ). xpcshell - самостоятельный интерпретатор JavaScript, использующийся для тестирования скриптов, интерпретатора JavaScript и системы XPConnect/XPCOM. Его AOM состоит из единственного глобального объекта и объектов, связанных с XPCOM. Самые полезные свойства глобального объекта перечислены в таблице 5.6.

Таблица 5.6. Свойства глобального объекта xpcshell
Свойство Описание
Components Массив компонентов XPConnect/XPCOM, предоставляет доступ к большей части компонентов платформы Mozilla
dump(arg) Преобразует аргумент в строку Unicode и отправляет ее необработанной на стандартный вывод
load(arg1,arg2,...) Пытается загрузить и интерпретировать указанные файлы (не URL)
print(arg1,args2,...) Преобразует аргументы в строки и отправляет их, слегка отформатировав, на стандартный вывод с помощью printf("%s")
quit() Завершает работу xpcshell

Массив Components делает xpcshell отличным местом для тестирования скриптов, которые используют большое число компонентов Mozilla. Так как xpcshell пользуется обычными дескрипторами файлов stdin и stdout, эту программу легко запускать в пакетном режиме автоматическими тестовыми системами. xpcshell - это JavaScript-эквивалент интерпретатора Perl, только он немногим больше программы тестирования.

Теоретически скрипт, запущенный в xpcshell, может создавать и использовать достаточно компонентов для "постройки" целого браузера. Практически же исполняемый файл Mozilla выполняет во время инициализации действия на низком уровне, которые xpcshell не использует. Следовательно, xpcshell лучше оставить для более простых задач.