В этой лекции рассказывается о том, как распространить свое
приложение с web-сайта по всему миру. Этим занимается система
XPInstall (
Большинство приложений Mozilla создаются для использования. Перед тем, как применять их, нужно инсталлировать эти приложения на свой компьютер. Инсталляция - часть общей проблемы распространения. Mozilla поддерживает несколько стратегий распространения. В данной лекции все эти стратегии описаны, но мы сосредоточим внимание на автоматическом распространении приложения с некоторого URL, обслуживаемого обычным web-сервером.
Распространение ПО с удаленного сервера - заманчивая идея еще со
времен первых Java-
Mozilla имеет переносимую инсталляционную систему, которая
называется XPInstall. В инструменте вне самой Mozilla, наподобие
InstallShield или
Создание системы распространения - это не просто связывание между собой нескольких окошек в мастере установки. Система распространения предназначена для выполнения реальной работы. Если она организована хорошо, весь мир сможет использовать ваше приложение, не беспокоя вас попусту. Если же в ней есть недочеты, приложение попросту канет в лету, не оставив следа.
Распространение основывается на основной идее комплекта (пакета,
На другой стороне процесса - инсталляция. В этой лекции под словом "инсталляция" мы понимаем копирование части комплекта на локальный компьютер. Можно сделать комплект для приложения таким, что он будет устанавливаться на любую из поддерживаемых Mozilla операционных систем. Поскольку каждая ОС имеет свои особенности, процесс инсталляции вынужден в них довольно глубоко закапываться. Тем не менее, 90% подготовки комплекта можно сделать переносимым способом.
В случае инсталляции из удаленного источника, XPInstall получает
файлы так же, как
Для создания готовых к распространению приложений знакомство с исходным кодом платформы не требуется, но если мы выбираем сложную стратегию распространения, доступ к работающему сборочному окружению платформы становится более важен.
На диаграмме в начале лекции показано, какое влияние имеет XPInstall
на платформу Mozilla. Здесь видно, что XPInstall может изменять любые
критичные для работающей платформы файлы. По сути дела, вся диаграмма
может быть подсвечена, поскольку XPInstall может подменить даже
динамически линкуемые библиотеки, другими словами, все, что угодно.
Такие обширные замены, однако, редки. Две вещи на диаграмме совсем не
указаны - инсталлируемые файлы и собственно XPInstall. Файлы
приложения, такие как XUL, CSS,
XPInstall и предоставляет, и использует знакомые нам технологии. Процесс распространения контролируется JavaScript, и есть специальные объекты, этому способствующие. XPInstall предоставляет пользователю последовательность интерактивных окон. Это делается несколькими специальными XUL-тегами.
Мы начнем эту лекцию с описания вариантов установки приложения. Затем опишем процесс удаленной установки и закончим реальным примером используемых технологий.
Любая возможность, которую только можно вообразить, доступна при инсталляции приложений Mozilla. Возможности, рассматриваемые здесь, это: вовсе обойтись без инсталляции, установка вручную, комбинированная установка (piggy-back), собственно установка платформы, - и установка со своим личным инсталлятором. Удаленная установка, главная тема данной лекции, подробно обсуждается отдельно.
Простейший способ получить доступ к приложению Mozilla - ничего не
инсталлировать вовсе. В этом случае пользователь имеет платформу на
локальном компьютере. Приложение грузится из web как серия файлов XUL
и всего, что им нужно, то есть оверлеев, стилевых таблиц и скриптов.
Чтобы получить документ XUL с web-сайта, просто удостоверьтесь, что
тип
application/vnd.mozilla.xul+xml
Если этому не воспрепятствует система безопасности на локальном
компьютере, подобное приложение получит такие же права доступа к
локальному компьютеру, как и любое иное приложение, установленное в
Web штука все еще медленная, так что необходимо обратить внимание
на производительность. Документы XUL, стилевые таблицы и скрипты
кешируются в браузере, так что если в
jar:{url}!{path}
Где {url} - адрес архива {path} - положение данного файла в
нем. Если файл
jar:resource:/chrome/example.jar!test/sample.xul
Как уже говорилось в лекции 12, "Оверлеи и resource:URL указывает в корень платформы, а обычно
привязана к resource:URLs.
Если используется - или некоторый
параметр, специфичный для данного приложения (как -jsconsole ), то
стартовавшее приложение XUL может ничем не напоминать браузер вообще.
Такие приложения полностью выглядят как локальные.
Если же вернуться к процессу инсталляции, то имеются следующие возможности.
Если необходима локальная инсталляция, самый простой путь - установить приложение вручную. Для этого нам потребуются доступ к локальной файловой системе и к командной строке.
Для инсталляции приложения вручную есть немало оснований. Для
разработчика это способ тестирования. Для системного администратора -
средство проследить за тем, что происходит в системе при работе
автоматизированных инструментов. Для системного
Существуют разные типы установки вручную: установка собственно
платформы, установка компонентов, приложений и установка системы
Установка компонентов вручную добавляет новые компоненты и интерфейсы XPCOM к уже установленной платформе. Эти компоненты становятся доступны всем установленным приложениям. Чтобы инсталлировать новые компоненты и интерфейсы, необходимо:
Исходный код Mozilla содержит пример компонента nsSample и
интерфейса nsISample, посмотрите исходный код в директории
xpcom/
Установка приложения вручную добавляет новые XUL-файлы в
Строки, добавляемые в installed-
skin,install,url,{url}/
locale,install,url,{url}/
content,install,url,{url}/
где {url} должен указывать на локальную директорию и обычно имеет
форму : или resource:. Схема resource:
указывает на корень платформы Mozilla - родительскую директорию директории en-US ; URL modern.
Безопасное инсталлирование может требоваться для приложений вне
Чтобы создать эти файлы, начните с создания нового пользовательского профиля, с помощью менеджера профилей Mozilla. Скопируйте все файлы профиля, чтобы сохранить оригинал. Затем следует инсталлировать приложение куда нужно. Запустите приложение, используя новый профиль, и не выполняя никаких особенных настроек или других изменений. Каждый раз, когда платформа будет спрашивать о правах на некоторое действие (например, о доступе к файлу с цифровой подписью или форме ввода), дайте такое разрешение. Каждый раз, когда она попросит разрешения запомнить данное решение, соглашайтесь. Пройдя через все аспекты безопасности, закройте приложение и скопируйте все изменившиеся в профиле файлы - сравните их с оригиналом. Это как раз те файлы, которые нужно установить вручную на каждую машину, где будет работать данное приложение. Другой способ - скопировать их в профиль по умолчанию.
И комбинированная (piggy-back), и собственно родная установка платформы требуют использования и модификации сборочного окружения Mozilla. Сборочное окружение здесь не рассматривается, но несколько замечаний все же стоит сделать.
Комбинированная установка - это просто установка платформы Mozilla, модифицированной так, чтобы включить добавочное приложение. Такая дистрибуция имеет два преимущества: она содержит стандартную версию платформы (и стандартных приложений) и встраивает все необходимые задачи в знакомую последовательность действий. Когда модифицированная платформа установлена, добавочное приложение автоматически становится доступно.
Чтобы выполнить эту работу, нужно изменить сборочное окружение Mozilla. К счастью, некоторые такие системы управляются своими же данными, которые можно посмотреть. Можно начать, посмотрев файлы примеров в директории xpinstall/packager. Необходимо внести, по крайней мере, три изменения:
Если первые шаги выполнены корректно, скомпилированный результат даст модифицированную инсталляцию, но нужно сделать одно предупреждение. Дело в том, что процесс сборки имеет множество тонких мест, поэтому при внесении изменений могут возникать проблемы. Скорее всего, потребуется потратить немало времени на изучение системы, прежде чем все заработает гладко.
Собственно инсталляция системы затрагивает самую сердцевину подсистемы XPInstall. Это небольшая часть платформо-зависимого кода. Он не использует XPCOM или иных возможностей Mozilla; это независимая программа, самостоятельно поддерживающая TCP/IP, FTP и HTTP. Чтобы с ней разобраться, требуется поближе познакомиться с исходным кодом Mozilla. Это можно сделать тремя способами:
При инсталляции полной системы, код XPInstall - часть большого архива, содержащего всю платформу и ее приложения. В Microsoft Windows это самораспаковывающийся архив.
При установке так называемой заглушки, распространяемый файл -
маленький (заглушка,
При установке приложения код XPInstall используется как специальный
инсталлятор конкретного приложения, независимый от основной платформы.
При таком использовании XPInstall ведет себя очень похоже на
InstallShield или
Код XPInstall сам имеет некоторые переносимые между платформами
части. Он содержит интерпретатор JavaScript, XUL-подобный код
Удаленная установка, подробно рассматриваемая в данной лекции, также использует инфраструктуру полной установки. Данная инфраструктура доступна не только в инсталляционном бинарнике, но и просто из запущенной платформы Mozilla. В объектной модели браузера есть некий хук, которому передается файл-комплект XPI, в результате чего начинается его установка.
И, наконец, сами приложения не могут вовсе игнорировать систему
XPInstall. Это нестандартная (custom) установка. Технологии XUL и
XPCOM обладают достаточными возможностями, чтобы установить приложения
из
Вообще, удаленная установка - это метод распространения информации,
подобный издательской модели традиционных
Чтобы приложение установилось удаленно, должно произойти несколько событий. Программист приложения, в роли выпускающего инженера, должен написать два скрипта. Конечный пользователь должен согласиться установить приложение. Платформа должна сработать согласно инструкциям.
Удаленная установка основана на использовании URL. Система
удаленной установки Mozilla может задействовать схему "file:" так же легко, как и схему "http:". Таким
образом, все сделанные здесь замечания относятся и к локальной
установке.
Здесь мы опишем задачи, которые должен выполнить программист, чтобы приложение могло быть установлено пользователем по сети. Система установки может разрабатываться одновременно с другими задачами, стоящими перед разработчиком.
Первый шаг - присвоить приложению необходимые имена. Для работы XPInstall требуется несколько имен.
Эти имена включают: текстовое имя (описание),
Текстовое имя - это юникодная строка, появляющаяся в диалоговом окне, которое система XPInstall показывает пользователю. Поскольку это юникод, он может содержать среди прочих и символы $$\copyright$$, $$\text{\textregistered}$$ или TM. XPInstall показывает эту строку латиницей, слева направо, что может являться ограничением для некоторых языков. Вот пример текстового имени:
Frederick's Amazing Shopping Spree System, Gold Version
fredshop
Имя приложения в регистре - это имя, используемое Mozilla для
управления приложением на
/Application Publisher/short-name/subproduct
Application subproduct опциональна и используется, когда
приложение - часть набора утилит, каждая из которых является
фрагментом большого приложения. Пример из Mozilla:
/mozilla.org/Mozilla/JavaScript Debugger/Venkman Chrome
Данный пример показывает, что подраздел может в свою очередь
ветвиться. Venkman
Если слеша "/" в имени регистра нет, оставшаяся часть рассматривается как подпуть и к ней будет добавлен префикс /mozilla.org/Mozilla/.
Фактически, имя приложения в регистре может быть любым путем, части
которого разделены прямым слешем; у первой из последовательности
частей нет явно определяемого значения. Это имя не должно
соответствовать имени директории; это просто иерархический ключ в
стиле ключей Windows
/Fred's Pyramid Company/Amazing Shopping Spree System/ Gold Version
Версии приложений Mozilla имеют фиксированный формат; это номер,
состоящий из четырех частей. Это четыре 32-битных целых, или строка
целых, разделенных точками. Эта строка должна легко конвертироваться в
четыре целых числа, она не должна содержать слова "
"{major}.{minor}.{revision}.{build}"
Главное число (major number) получает значение 0 и может изменяться, если дизайн приложения значительно изменится.
Подчиненное число также получает значение 0 и его увеличение отражает появление в приложении новых свойств. Приложения с меньшим подчиненным числом должны взаимодействовать с данной версией.
"Ревизия" также начинается с 0 и обычно увеличивается при
исправлениях ошибок и простейших изменениях. За исключением этих
исправлений, все более ранние ревизии должны вести себя идентично
данной. "
"1.0.2.20021018"
Существует несколько необязательных конвенций, связанных с этими номерами. Вот некоторые их них:
Номер
Ядро Linux и некоторые другие продукты используют четные
подчиненные (minor) числа для обозначения стабильных
Если главное число равно нулю, приложение считается экспериментальным. Не ожидайте от него, что оно сможет работать с предыдущими версиями, и неважно, каким было подчиненное число версии. Всякая совместимость в этом случае должна рассматриваться лишь как случайное совпадение.
Назвать приложение несложно. Сложнее это приложение правильно организовать. В интересах самого разработчика удостовериться, что когда пользователь устанавливает приложение, он имеет достаточно опыта для этого. Потому что когда пользователь решает поставить приложение, он тем самым выражает доверие тому сайту в сети, которое это приложение распространяет. Это доверие еще нужно заслужить, иначе единственным результатом будет лишь плохая репутация.
Итак, второй шаг в подготовке распространения приложения по сети -
общая подготовка выпуска приложения (a release
Исходники - самое начало создания распространяемого xpi-комплекта.
Это может быть просто собрание всех исходных файлов на
неперезаписываемом CD-R. Или это может быть
Для простых приложений следует просто сделать резервную копию перед
каждым
Воздействие (
Примерами обычных элементов воздействия могут быть регистр Windows,
иконки на рабочем столе,
Если установочный XPI-комплект затрагивает области вне установочной зоны платформы, не следует автоматически все сваливать под C:\Program Files (Windows) или /usr (UNIX). Это нарушит работу тех IT- специалистов, которые отвечают за конфигурирование и управление системой. Удостоверьтесь, что ваше приложение установит все в одну- единственную папку с именем, выбранным пользователем. Никогда не следует устанавливать файлы в /etc или C:\Windows или C:\Winnt, если есть способ этого избежать.
Для простых приложений воздействие не должно простираться дальше
директории
Наконец, требования - это описание компьютерной системы, для которой приложение предназначено. Эти требования включают описание "железа", операционной системы, уже существующих приложений, специфических файлов и конфигураций, требуемого дискового пространства - всего, что необходимо. Описание требований - основа файла README, который пользователь должен получить. Его используют также для определения списка тех проверок, которые должен выполнить инсталляционный скрипт.
Для простых
Чтобы автоматизировать распространение приложения, необходимо написать два скрипта.
Первый скрипт выполняется на обычной web-странице или документе XUL. Для его написания не нужно заботиться о вопросах, связанных с безопасностью. Он выполняется, только если страница или приложение просматривается с помощью технологий самой Mozilla. Остаток страницы приглашает пользователя установить приложение. Второй скрипт, называющийся install.js, выполняется внутри системы XPInstall, где он изолирован и от web, и от XPCOM.
Оба скрипта используют JavaScript-объекты хоста. Объекты, упоминаемые в данной лекции, описываются подробно в разделе "Технологии установки".
Первый скрипт называется "window.InstallTrigger и InstallVersion, который также
доступен как window.InstallVersion.
Объект InstallTrigger содержит диагностические методы, а также
метод install(), который начинает загрузку файлов XPI и, вероятно,
вызывает одну или более копий второго скрипта, install.js.
Диагностические методы используются для базовой проверки номеров
версий и для проверки того, что система XPInstall имеется в наличии и
доступна.
Объект InstallVersion существует для удобства работы, он может
сравнить два номера версий приложения и определить, какой из них
больше и какие именно из четырех частей номера версии отличаются и
чем.
Третий объект, который программист приложения должен создать, имеет следующую форму:
var xpi_container = {
"Test app part 1" : "URL1",
"Test app part 2" : "URL2",
...
}
Этот объект представляет все файлы XPI, которые в совокупности
образуют приложение и передаются методу InstallTrigger.install().
Объект в приведенном примере содержит два свойства, и, таким образом,
представляет два файла. Возможно любое число свойств, большее нуля.
Поскольку оба имени обоих свойств есть просто строки, они могут быть
доступны только как элементы массива:
var url = xpi_container["Test app part 1"];
Каждое имя свойства - текстовое имя компонента приложения, и
пользователь будет это имя видеть. Каждое значение свойства - это
(относительный или абсолютный) URL, который должен соответствовать
файлу XPI. URL может иметь дополнительную строку параметров. Строка
параметров начинается со знака вопроса, "?", это тот же
формат, что и в
/downloads/apps/mozilla/shopcart/main.xpi?java=yes;flash=no
Это относительный URL, так что Mozilla добавит http: и имя домена.
В данном примере java и flash. Подстрока параметров передается второму
скрипту install.js без дополнительной обработки.
Все эти объекты передаются в функцию, которая обычно вызывается
обработчиком onclick, привязанным к линку или кнопке.
В Листинге 17.1 приведен пример скелета такой функции, демонстрирующий большинство возможностей, которые она может включать.
function deploy() {
if ( !is_moz_browser() ) { return false; }
if ( !window.InstallTrigger.enabled() { return false; }
if ( !is_target() ) { return false; }
if ( !is_app_version_ok() } { return false; }
var error_flag = false;
function error_handler(url, err) {
error_flag = true;
};
calculate_params();
var xpi_container = { ... };
with (window.InstallTrigger)
install(xpi_container, error_handler);
return !error_flag;
}
Большинство функций, использованных в скрипте, нужно написать для
каждого приложения. Начальная серия проверок остановит процесс
установки, если что-то не так с компьютером пользователя или уже
установленными приложениями. Функция error_handler() может быть
настолько сложной, насколько это необходимо в каждом конкретном
случае. Функция calculate_params() подготавливает те параметры,
которые будут переданы второму скрипту. Эта информация используется
при создании объекта xpi_container. Наконец, вызывается функция install(), реально выполняющая всю работу. Конечно, ничего не
произойдет, если отключен JavaScript, или свойство xpinstall.enabled
имеет значение false.
Протестировать пользовательский компьютер на предмет соответствия
условиям установки - достойная задача. Браузер ограничен в своих
возможностях из соображений безопасности, а система XPInstall не
имеет доступа к стандартным компонентам XPCOM. Тестирование должно
опираться на обе эти части. Если требуется сложное тестирование,
напишите специальное приложение для этой цели и попросите пользователя
вначале установить его. Затем это приложение может быть использовано в
Второй необходимый скрипт всегда называется install.js. Каждый
архив XPI должен содержать такой скрипт. Он отвечает за размещение
каждого файла в архиве. Копирование файлов не выполняется самим
скриптом. Вместо этого скрипт снабжает систему XPInstall набором
инструкций по размещению файлов. Когда все инструкции получены,
XPInstall приступает к копированию. XPInstall выполняет инструкции,
обрабатывает возникающие ошибки и ведет
Окружение, в котором работает скрипт install.js, существенно ограничивает его возможности. Он работает в контексте отдельного интерпретатора JavaScript и имеет собственный глобальный объект, который не является объектом HTML или XUL окна. Есть всего несколько объектов, с которыми этот скрипт может работать. Вот эти объекты:
Install InstallVersion File FileSpecObject WinProfile WinReg
Объект Install - глобальный, поэтому его методы доступны
непосредственно, как если бы они были функциями. Это центральный
объект, имеющий набор методов, с помощью которых можно создавать
объекты других типов.
Объект Install имеет полезные свойства. Свойство означает
операционную систему. Свойство url содержит полный XPI URL.
Объект Install также имеет полезные методы: initInstall(),
инициирующий XPInstall, чтобы тот был готов получить инструкции; cancelInstall(), который полностью останавливает работу; performInstall(), выполняющий инсталляцию согласно полученным
инструкциям; и , удаляющий приложение. Он также имеет
полезные диагностические методы.
Объекты File и FileSpecObject не имеют никакого отношения к
файловым объектам XPCOM - это независимая реализация похожих функций.
Их можно использовать для работы с файлами в любом месте локального
компьютера. Доступны некоторые специальные имена, чтобы это можно было
делать на разных платформах. Объект File может выполнять также
некоторые тесты и другие вспомогательные задачи.
Объекты WinProfile и WinReg специфичны для Microsoft Windows. WinProfile обеспечивает доступ на чтение и запись к конфигурационным
.INI файлам, а WinReg - к Windows
В зависимости от своего содержания скрипт install.js может
потребовать, чтобы платформа была перезагружена; также может
понадобиться, чтобы платформа перечитала содержание
var TEXT_NAME = "Test Application Release 3.2";
var REG_NAME = "/Test Company/Test Application";
var VERSION = "3.2.0.1999";
var params;
var rv = SUCCESS;
function prepare() {
if ( !(params = parse_args())) return INVALID_ARGUMENTS;
if ( is_target() != SUCCESS ) return getLastError();
initInstall(TEXT_NAME, REG_NAME, VERSION); /*
-- as many functions like this as required -- */
if ( schedule_folders()!= SUCCESS) return getLastError();
if ( schedule_files() != SUCCESS ) return getLastError();
if ( modify_os() != SUCCESS ) return getLastError();
if ( run_any_programs() != SUCCESS)return getLastError();
if ( register_chrome() != SUCCESS) return getLastError();
return SUCCESS;
}
rv = prepare();
(rv == SUCCESS) ? performInstall() : cancelInstall(rv);
Этот скрипт полагается на сообщения об ошибках, которые
вырабатывает и возвращает объект Install, если что-то идет
неправильно. Первый шаг - удостовериться, что аргументы, переданные
initInstall() готовит XPInstall к получению инструкций по установке.
Каждая из последующих функций выполняет часть работы по подготовке
установки. Наконец, если все идет хорошо, метод performInstall()
выполняет все требуемые действия разом. Не показан процесс сохранения
информации о процессе установки с помощью метода logComment(), и
сообщения о процессе выполнения, посылаемые пользователю с помощью
методов alert() или . Метод prompt()
как метод здесь недоступен.
Простейшая версия этого скрипта, полезная для целей тестирования, приведена в листинге 17.3.
var TEXT_NAME = "Test Application Release 3.2";
var REG_NAME = "/Test Company/Test Application";
var VERSION = "3.2.0.1999";
var rv = SUCCESS;
function schedule_folders() {
var tree = getFolder("Chrome"); // Special keyword
setPackageFolder(tree);
addDirectory("chrome"); // topmost directory
}
function prepare() {
initInstall(TEXT_NAME, REG_NAME, VERSION);
if ( schedule_folders()!= SUCCESS) return getLastError();
return SUCCESS;
}
rv = prepare();
(rv == SUCCESS) ? performInstall() : cancelInstall(rv);
В этом примере функция обрезана до простейшего состояния
и содержит лишь функцию schedule_folders(). Эта функция реализует
критически важный шаг сравнения иерархии директорий в файле XPI и
локальной файловой системы.
Этот процесс имеет следующую механику. Специальное слово
В Листинге 17.3 все фалы в
комплекте XPI (кроме install.js) имеют в качестве корневой директории
директорию с именем addDirectory() заменит ее на то, что нужно в данном конкретном
случае.
Если файл XPI имеет в качестве "затычки" слово
"
chrome/content/TestApp/TestApp.xul chrome/locale/en-US/TestApp/master.dtd chrome/skin/classic/TestApp/global.css
Папки в файловой системе сравниваются с папками в комплекте XPI, и этот процесс может повторяться несколько раз в процессе установки. Комплект XPI может иметь несколько деревьев файлов с разными корневыми директориями. Например, если XPI имеет три дерева файлов, каждому дереву ищется соответствующее ему место в локальной файловой системе. Файл XPI может содержать
install.js subtree1/file1 subtree1/file2 subtree2/file3 subtree2/file4 subtree3/file5 subtree3/file6
Каждое
Наконец, если приложение должно быть удалено, может быть
использован метод между initInstall()
и performInstall(). Он удалит приложение,
основываясь на информации об истории установки, хранящейся в регистре
Mozilla.
Файл XPI имеет формат обычного ZIP-файла. Используйте WinZip,
Есть одно требование к содержанию данного файла: он должен содержать в своем корне файл install.js. Обычной практикой является то, что все остальное в этом файле соответствует структуре директорий в зоне установки платформы. Если структура директорий файла XPI не соответствует реальной файловой структуре, скрипт install.js будет посложнее.
Можно создать
На рисунке 17.1 показано содержание комплекта XPI Chatzilla -
клиента быстрой связи (
(рис 17.1) Файл XPI приложения Chatzilla для Microsoft Windows.Корневая директория, в данном случае называемая bin, собирает все
необходимые файлы вместе, в одно
Данный компонент добавляет платформе с установленной Chatzilla
новые свойства: опцию командной строки ( - ) и ).
Если файл XPI реализует только скин или локаль, скриптинг может
быть укорочен. В этом случае не требуется скрипт install.js. В
install() вызывается installChrome(). Поскольку
установка
В этом случае файлы, содержащиеся в файле XPI, просто копируются в
директорию
Если файл XPI распространяется web-сервером, он имеет тип
application/x-xpinstall
В этом случае система XPInstall обрабатывает этот файл автоматически. В таком случае нет необходимости в скрипте, привязанном к обработчику события в коде приложения. Любой скрипт install.js из файла XPI будет запущен автоматически.
Программист приложения может вообще избежать использования системы XPInstall. Теги XUL, описываемые в разделе "Технологии установки" позволяют легко создавать диалоговые окна, которые ведут себя как мастер установки.
Пользователь выбирает, откуда установить приложение. На следующей серии рисунков отображен процесс установки с точки зрения пользователя. Первое в этой цепочке - документ, еще не являющийся частью устанавливаемого приложения, см. рисунок 17.2.
Это HTML-страница, но это мог бы быть и XUL-документ. В таком
случае

(рис 17.3) Шаг первый удаленной установки: HTML-страница.(рис 17.2) Шаг второй удаленной установки: список комплектов.Этот диалог сообщает пользователю, что, собственно, устанавливается. Если пользователь выберет Cancel, процесс будет остановлен. Если пользователь соглашается, установка начинается и может идти до конца, не предоставляя пользователю новой возможности прекратить процесс. На следующем шаге пользователь видит индикатор прогресса, см. рисунок 17.4.
(рис 17.4) Шаг третий удаленной установки: комплекты XPI загружаются.Перечисленные комплекты загружаются по очереди. Файл install.js, который содержится в каждом комплекте, начинает выполняться сразу после окончания загрузки. Если скрипт не содержит специального кода, он выполняет свою работу без вмешательства пользователя. Если в нем содержатся подсказки или вопросы пользователя, они выглядят как обычные приглашения JavaScript, как показано на рисунке 17.5
Результатом выполнения скрипта install.js может быть либо прерванная, либо неудавшаяся загрузка, либо полная установка XPI-комплекта. Затем пользователь видит сообщение об итогах процесса, см. рисунок 17.6.
Если процесс установки требует, чтобы приложение после установки было запущено заново, пользователь также получит сообщение об этом.

(рис 17.6) Шаг четвертый удаленной установки: необязательное взаимодействие с пользователем.(рис 17.5) Шаг пятый удаленной установки: результаты.
Во время удаленной установки платформа управляет всем процессом, получая инструкции из скрипта install.js, выполняет все указанные действия, и сохраняет записи о них. Выполняются следующие шаги:
InstallTrigger.install() или InstallTrigger.installChrome(). Она порождает окна, которые видит пользователь, и управляет ими.registerChrome().Таков в целом процесс удаленной установки. Проверка соответствия версий ложится на плечи прикладного программиста, т.е. на код в на файле install.js.
Иногда система XPInstall задействует оставшуюся часть платформы для выполнения своей работы. Например, использует диалоговое окно предупреждения. Если это необходимо, скрипт, выполняющий свою работу где-то в другом месте платформы, будет блокирован до тех пор, пока XPInstall не закончит работу с внешним ресурсом. Обычно каждая подобная блокировка кратковременна и не имеет заметных последствий.
В оставшейся части лекции описываются технологии, используемые при удаленной установке.
Платформа использует несколько различных типов файлов данных. Есть
три главных типа этих файлов, и каждый из них имеет свой формат. Это
регистры,
Регистры - это файлы, доступные для чтения/записи, которые система использует как простую базу данных. Информация об имени приложения, версии и конфигурациях сохраняется в регистрах.
--enable-debug.
Форматы, используемые этими файлами, включают формат регистров
Mozilla (он описывается ниже) формат файлов Microsoft Windows .ini,
Регистр Mozilla - файл, по формату напоминающий регистр Microsoft Windows. К нему практически нет доступа, но взглянуть на его устройство полезно, это позволит лучше понять некоторые особенности Mozilla.
Регистр состоит из иерархии ключей, каждый из которых может иметь
несколько пар атрибут-значение. Ключи могут быть поименованы
иерархически, что по сути является путем к ключу. В корне иерархии
ключ "/" и несколько специальных имен, указывающих на важные
разделы иерархии. Это эквиваленты именам HKEY_ в Microsoft. Mozilla
использует юникодные
В отличие от регистра Windows, Mozilla использует прямые слеши (/)
в качестве разделителей в
| Тип файла | Имена файлов, использующие этот тип | Использование |
|---|---|---|
| Mozilla |
mozver. |
Регистр платформы, имена и версии приложений, информация, необходимая для удаления приложения, информация о |
| Microsoft Windows.ini | pluginreg. |
|
| manifest.ini, master.ini, talkback.ini | Конфигурационные файлы | |
| XML |
||
| Line-formatted |
installed- |
|
| Free format text | install.log, install_status.log |
Все регистры Mozilla имеют одинаковую структуру верхних уровней. Все регистры состоят из корня (а именно /) и четырех дочерних директорий:
"/Users/" "/Common/" "/Version Registry/" "/Private Arenas/"
Если при компиляции платформы указан специальный ключ, появляется пятая директория: "/Current User/". В стандартной системе она не присутствует. Ключ, хранимый в одном из четырех путей, может выглядеть, например, так:
"/Version Registry/mozilla.org/Mozilla/XPCom/bin"
Этот ключ не случайно выглядит как имя приложения в регистре -
строка после "/Version
Регистр Mozilla - хранилище информации для старта платформы. После того, как платформа стартует, она считывает информацию из регистра. Наиболее смущающий аспект в системе регистров - то, что их несколько, и каждый содержит только часть необходимой информации. Таблица 17.2 разъясняет этот момент.
"Регистр
Регистр Mozilla недоступен из скрипта install.js, если только не вызывается дополнительный выполняемый файл. К нему можно получить доступ из обычного приложения с помощью следующей пары XPCOM:
@mozilla.org/registry;1 nsIRegistry
Этот интерфейс предоставляет методы для чтения и записи, которые
можно использовать для передвижения по дереву ключей регистра.
Интерфейс не имеет очевидного способа прочитать (nsRegistryKey "магическое"
значение 32 (
| Имя | Однопользовательская ОС | Многопользовательская ОС | Файлы | Ключи | Использование |
|---|---|---|---|---|---|
| Регистр версий | 1 | 1 на пользователя | mozver. |
Versions Private arenas | Глобальный регистр информации о версиях для всех установок платформы, включая регистр |
| Глобальный регистр | 1 | 1 на пользователя | mozregistry. |
- | Не используется в настоящее время |
| Регистр приложений | 1 | 1 на пользователя | Appreg, |
Common | Регистр всех пользовательских профилей и всех доступных |
| Регистр компонентов | 1 на платформу | 1 на платформу | component.reg, "Component |
Common | Регистр всех доступных компонентов XPCOM |
Иногда приложению требуется провести пользователя по весьма извилистому пути. Установка приложения - как раз такой случай. Обычный способ справиться с этой задачей - снабдить пользователя диалоговым окном, помогающим ему на каждом из шагов. Такие диалоговые окна иногда называют "мастерами" (wizard).
XUL имеет тег <wizard> для создания окна помощи при сложных
процессах, подобных установке приложения. <wizard> подобен
причудливой комбинации тегов < и <. Каждый
тег <wizard> содержит один или более тегов <wizardpage>.
Каждый тег <wizardpage> может содержать произвольный XUL-контент.
Подобно тегу <, тег <wizard> представляет полное
окно и используется вместо тега <window>. Как карты в колоде,
теги <wizardpage> сложены в стопку один поверх другого. Тег <wizard> имеет кнопки Next, Back, Cancel и Finish, с помощью
которых пользователь может перелистывать страницы, точно так же, как
между вкладками (tabs). И <wizard>, и <wizardpage>
основаны на связках XBL, хранящихся в файле wizard.xml архива
В архиве "wizard". Эти файлы содержат добавочные возможности тега <wizard>, в частности, в форме JavaScript-объекта WizardManager.
Если ваше приложение нуждается в нескольких Мастерах, стоит заглянуть
в этот код, это поможет сэкономить время. Он позволит создать
центральный объект, хранящий всю скриптовую логику Мастеров. Это
рекомендуемый способ действий.
На рисунке 17.7 показано окошко,
основанное на теге <wizard>.
Это окно используется в
(рис 17.7) Создание почтового счета на основе тега <wizard>.Эти теги не используются при обычной установке системы, обсуждаемой
в данной лекции. Они используются при установке по выбору, установке из
Тег <wizard> предоставляет окошку некоторое содержание,
логику навигации и обработку событий. Минимум, который должен
реализовать программист приложения, - снабдить его недостающим
содержанием в виде контента - тегов <wizardpage> (которые обычно
состоят из элементов форм и объясняющего текста) и скриптов,
проверяющих вводимые данные и реагирующих на действия пользователя.
Тег <wizard> имеет следующие специальные атрибуты:
title pagestep firstpage lastpage onwizardnext onwizardback onwizardcancel onwizardfinish
title определяет строку, которая появится в верхней части окна,
после слов "Welcome to the".
pagestep определяет, на сколько страниц нужно
"перепрыгнуть", если выбраны кнопки Back или Next. Значение
по умолчанию - 1 (одна).
firstpage получает значение true, когда
показана первая страница.
lastpage получает значение true, когда показана последняя
страница.
Остальные атрибуты - это обработчики событий, срабатывающие при
нажатии кнопок Next, Back, Cancel, и Finish. Эти обработчики имеют
значимые действия по умолчанию. Так же, как для < и <window>, атрибуты width, height, screenX и screenY не работают
в теге <wizard>. Тег <wizard> автоматически получает width="500px", height="380px".
Вдобавок к атрибутам, XBL-определение тега <wizard> имеет
методы и свойства, позволяющие имитировать пользовательскую реакцию из
скрипта.
На рисунке 17.8 изображено
содержание тега <wizard>, если никакого иного
содержания программист не определил.
(рис 17.8) Простейший мастер на основе тега <wizard>.
Тег <wizardpage> подобен тегу <box>. Он используется
практически только внутри тега <wizard>. Можно поместить в него
любой XUL-контент, но не смешивайте его со встроенной системой
навигации Мастера. Лучше добавить несколько страниц, чем усложнять
существующие. <wizardpage> имеет следующие атрибуты:
pageid next onpagehide onpageshow onpagerewound onpageadvanced
pageid - идентификатор страницы, отдельный от идентификатора id. Он
используется внутренним механизмом Мастера и всегда должен быть
определен.
С помощью атрибута next можно нарушить стандартный порядок
просмотра страниц Мастера. Он содержит идентификатор pageid. Если он
установлен, Мастер больше не следует своей простой стратегии просмотра
страниц вперед и назад. Вместо этого любой шаг навигации определяется
атрибутом next. Чтобы это работало, нужно присвоить значение свойству
next <wizardpage>, а не самому тегу. Если это
сделано, вся навигация определяется тегами <wizardpage>,
имеющими атрибут next.
Остальные четыре атрибута - обработчики событий. Они срабатывают,
когда страницы Мастера появляются и исчезают, и когда пользователь
перелистывает страницы. Они не имеют реализации по умолчанию. <wizardpage> - действительно простейшая вещь.
Система удаленной установки XPInstall снабжает прикладного
программиста двумя объектами, используемыми на обычной HTML или XUL
странице: InstallTrigger и InstallVersion. I nstallTrigger и InstallVersion - свойства глобального (window) объекта; объект InstallVersion может быть создан методом InstallTrigger.getVersion().
Таблица 17.3 описывает объект InstallTrigger. Заметьте, что доступны некоторые
добавочные константы с тем же смыслом.
| Константы, свойства и методы | Использование |
|---|---|
|
Битовые флаги масок для installChrome() |
MAJOR_DIFF(4), MINOR_DIFF(3), REL_DIFF(2), BLD_DIFF(1), |
Константы, возвращаемые compareVersion() ; указывают, чем отличаются две версии; значения с противоположным знаком также возможны, кроме значения 5 |
Boolean enabled() |
True, если система XPInstall активирована в свойствах платформы |
Boolean install(Object xpi_list, function(url, |
True, если список XPI-комплектов был установлен без ошибки, аргумент function вызывается для каждого XPI URL, имеющего ошибку установки; см. раздел "Скрипты" |
Boolean installChrome(Number flags, String url, String name) |
То же, что и install(), за исключением того, что флаги являются битовым OR, то есть говорят о том, что контент существует, а install.js не запущен; name - текстовое имя приложения |
Number compareVersion(String name, String |
Сравнивает версию устанавливаемого приложения с имеющейся в регистре с тем же именем "name"; возвращает позитивное число, если версия устанавливаемого приложения больше |
InstallVersion getVersion(String name) |
Возвращает версию регистрового имени устанавливаемого приложения, или null |
Таблица 17.4 описывает объект InstallVersion. Заметьте, что доступны добавочные
константы, имеющие то же самое значение, что и основные.
| Константы, свойства, методы | Использование |
|---|---|
MAJOR_DIFF(4), MINOR_DIFF(3), REL_DIFF(2), BLD_DIFF(1), |
Константы, возвращаемые compareTo (), показывают отличия двух версий |
major |
Имеет значение главного числа версии |
minor |
Имеет значение подчиненного числа версии |
release |
Имеет значение |
build |
Имеет значение |
void init() |
Устанавливает значение версии "0.0.0.0" |
void init(String version) |
Устанавливает указанный номер версии |
String toString() |
Возвращает строку, соответствующую версии |
Number compareTo(String |
Сравнивает имеющуюся версию с устанавливаемой; возвращает позитивную константу, если устанавливаемая версия больше |
Объект InstallVersion также доступен из скрипта install.js
Скрипту install.js доступны следующие объекты:
Install InstallVersion FileSpecObject File WinProfile WinReg
Объект InstallVersion описан в разделе "Объекты на стороне
web"; остальные описываются здесь.
Объект Install - это глобальный объект в скриптовом окружении
install.js. Методы этого объекта могут вызываться непосредственно или
с префиксом Install. Объект Install - эквивалент свойству window
web-страницы.
Объект Install - объект-фабрика, с его помощью можно создать все
иные существующие в XPInstall объекты. Он хранит все аргументы,
переданные ему
Таблицы 17.5, 17.6, и 17.7 описывают этот объект. Все его свойства доступны только для чтения.
| Константа, свойство или метод | * | Использование |
|---|---|---|
|
Значения битовой маски флагов свойств и registerChrome() ; использование DELAYED_CHROME задерживает регистрацию до следующего старта платформы. |
|
Number buildID |
Номер |
|
| Error |
||
String |
Содержит тип операционной системы и версию, наподобие window.navigator.userAgent |
|
String jarfile |
||
String |
jarfile |
|
String |
В URL файла XPI содержит любую строку после "?", или null |
|
String url |
Полный URL файла XPI, переданный install() или installChrome() |
|
Number flags |
Флаги, переданные методом installChrome() объекта InstallTrigger |
|
Number _finalStatus |
Значение, возвращаемое счетчику в диалоговом окне удаленной установки | |
Boolean _installedFiles |
Получает значение False, если вызван метод cancelInstall() |
|
File File |
Ссылка на объект File |
|
Object Install |
Ссылка на глобальный объект Install |
|
Number addDirectory(String XPItree) Number addDirectory(String name, String XPItree, FileSpecObject OSpath, String localPath) Number addDirectory(String name, String version, String XPItree, FileSpecObject OSpath, String localPath) Number addDirectory(String name, InstallVersion version, String XPItree, FileSpecObject OSpath, String localPath) |
+ | Копирует указанный путь XPItree в локальную файловую систему; устанавливает с именем текущего приложения или регистровым именем приложения, если оно указано; всегда устанавливает с номером последней версии, или, если версия указана, сравнивает указанную версию с имеющейся, если имеется более новая, процесс установки прекращается; если место для копирования не указано, копирует в |
Number addFile(String XPIfile) Number addFile(String name, String version, String XPIfile, FileSpecObject Ospath, String localPath, [Boolean force]) Number addFile(String name, InstallVersion version, String XPIfile, FileSpecObject OSpath, String localPath, [Boolean force]) |
+ | Копирует файлы из XPI-архива в локальную файловую систему; устанавливает в |
Null alert(String value) |
Отображает окно модального диалога, ожидающее подтверждения пользователя | |
void cancelInstall() void cancelInstall(Number |
Не выполняются никакие предписанные инструкции; если указана причина, она указывается в коде ошибки, в противном случае указывается NSTALL_CANCELLED |
|
Boolean |
Отображает окно модального диалога, ожидающее принятия или отклонения условия пользователем; в случае отклонения возвращает false |
|
Number execute(String XPIpath, String
args, Boolean blocking)
Number execute(String XPIpath, String
args);
Number execute(String XPIpath);
|
Выполнить программу, расположенную по адресу XPIpath в архиве XPI; можно передать ей системно-зависимую строку аргументов; можно, присвоить параметру blocking значение true, это задерживает процесс установки до окончания выполнения программы; значение blocking по умолчанию равно false |
|
Number gestalt(String |
Только для платформы Macintosh - возвращает значение селектора согласно Gestalt Manager; в противном случае null |
|
FileSpecObject getComponentFolder(String name) FileSpecObject getComponentFolder(String name, String |
возвращает имя папки из subpart имени приложения, если null |
|
FileSpecObject getFolder(String |
Возвращает имя папки, соответствующее null в случае неудачи |
|
Number getLastError() |
Возвращает последний SUCCESS |
|
WinProfile getWinProfile(FileSpecObject folder, String filename) |
Возвращает объект WinProfile указанного в файле .INI; возвращает null, если ОС не Microsoft Windows |
|
WinReg getWinRegistry() |
Возвращает объект WinReg |
|
Number initInstall(String text_name, String reg_name, String |
Начинает назначенный процесс данной установки; устанавливает имя данного приложения в text_name, имя регистра reg_name, версию - в version ; возвращает ошибки |
|
Object loadResources(String XPIpath) |
Возвращает JavaScript-объект, моделируемый на основании файла свойств (stringbundle) в архиве XPI; этот файл свойств имеет относительное имя пути XPIpath; каждое свойство в фале появляется как свойство объекта JavaScript; возвращает null в случае ошибки |
|
Null logComment(String text) |
+ | Записывает text, с некоторым форматированием, в файл install.log |
|
Этот метод позволяет обновить данный файл на основе побайтной дельты; не рекомендуется к использованию, задействуйте вместо этого addFile() |
|
Number performInstall() |
Выполняет все предписанные задачи и возвращает |
|
Number registerChrome(Number flags, FileSpecObject folder) Number registerChrome(Number flags, FileSpecObject folder, String rdfpath) |
Заставляет платформу перепрочитать flags сообщает, какие folder - местоположение рассматриваемых файлов, rdfpath - необязательный подпуть (включающий имя файла) к файлу ontents. |
|
Number refreshPlugins() Number refreshPlugins Boolean reloadPages) |
Заставляет платформу обновить доступные reloadPages имеет значение false, перезагрузки не происходит |
|
void resetError() void resetError(Number error) |
Устанавливает последнюю полученную ошибку в ноль или данное значение, если оно имеется | |
Number setPackageFolder(FileSpecObject folder) |
Заменяет значение |
|
Number |
Назначает имя регистра указанного приложения к удалению; возвращает |
Следующие замечания поясняют таблицу 17.5
Важно понять, что возвращаемые значения ошибок предписанных методов описывают лишь проблемы с процессом назначения инструкций. Они не сообщают о проблемах, возникших во время выполнения предписанных инструкций. Даже если проблем не возникает на этапе назначения инструкций, они могут появиться во время установки приложения.
Значения ошибок - обычно отрицательные целые. Целые между -200 и
-299 зарезервированы; значения меньшие -5550 относятся к платформе
Macintosh; 0 есть SUCCESS, а 999 - REBOOT_NEEDED. Все значения,
генерируемые платформой, имеют соответствующие имена свойств,
содержащие константы. В таблице 17.6 эти имена перечислены.
Список корректных селекторов метода gestalt() и их значений можно
найти по адресу http://www.rgaros.nl/gestalt/index.html.
Специальные ключевые слова, передаваемые как аргументы методу getFolder(), перечисляются в Таблице 17.7.
Ключевое слово "Program" соответствует корню области установки платформы. Ключевое слово "file:///" соответствует корню локальной файловой системы. Чтобы посмотреть значения специальных ключевых слов на конкретном компьютере, используйте следующую строчку кода:
alert(getFolder(keyword).toString());
FileSpecObject - объект, подобный значению (value-like object),
который передается между методами других объектов в системе XPInstall.
Совершать какие-либо действия с этим объектом приходится редко. Он
никогда не порождается оператором new в JavaScript. Он имеет лишь одно
полезное свойство:
String toString()
Этот метод возвращает путь к папке, уникальный для каждой операционной системы, который представляет объект FileSpecObject.
Объект Install отвечает за установку и проверку соответствия папок,
файлов и File, по сравнению с ним, отвечает
за проверку и точное манипулирование конкретным файлом. Некоторые из
методов объекта Install используются для выполнения запланированных
задач во время установки. Все методы объекта File выполняются на более
позднем этапе.
Всегда используется только один объект File, он доступен как
свойство с именем File глобального объекта. Все методы этого объекта
доступны как:
File.method_name(args);
| Имя | Имя | Имя |
|---|---|---|
ACCESS_DENIED |
INSUFFICIENT_DISK_SPACE |
READ_ONLY |
ALREADY_EXISTS |
INVALID_ARGUMENTS |
REBOOT_NEEDED |
APPLE_SINGLE_ERR |
IS_DIRECTORY |
SCRIPT_ERROR |
BAD_PACKAGE_NAME |
IS_FILE |
SOURCE_DOES_NOT_EXIST |
CANT_READ_ARCHIVE |
KEY_ACCESS_DENIED |
SOURCE_IS_DIRECTORY |
CHROME_REGISTRY_ERROR |
KEY_DOES_NOT_EXIST |
SOURCE_IS_FILE |
DOES_NOT_EXIST |
MALFORMED_INSTALL |
SUCCESS |
DOWNLOAD_ERROR |
NETWORK_FILE_IS_IN_USE |
UNABLE_TO_LOAD_LIBRARY |
EXTRACTION_FAILED |
NO_INSTALL_SCRIPT |
UNABLE_TO_LOCATE_LIB_FUNCTION |
FILENAME_ALREADY_USED |
NO_SUCH_COMPONENT |
UNEXPECTED_ERROR |
GESTALT_INVALID_ARGUMENT |
PACKAGE_FOLDER_NOT_SET |
UNINSTALL_FAILED |
GESTALT_UNKNOWN_ERR |
PATCH_BAD_CHECKSUM_RESULT |
USER_CANCELLED |
INSTALL_CANCELLED |
PATCH_BAD_CHECKSUM_TARGET |
VALUE_DOES_NOT_EXIST |
INSTALL_NOT_STARTED |
PATCH_BAD_DIFF |
| Microsoft Windows | Macintosh | UNIX | |
|---|---|---|---|
"Plugins" |
" |
"Mac System" |
"Unix Local" |
"Program" |
"Windows" |
"Mac Desktop" |
"Unix Lib" |
" |
"Mac |
||
"Profile" |
"Mac Startup" |
||
"Preferences" |
"Mac |
||
"OS |
"Mac Apple Menu" |
||
"file:///" |
"Mac |
||
"Components" |
"Mac Extension" |
||
" |
"Mac Fonts" |
||
"Mac Preferences" |
|||
"Mac Documents" |
Таблица 17.8 описывает объект File.
| Константа, свойство или метод | * | Использование |
|---|---|---|
Number copy(FileSpecObject src, FileSpecObject target) |
+ | Копирует файл или папку по месту назначения |
Number dirCreate(FileSpecObject local) |
+ | Создает локальную директорию local |
FileSpecObject dirGetParent(FileSpecObject dir) |
Возвращает имя директории, родительской по отношению к dir, или null |
|
Number dirRemove(FileSpecObject local) |
+ | Удаляет директорию local |
Number dirRename(FileSpecObject local) |
+ | Переименовывает директорию local |
Number diskSpaceAvailable(FileSpecObject local) |
Возвращает количество доступного места в байтах на диске/томе, содержащем local | |
Number execute(FileSpecObject file [, String args [, Boolean blocking ] ] ) |
Запускает выполняемый файл file, с аргументами args. Если blocking имеет значение true, установка приостанавливается до окончания выполнения программы. По умолчанию blocking имеет значение false |
|
Boolean exists(FileSpecObject local) |
Возвращает true, если файл или папка local существует |
|
Boolean isDirectory(FileSpecObject local) |
Возвращает true, если local является локальной папкой |
|
Boolean isFile(FileSpecObject local) |
Возвращает true, если local является локальным файлом, но не папкой |
|
Boolean isWritable(FileSpecObjec local) |
Возвращает true, если для папки или файла local есть права на запись |
|
Number macAlias(FileSpecObject src, String filename, FileSpecObject target) Number macAlias(FileSpecObject src,
String filename, FileSpecObject target, String |
+ | Создает Macintosh |
Number modDate(FileSpecObject local) |
Возвращает значение в миллисекундах, когда local был изменен. Это время вычисляется по-разному для каждой платформы | |
Boolean modDateChanged(FileSpecObject local, number modDate) |
Возвращает true, если файл local был изменен после modDate() |
|
Number move(FileSpecObject src, FileSpecObject target) |
Передвигает файл src в папку target. Не может передвигать директории Microsoft Windows | |
String nativeVersion(FileSpecObject local) |
Считывает информацию о Microsoft Windows версии файла local (например, версию DLL) | |
Number remove(FileSpecObject local) |
+ | Удаляет файл или папку local |
Number |
+ | Присваивает файлу или папке local имя name |
Number size(FileSpecObject local) |
Возвращает значение в байтах размера файла local | |
String windowsGetShortName(FileSpecObject local) |
Только для Microsoft Windows, возвращает 8.3-имя файла, в противном случае возвращает null |
|
Number windowsRegisterServer(FileSpecObject local) |
+ | Только для Microsoft Windows - регистрирует файл local как сервер |
Number windowsShortcut(FileSpecObject local, FileSpecObject target, String linkname, FileSpecObject dir, String params, FileSpecObject icondb, Number index) |
+ | Только для Microsoft Windows - создает ссылку на файл local в директории target. Дает ей имя linkname с расширением .lnk. Делает |
String windowsVersion(FileSpecObject local) |
Возвращает информацию для Microsoft Windows о версии файла local, или возвращает null |
Объект WinProfile, созданные с помощью метода Install.getWinProfile(), может выполнять операции с характерным для
Microsoft Windows файлом .INI, например,C:\WINDOWS\
String getString(String section, String key) String writeString(String section, String key, String value)
Поскольку файл .INI имеет расширенный ASCII формат, в него нельзя записывать информацию в юникоде.
Объект WinReg, созданный с помощью метода Install.GetWinRegistry(), дает доступ к регистру Windows. Операции с
регистром выполняются незамедлительно, они не откладываются.
Объект WinReg содержит текущий корневой ключ регистра.
По-умолчанию, это HKEY_CLASSES_ROOT.
Имена путей в регистре Windows разделены обратным слешем (\). В
скриптах JavaScript обратный слеш нужно писать дважды (\\), противном
случае он понимается как
Таблица 17.9 описывает объект
WinReg. Некоторые методы возвращают данные, но многие лишь код
статуса. Когда возвращается код статуса, null означает, что платформа
Mozilla не может корректно обработать изменения регистра. Обычно это
означает проблемы с аргументами метода. Если возвращается не null,
значение берется из реальной операции с регистром. Даже когда
возвращаемое значение - обычные данные, null означает неудачное
действие, в этом случае также, скорее всего, из-за проблем с
аргументами. Необходимо всегда проверять возвращаемое значение на null.
| Константа, свойство или метод | Использование |
|---|---|
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS |
Зарезервированные константы для хорошо известных корневых ключей |
Number createKey(String subkey, String name) |
Создает подключ subkey с именем класса name. Имя может быть строкой длины нуль. |
Number deleteKey(String subkey) |
Удаляет подключ subkey |
Number deleteValue(String subkey, String name) |
Удаляет пару атрибут-значение подключа name |
String enumKeys(String subkey, Number index) |
Возвращает подключ с номером index ключа subkey. Возвращает строку длины ноль, если ключ не существует |
String enumValueNames(String subkey, Number index) |
Возвращает имя атрибута с номером index ключа subkey |
Number getValueNumber(String subkey, String |
Возвращает DWORD-значение атрибута ключа subkey |
String getValueString(String subkey, String |
Возвращает строковое значение атрибута ключа subkey |
Number getValue(String subkey, String |
Возвращает DWORD-значение атрибута ключа subkey |
Boolean isKeyWritable(String subkey) |
Возвращает true, если есть права на запись ключа subkey |
Boolean keyExists(String subkey) |
Возвращает true, если ключ subkey существует |
void setRootKey(String key) |
Устанавливает корневой ключ в одно из перечисленных в первой строке таблицы значений. Возвращает null в случае неудачи |
Number setValueNumber(String subkey, String |
Устанавливает атрибут ключа subkey в значение . Возвращает null в случае неудачи |
Number setValueString(String subkey, String |
Устанавливает атрибут ключа subkey в значение str. Возвращает null в случае неудачи |
Boolean valueExists(String subkey, String |
Возвращает true, если ключ subkey имеет атрибут |
Система XPInstall не дает доступа к интерфейсам XPCOM из скрипта install.js.
Есть, однако, несколько компонентов и интерфейсов за пределами
XPInstall, которые дублируют функциональность XPCOM. Если необходима
собственная система
Данная XPCOM пара предоставляет доступ к регистру Mozilla, хотя она не завершена и не очень гибка:
@mozilla.org/registry;1 nsIRegistry
Этот интерфейс работает с различными файлами регистра, как если бы
они были одним файлом. Регистр также можно понимать как источник
данных
@mozilla.org/registry-viewer;1 nsIRDFDataSource
Другой интерфейс к регистру предоставляется так называемым
@mozilla.org/chrome/chrome-registry;1 nsIXULChromeRegistry;1
Для разработчиков на платформе Microsoft Windows представляют интерес следующие два интерфейса:
@mozilla.org/winhooks;1 nsIWindowsRegistry @mozilla.org/winhooks;1 nsIWindowsHooks
Эти интерфейсы предоставляют много возможностей по низкоуровневому доступу к Microsoft Windows.
Особняком от этих интерфейсов, работающих с регистрами, стоит много интерфейсов для работы с файлами и сетью, описанными в лекции 16, "Объекты XPCOM", в том числе интерфейсы для распаковывания архивов ZIP.
Несколько замечаний относительно собственно объектов XPInstall.
Объекты "на стороне Web", InstallTrigger и InstallVersion не имеют полезных интерфейсов XPIDL. Они,
однако, имеют , зарегистрированные в XPCOM, кроме самой
инфраструктуры XPInstall:
@mozilla.org/xpinstall/installtrigger;1 @mozilla.org/xpinstall/installversion;1 @mozilla.rg/xpinstall;1
Тем не менее использовать эти бессмысленно, поскольку
полезных интерфейсов все равно нет. Объекты, доступные в скриптовом
окружении install.js, также не представлены в XPCOM. В этом втором
случае нет даже и для этих объектов.
В данном разделе "Практика" мы должны упаковать уже работающее приложение Notetaker в XPI-файл и установить его, используя XPInstall. Теоретически, наше приложение должно действовать прямо с удаленного web-сервера, но смешивать локальный контент для приложения с оверлеями, расположенными на web-сервере, бессмысленно. На практике это может даже не работать. Так что займемся установкой приложения, загружаемого с удаленного сервера.
Хотя код приложения уже завершен, кое-что нужно добавить. Наша стратегия: связать все вместе в свете механизма, описанного в данной лекции:
Приступим.
Сначала подберем подходящее имя.
Текстовое имя. Выберем "NoteTaker Web Notes". Рекламу прибережем для web-странички, предлагающей приложение пользователю.
Имя приложения в регистре. Это "/Nigel McFarlane/NoteTaker". Если бы наше приложение взяли в главную ветку разработки браузера Mozilla, то имя могло бы быть просто "NoteTaker", что дополнялось бы строкой наподобие "/mozilla.org/Browser/". В этом случае полное имя могло бы быть "/mozilla.org/Browser/NoteTaker". Однако пока такого не случилось.
Номер версии. Нашему приложению не хватало тестирования в реальных условиях, но оно, вроде бы, работает. Назовем его версию 0.9. В полной нотации 0.9.0.0. Можно придумать еще множество усовершенствований и модификаций, но пусть они относятся к версии 1.0
Теперь общая подготовка распространяемого приложения, исходники, воздействие и требования.
Исходники. Все, что обсуждалось в этой книге, и есть основа данного
Воздействие. Воздействие приложения NoteTaker невелико. Это лишь
три вещи: иерархия папок в директории
Требования. Требования к данному программному обеспечению состоят
из нескольких частей. Из-за того, что мы недавно включили объекты
XPCOM (file-based
Это все требования со стороны логистики.
Мы включим файл README.txt для разработчиков, которые имеют дело с исходными текстами. Мы напишем его, основываясь на информации из последней рассмотренной темы.
Нам нужен файл contents.
Мы хотим показать простейший пример поддержки локалей. Для этого
нам нужно иметь файлы contents.
Нам нужно также дать простейший пример установки
Наконец, нам нужно обеспечить установку. Это задача для одного HTML-файла и двух скриптов. Утилита NoteTaker маленькая и целиком основана на платформе и приложении "классический браузер". Мы надеемся, что скрипты будут простые, а не сложные.
Поскольку файл HTML должен показываться любым браузером, ему лучше быть в высшей степени переносимым, наподобие того, что показан в листинге 17.4.
<html>
<head>
<script src="deploy.js"/>
<body>
<h1>NoteTaker Download</h1>
<p>The NoteTaker tool adds Web Notes to
your Mozilla-based Web browser. Web Notes are placed on
top of displayed Web pages. They hold information that you
record for your own purposes.
</p>
<p>Only the Classic Browser, version 1.4, is supported.
It is part of the established Mozilla Web application suite.
The standalone Mozilla Browser is not yet supported.
</p>
<p>Download here: <a href="notetaker.xpi"
onclick="download(event)">NoteTaker tool 0.9</a>
</p>
</body>
</html>
Функция следует наброску, сделанному в листинге 17.1.
В данном случае полный скрипт показан в листинге 17.5. Пуленепробиваемое
определение браузера - довольно тягостное дело, здесь мы ограничимся
лишь наиболее значимыми альтернативами.
function download(e) {
if ( ! deploy() )
alert("NoteTaker 0.9 requires Classic Mozilla 1.4");
e.preventDefault();
}
function is_moz_browser() {
return (
window.navigator
window.navigator.userAgent
window.navigator.userAgent.search(/^Mozilla\/5\.0/) != -1 );
}
function is_target() {
var agent = window.navigator.userAgent;
return (
agent.search(/rv:1\.4/) != -1 // matches
agent.search(/Phoenix/) == -1 // no match
agent.search(/Firebird/) == -1 // no match );
}
function is_app_version_ok() {
var it = window.InstallTrigger;
var result = it.compareVersion(
"Nigel McFarlane/NoteTaker", "0.9.0.0");
return ( result == it.NOT_FOUND ||
Math.abs(result) <= it.REL_DIFF );
}
function deploy() {
if ( !is_moz_browser() ) {
return false;
}
if ( !window.InstallTrigger.enabled() {
return false;
}
if ( !is_target() ) {
return false;
}
if ( !is_app_version_ok() } {
return false;
}
var xpi_container = {
"NoteTaker Web Notes" : "notetaker.xpi"
};
with (window.InstallTrigger)
install(xpi_container, null);
return true;
}
Здесь нам не требуются никакие параметры, так что эта часть скелета
скрипта из Листинга 17.1 не
используется. Если пользователь попробует установить NoteTaker не на
ту платформу или не на то приложение, мы ему пожалуемся. Здесь нет
обработчика событий для функции install(), поскольку мы ничего не
можем сделать, если ситуация зайдет в
Три функции проверок просты. Каждый браузер, чей userAgent
начинается с "Mozilla/5.0" может быть браузером mozilla.org.
Если userAgent содержит "is_app_version_ok() позволяет установить версию
0.9.1.0 поверх 0.9.0.0. Это даст некоторую гарантию защиты от
разработчика, считающего, что отступить назад в номере
Заключительная часть системы установки - скрипт install.js. Листинг 17.6 показывает основную часть этого скрипта, основанного на скрипте, приведенном в листинге 17.2
var TEXT_NAME = "NoteTaker Web Notes";
var REG_NAME = "/Nigel McFarlane/NoteTaker";
var VERSION = "0.9.0.0";
var rv = SUCCESS;
function prepare() {
initInstall(TEXT_NAME, REG_NAME, VERSION);
if ( schedule_files() != SUCCESS ) return getLastError();
if ( register_chrome() != SUCCESS) return getLastError();
return SUCCESS;
}
rv = prepare();
if (rv == SUCCESS) { performInstall();
} else {
alert("Installation failed. (Error = " + rv + ")" );
cancelInstall(rv);
}
Так же, как и в случае
Чтобы выполнить эти шаги, нам нужно знать содержание XPI. Заглянем вперед, в раздел "Финальный комплект", и увидим, что содержимое XPI:
install.js notetaker.jar extras/README.txt extras/notetaker.rdf
Собственно приложение располагается в архиве notetaker.
Листинг 17.7 показывает две
функции, отсутствующие в листинге 17.6. Они выполняют необходимые
манипуляции с файлами XPI и регистром
function schedule_files() {
addFile(TEXT_NAME, VERSION, "notetaker.jar",
getFolder("Chrome"), "notetaker.jar", true);
addFile(TEXT_NAME, VERSION, "extras/notetaker.rdf",
getFolder("Profile"), "notetaker.rdf", true);
return SUCCESS;
}
function register_chrome() {
var jar_root = getFolder("Chrome", "notetaker.jar");
registerChrome(PACKAGE | DELAYED_CHROME,
jar_root, "content/notetaker/");
registerChrome(SKIN | DELAYED_CHROME,
jar_root, "skin/modern/notetaker/");
registerChrome(LOCALE | DELAYED_CHROME,
jar_root, "locale/en-US/notetaker/");
return SUCCESS;
}
Вызов второй функции addFile() показывает, как можно сравнить путь
к любому файлу в файле XPI с любым путем локальной файловой системы.
Вызов getFolder() в функции register_chrome() показывает, как корень
иерархии папок в файле schedule_files(), и register_chrome() выполняются без обращения к
файлу notetaker.xpi. Их вызовы addFile() и registerChrome()
выполняются позже, когда стартует функция performInstall().
Это все, что есть в скрипте install.js
Теперь мы получили или создали все необходимые нам файлы, и можем, наконец, собрать финальный XPI файл. Он должен содержать как минимум файл install.js (поскольку наше приложение - нечто большее, чем просто скин или локаль), так что начнем с создания zip-архива, содержащего этот файл.
Главным содержанием файла XPI являются коды нашей утилиты
NoteTaker. Аккуратный и эффективный способ все организовать - завести
единственный архив
На протяжении книги мы строили утилиту NoteTaker как набор
отдельных файлов и
Пакет в
notetaker/content <---> content/notetaker notetaker/locale/en-US <---> locale/en-US/notetaker notetaker/skin/modern <---> skin/moder/notetaker
Единственное решение - сделать копию исходных файлов из
Вторая трудность с
На Рисунке 17.9 показан
Теперь у нас есть два файла для финального XPI: install.js и
notetaker.
Больше ничего не требуется, кроме как разместить нашу HTML-страничку со ссылкой на файл XPI на web-сайте. На этом мы завершаем пример разработки утилиты NoteTaker.

(рис 17.10) Архив JAR, содержащий пакет NoteTaker.(рис 17.9) Архив XPI, содержащий полный дистрибутив NoteTaker.
Метод logComment() объекта Install является единственным способом
получить alert(). Сообщения записываются в файл install.log,
который сохраняется в корневую область платформы.
Обычный источник проблем при инсталляции - несоответствие иерархии путей в файле XPI и локальной файловой системе. Если они указаны неверно, или не соответствуют друг другу, на данном этапе установки не может быть скопирован ни один файл. Это может быть легко установлено исследованием лог-файла.
Если ничего не происходит (или происходит, но не то), хорошая
стратегия отладки - упростить процесс установки. Уберите цифровую
подпись, затем участки кода, ответственные за проверку версий. Начните
с файла XPI, чье содержание всего лишь должно быть скопировано в
Если в приложении есть оверлеи, важно следить, чтобы не была
повреждена база данных оверлеев. Если какой-либо из оверлеев имеет
Мы вообще рекомендуем тестировать установку приложения не на той платформе, которая используется для ежедневной работы, а на специальной копии. Эта отдельная платформа может быть "Зоной Краха", предназначенной для экспериментов. На платформе Microsoft Windows лучше даже завести специальный компьютер, поскольку есть лишь одна Mozilla и регистр Windows на хост. Если очень постараться, из скриптов XPInstall можно повредить и сам регистр Windows.
Подсистема Mozilla XPInstall многолика и может использоваться по- разному. Прикладные программисты, которые не хотят изучать процесс компиляции самой системы, видят лишь некоторые ее стороны.
Наиболее привлекательной из технологий XPInstall является
удаленная установка. Это действительно удобный механизм
Программист приложения может постепенно переходить на рельсы пользовательской установки, или системной установки, по мере того, как его приложение становится более зрелым и набирает пользовательскую базу. Система XPCOM предоставляет достаточно возможностей, чтобы можно было, если потребуется, создать на основе платформы собственную инсталляционную систему. Единственная часть платформы, которую трудно воспроизвести без C/C++ кода - это часть родного инсталлятора, ответственная за самое начало запуска платформы.
Завершением рассмотрения XPInstall заканчивается наша книга о технологиях Mozilla. Сегодня платформа Mozilla - это развитая и богатая возможностями среда разработки приложений. Это очень заметный и очень важный Open Source проект, и его будущее поистине блестяще.
Удачи вам в работе с Mozilla!
В этой лекции рассказывается о том, как распространить свое
приложение с web-сайта по всему миру. Этим занимается система
XPInstall (
Большинство приложений Mozilla создаются для использования. Перед тем, как применять их, нужно инсталлировать эти приложения на свой компьютер. Инсталляция - часть общей проблемы распространения. Mozilla поддерживает несколько стратегий распространения. В данной лекции все эти стратегии описаны, но мы сосредоточим внимание на автоматическом распространении приложения с некоторого URL, обслуживаемого обычным web-сервером.
Распространение ПО с удаленного сервера - заманчивая идея еще со
времен первых Java-
Mozilla имеет переносимую инсталляционную систему, которая
называется XPInstall. В инструменте вне самой Mozilla, наподобие
InstallShield или
Создание системы распространения - это не просто связывание между собой нескольких окошек в мастере установки. Система распространения предназначена для выполнения реальной работы. Если она организована хорошо, весь мир сможет использовать ваше приложение, не беспокоя вас попусту. Если же в ней есть недочеты, приложение попросту канет в лету, не оставив следа.
Распространение основывается на основной идее комплекта (пакета,
На другой стороне процесса - инсталляция. В этой лекции под словом "инсталляция" мы понимаем копирование части комплекта на локальный компьютер. Можно сделать комплект для приложения таким, что он будет устанавливаться на любую из поддерживаемых Mozilla операционных систем. Поскольку каждая ОС имеет свои особенности, процесс инсталляции вынужден в них довольно глубоко закапываться. Тем не менее, 90% подготовки комплекта можно сделать переносимым способом.
В случае инсталляции из удаленного источника, XPInstall получает
файлы так же, как
Для создания готовых к распространению приложений знакомство с исходным кодом платформы не требуется, но если мы выбираем сложную стратегию распространения, доступ к работающему сборочному окружению платформы становится более важен.
На диаграмме в начале лекции показано, какое влияние имеет XPInstall
на платформу Mozilla. Здесь видно, что XPInstall может изменять любые
критичные для работающей платформы файлы. По сути дела, вся диаграмма
может быть подсвечена, поскольку XPInstall может подменить даже
динамически линкуемые библиотеки, другими словами, все, что угодно.
Такие обширные замены, однако, редки. Две вещи на диаграмме совсем не
указаны - инсталлируемые файлы и собственно XPInstall. Файлы
приложения, такие как XUL, CSS,
XPInstall и предоставляет, и использует знакомые нам технологии. Процесс распространения контролируется JavaScript, и есть специальные объекты, этому способствующие. XPInstall предоставляет пользователю последовательность интерактивных окон. Это делается несколькими специальными XUL-тегами.
Мы начнем эту лекцию с описания вариантов установки приложения. Затем опишем процесс удаленной установки и закончим реальным примером используемых технологий.
Любая возможность, которую только можно вообразить, доступна при инсталляции приложений Mozilla. Возможности, рассматриваемые здесь, это: вовсе обойтись без инсталляции, установка вручную, комбинированная установка (piggy-back), собственно установка платформы, - и установка со своим личным инсталлятором. Удаленная установка, главная тема данной лекции, подробно обсуждается отдельно.
Простейший способ получить доступ к приложению Mozilla - ничего не
инсталлировать вовсе. В этом случае пользователь имеет платформу на
локальном компьютере. Приложение грузится из web как серия файлов XUL
и всего, что им нужно, то есть оверлеев, стилевых таблиц и скриптов.
Чтобы получить документ XUL с web-сайта, просто удостоверьтесь, что
тип
application/vnd.mozilla.xul+xml
Если этому не воспрепятствует система безопасности на локальном
компьютере, подобное приложение получит такие же права доступа к
локальному компьютеру, как и любое иное приложение, установленное в
Web штука все еще медленная, так что необходимо обратить внимание
на производительность. Документы XUL, стилевые таблицы и скрипты
кешируются в браузере, так что если в
jar:{url}!{path}
Где {url} - адрес архива {path} - положение данного файла в
нем. Если файл
jar:resource:/chrome/example.jar!test/sample.xul
Как уже говорилось в лекции 12, "Оверлеи и resource:URL указывает в корень платформы, а обычно
привязана к resource:URLs.
Если используется - или некоторый
параметр, специфичный для данного приложения (как -jsconsole ), то
стартовавшее приложение XUL может ничем не напоминать браузер вообще.
Такие приложения полностью выглядят как локальные.
Если же вернуться к процессу инсталляции, то имеются следующие возможности.
Если необходима локальная инсталляция, самый простой путь - установить приложение вручную. Для этого нам потребуются доступ к локальной файловой системе и к командной строке.
Для инсталляции приложения вручную есть немало оснований. Для
разработчика это способ тестирования. Для системного администратора -
средство проследить за тем, что происходит в системе при работе
автоматизированных инструментов. Для системного
Существуют разные типы установки вручную: установка собственно
платформы, установка компонентов, приложений и установка системы
Установка компонентов вручную добавляет новые компоненты и интерфейсы XPCOM к уже установленной платформе. Эти компоненты становятся доступны всем установленным приложениям. Чтобы инсталлировать новые компоненты и интерфейсы, необходимо:
Исходный код Mozilla содержит пример компонента nsSample и
интерфейса nsISample, посмотрите исходный код в директории
xpcom/
Установка приложения вручную добавляет новые XUL-файлы в
Строки, добавляемые в installed-
skin,install,url,{url}/
locale,install,url,{url}/
content,install,url,{url}/
где {url} должен указывать на локальную директорию и обычно имеет
форму : или resource:. Схема resource:
указывает на корень платформы Mozilla - родительскую директорию директории en-US ; URL modern.
Безопасное инсталлирование может требоваться для приложений вне
Чтобы создать эти файлы, начните с создания нового пользовательского профиля, с помощью менеджера профилей Mozilla. Скопируйте все файлы профиля, чтобы сохранить оригинал. Затем следует инсталлировать приложение куда нужно. Запустите приложение, используя новый профиль, и не выполняя никаких особенных настроек или других изменений. Каждый раз, когда платформа будет спрашивать о правах на некоторое действие (например, о доступе к файлу с цифровой подписью или форме ввода), дайте такое разрешение. Каждый раз, когда она попросит разрешения запомнить данное решение, соглашайтесь. Пройдя через все аспекты безопасности, закройте приложение и скопируйте все изменившиеся в профиле файлы - сравните их с оригиналом. Это как раз те файлы, которые нужно установить вручную на каждую машину, где будет работать данное приложение. Другой способ - скопировать их в профиль по умолчанию.
И комбинированная (piggy-back), и собственно родная установка платформы требуют использования и модификации сборочного окружения Mozilla. Сборочное окружение здесь не рассматривается, но несколько замечаний все же стоит сделать.
Комбинированная установка - это просто установка платформы Mozilla, модифицированной так, чтобы включить добавочное приложение. Такая дистрибуция имеет два преимущества: она содержит стандартную версию платформы (и стандартных приложений) и встраивает все необходимые задачи в знакомую последовательность действий. Когда модифицированная платформа установлена, добавочное приложение автоматически становится доступно.
Чтобы выполнить эту работу, нужно изменить сборочное окружение Mozilla. К счастью, некоторые такие системы управляются своими же данными, которые можно посмотреть. Можно начать, посмотрев файлы примеров в директории xpinstall/packager. Необходимо внести, по крайней мере, три изменения:
Если первые шаги выполнены корректно, скомпилированный результат даст модифицированную инсталляцию, но нужно сделать одно предупреждение. Дело в том, что процесс сборки имеет множество тонких мест, поэтому при внесении изменений могут возникать проблемы. Скорее всего, потребуется потратить немало времени на изучение системы, прежде чем все заработает гладко.
Собственно инсталляция системы затрагивает самую сердцевину подсистемы XPInstall. Это небольшая часть платформо-зависимого кода. Он не использует XPCOM или иных возможностей Mozilla; это независимая программа, самостоятельно поддерживающая TCP/IP, FTP и HTTP. Чтобы с ней разобраться, требуется поближе познакомиться с исходным кодом Mozilla. Это можно сделать тремя способами:
При инсталляции полной системы, код XPInstall - часть большого архива, содержащего всю платформу и ее приложения. В Microsoft Windows это самораспаковывающийся архив.
При установке так называемой заглушки, распространяемый файл -
маленький (заглушка,
При установке приложения код XPInstall используется как специальный
инсталлятор конкретного приложения, независимый от основной платформы.
При таком использовании XPInstall ведет себя очень похоже на
InstallShield или
Код XPInstall сам имеет некоторые переносимые между платформами
части. Он содержит интерпретатор JavaScript, XUL-подобный код
Удаленная установка, подробно рассматриваемая в данной лекции, также использует инфраструктуру полной установки. Данная инфраструктура доступна не только в инсталляционном бинарнике, но и просто из запущенной платформы Mozilla. В объектной модели браузера есть некий хук, которому передается файл-комплект XPI, в результате чего начинается его установка.
И, наконец, сами приложения не могут вовсе игнорировать систему
XPInstall. Это нестандартная (custom) установка. Технологии XUL и
XPCOM обладают достаточными возможностями, чтобы установить приложения
из
Вообще, удаленная установка - это метод распространения информации,
подобный издательской модели традиционных
Чтобы приложение установилось удаленно, должно произойти несколько событий. Программист приложения, в роли выпускающего инженера, должен написать два скрипта. Конечный пользователь должен согласиться установить приложение. Платформа должна сработать согласно инструкциям.
Удаленная установка основана на использовании URL. Система
удаленной установки Mozilla может задействовать схему "file:" так же легко, как и схему "http:". Таким
образом, все сделанные здесь замечания относятся и к локальной
установке.
Здесь мы опишем задачи, которые должен выполнить программист, чтобы приложение могло быть установлено пользователем по сети. Система установки может разрабатываться одновременно с другими задачами, стоящими перед разработчиком.
Первый шаг - присвоить приложению необходимые имена. Для работы XPInstall требуется несколько имен.
Эти имена включают: текстовое имя (описание),
Текстовое имя - это юникодная строка, появляющаяся в диалоговом окне, которое система XPInstall показывает пользователю. Поскольку это юникод, он может содержать среди прочих и символы $$\copyright$$, $$\text{\textregistered}$$ или TM. XPInstall показывает эту строку латиницей, слева направо, что может являться ограничением для некоторых языков. Вот пример текстового имени:
Frederick's Amazing Shopping Spree System, Gold Version
fredshop
Имя приложения в регистре - это имя, используемое Mozilla для
управления приложением на
/Application Publisher/short-name/subproduct
Application subproduct опциональна и используется, когда
приложение - часть набора утилит, каждая из которых является
фрагментом большого приложения. Пример из Mozilla:
/mozilla.org/Mozilla/JavaScript Debugger/Venkman Chrome
Данный пример показывает, что подраздел может в свою очередь
ветвиться. Venkman
Если слеша "/" в имени регистра нет, оставшаяся часть рассматривается как подпуть и к ней будет добавлен префикс /mozilla.org/Mozilla/.
Фактически, имя приложения в регистре может быть любым путем, части
которого разделены прямым слешем; у первой из последовательности
частей нет явно определяемого значения. Это имя не должно
соответствовать имени директории; это просто иерархический ключ в
стиле ключей Windows
/Fred's Pyramid Company/Amazing Shopping Spree System/ Gold Version
Версии приложений Mozilla имеют фиксированный формат; это номер,
состоящий из четырех частей. Это четыре 32-битных целых, или строка
целых, разделенных точками. Эта строка должна легко конвертироваться в
четыре целых числа, она не должна содержать слова "
"{major}.{minor}.{revision}.{build}"
Главное число (major number) получает значение 0 и может изменяться, если дизайн приложения значительно изменится.
Подчиненное число также получает значение 0 и его увеличение отражает появление в приложении новых свойств. Приложения с меньшим подчиненным числом должны взаимодействовать с данной версией.
"Ревизия" также начинается с 0 и обычно увеличивается при
исправлениях ошибок и простейших изменениях. За исключением этих
исправлений, все более ранние ревизии должны вести себя идентично
данной. "
"1.0.2.20021018"
Существует несколько необязательных конвенций, связанных с этими номерами. Вот некоторые их них:
Номер
Ядро Linux и некоторые другие продукты используют четные
подчиненные (minor) числа для обозначения стабильных
Если главное число равно нулю, приложение считается экспериментальным. Не ожидайте от него, что оно сможет работать с предыдущими версиями, и неважно, каким было подчиненное число версии. Всякая совместимость в этом случае должна рассматриваться лишь как случайное совпадение.
Назвать приложение несложно. Сложнее это приложение правильно организовать. В интересах самого разработчика удостовериться, что когда пользователь устанавливает приложение, он имеет достаточно опыта для этого. Потому что когда пользователь решает поставить приложение, он тем самым выражает доверие тому сайту в сети, которое это приложение распространяет. Это доверие еще нужно заслужить, иначе единственным результатом будет лишь плохая репутация.
Итак, второй шаг в подготовке распространения приложения по сети -
общая подготовка выпуска приложения (a release
Исходники - самое начало создания распространяемого xpi-комплекта.
Это может быть просто собрание всех исходных файлов на
неперезаписываемом CD-R. Или это может быть
Для простых приложений следует просто сделать резервную копию перед
каждым
Воздействие (
Примерами обычных элементов воздействия могут быть регистр Windows,
иконки на рабочем столе,
Если установочный XPI-комплект затрагивает области вне установочной зоны платформы, не следует автоматически все сваливать под C:\Program Files (Windows) или /usr (UNIX). Это нарушит работу тех IT- специалистов, которые отвечают за конфигурирование и управление системой. Удостоверьтесь, что ваше приложение установит все в одну- единственную папку с именем, выбранным пользователем. Никогда не следует устанавливать файлы в /etc или C:\Windows или C:\Winnt, если есть способ этого избежать.
Для простых приложений воздействие не должно простираться дальше
директории
Наконец, требования - это описание компьютерной системы, для которой приложение предназначено. Эти требования включают описание "железа", операционной системы, уже существующих приложений, специфических файлов и конфигураций, требуемого дискового пространства - всего, что необходимо. Описание требований - основа файла README, который пользователь должен получить. Его используют также для определения списка тех проверок, которые должен выполнить инсталляционный скрипт.
Для простых
Чтобы автоматизировать распространение приложения, необходимо написать два скрипта.
Первый скрипт выполняется на обычной web-странице или документе XUL. Для его написания не нужно заботиться о вопросах, связанных с безопасностью. Он выполняется, только если страница или приложение просматривается с помощью технологий самой Mozilla. Остаток страницы приглашает пользователя установить приложение. Второй скрипт, называющийся install.js, выполняется внутри системы XPInstall, где он изолирован и от web, и от XPCOM.
Оба скрипта используют JavaScript-объекты хоста. Объекты, упоминаемые в данной лекции, описываются подробно в разделе "Технологии установки".
Первый скрипт называется "window.InstallTrigger и InstallVersion, который также
доступен как window.InstallVersion.
Объект InstallTrigger содержит диагностические методы, а также
метод install(), который начинает загрузку файлов XPI и, вероятно,
вызывает одну или более копий второго скрипта, install.js.
Диагностические методы используются для базовой проверки номеров
версий и для проверки того, что система XPInstall имеется в наличии и
доступна.
Объект InstallVersion существует для удобства работы, он может
сравнить два номера версий приложения и определить, какой из них
больше и какие именно из четырех частей номера версии отличаются и
чем.
Третий объект, который программист приложения должен создать, имеет следующую форму:
var xpi_container = {
"Test app part 1" : "URL1",
"Test app part 2" : "URL2",
...
}
Этот объект представляет все файлы XPI, которые в совокупности
образуют приложение и передаются методу InstallTrigger.install().
Объект в приведенном примере содержит два свойства, и, таким образом,
представляет два файла. Возможно любое число свойств, большее нуля.
Поскольку оба имени обоих свойств есть просто строки, они могут быть
доступны только как элементы массива:
var url = xpi_container["Test app part 1"];
Каждое имя свойства - текстовое имя компонента приложения, и
пользователь будет это имя видеть. Каждое значение свойства - это
(относительный или абсолютный) URL, который должен соответствовать
файлу XPI. URL может иметь дополнительную строку параметров. Строка
параметров начинается со знака вопроса, "?", это тот же
формат, что и в
/downloads/apps/mozilla/shopcart/main.xpi?java=yes;flash=no
Это относительный URL, так что Mozilla добавит http: и имя домена.
В данном примере java и flash. Подстрока параметров передается второму
скрипту install.js без дополнительной обработки.
Все эти объекты передаются в функцию, которая обычно вызывается
обработчиком onclick, привязанным к линку или кнопке.
В Листинге 17.1 приведен пример скелета такой функции, демонстрирующий большинство возможностей, которые она может включать.
function deploy() {
if ( !is_moz_browser() ) { return false; }
if ( !window.InstallTrigger.enabled() { return false; }
if ( !is_target() ) { return false; }
if ( !is_app_version_ok() } { return false; }
var error_flag = false;
function error_handler(url, err) {
error_flag = true;
};
calculate_params();
var xpi_container = { ... };
with (window.InstallTrigger)
install(xpi_container, error_handler);
return !error_flag;
}
Большинство функций, использованных в скрипте, нужно написать для
каждого приложения. Начальная серия проверок остановит процесс
установки, если что-то не так с компьютером пользователя или уже
установленными приложениями. Функция error_handler() может быть
настолько сложной, насколько это необходимо в каждом конкретном
случае. Функция calculate_params() подготавливает те параметры,
которые будут переданы второму скрипту. Эта информация используется
при создании объекта xpi_container. Наконец, вызывается функция install(), реально выполняющая всю работу. Конечно, ничего не
произойдет, если отключен JavaScript, или свойство xpinstall.enabled
имеет значение false.
Протестировать пользовательский компьютер на предмет соответствия
условиям установки - достойная задача. Браузер ограничен в своих
возможностях из соображений безопасности, а система XPInstall не
имеет доступа к стандартным компонентам XPCOM. Тестирование должно
опираться на обе эти части. Если требуется сложное тестирование,
напишите специальное приложение для этой цели и попросите пользователя
вначале установить его. Затем это приложение может быть использовано в
Второй необходимый скрипт всегда называется install.js. Каждый
архив XPI должен содержать такой скрипт. Он отвечает за размещение
каждого файла в архиве. Копирование файлов не выполняется самим
скриптом. Вместо этого скрипт снабжает систему XPInstall набором
инструкций по размещению файлов. Когда все инструкции получены,
XPInstall приступает к копированию. XPInstall выполняет инструкции,
обрабатывает возникающие ошибки и ведет
Окружение, в котором работает скрипт install.js, существенно ограничивает его возможности. Он работает в контексте отдельного интерпретатора JavaScript и имеет собственный глобальный объект, который не является объектом HTML или XUL окна. Есть всего несколько объектов, с которыми этот скрипт может работать. Вот эти объекты:
Install InstallVersion File FileSpecObject WinProfile WinReg
Объект Install - глобальный, поэтому его методы доступны
непосредственно, как если бы они были функциями. Это центральный
объект, имеющий набор методов, с помощью которых можно создавать
объекты других типов.
Объект Install имеет полезные свойства. Свойство означает
операционную систему. Свойство url содержит полный XPI URL.
Объект Install также имеет полезные методы: initInstall(),
инициирующий XPInstall, чтобы тот был готов получить инструкции; cancelInstall(), который полностью останавливает работу; performInstall(), выполняющий инсталляцию согласно полученным
инструкциям; и , удаляющий приложение. Он также имеет
полезные диагностические методы.
Объекты File и FileSpecObject не имеют никакого отношения к
файловым объектам XPCOM - это независимая реализация похожих функций.
Их можно использовать для работы с файлами в любом месте локального
компьютера. Доступны некоторые специальные имена, чтобы это можно было
делать на разных платформах. Объект File может выполнять также
некоторые тесты и другие вспомогательные задачи.
Объекты WinProfile и WinReg специфичны для Microsoft Windows. WinProfile обеспечивает доступ на чтение и запись к конфигурационным
.INI файлам, а WinReg - к Windows
В зависимости от своего содержания скрипт install.js может
потребовать, чтобы платформа была перезагружена; также может
понадобиться, чтобы платформа перечитала содержание
var TEXT_NAME = "Test Application Release 3.2";
var REG_NAME = "/Test Company/Test Application";
var VERSION = "3.2.0.1999";
var params;
var rv = SUCCESS;
function prepare() {
if ( !(params = parse_args())) return INVALID_ARGUMENTS;
if ( is_target() != SUCCESS ) return getLastError();
initInstall(TEXT_NAME, REG_NAME, VERSION); /*
-- as many functions like this as required -- */
if ( schedule_folders()!= SUCCESS) return getLastError();
if ( schedule_files() != SUCCESS ) return getLastError();
if ( modify_os() != SUCCESS ) return getLastError();
if ( run_any_programs() != SUCCESS)return getLastError();
if ( register_chrome() != SUCCESS) return getLastError();
return SUCCESS;
}
rv = prepare();
(rv == SUCCESS) ? performInstall() : cancelInstall(rv);
Этот скрипт полагается на сообщения об ошибках, которые
вырабатывает и возвращает объект Install, если что-то идет
неправильно. Первый шаг - удостовериться, что аргументы, переданные
initInstall() готовит XPInstall к получению инструкций по установке.
Каждая из последующих функций выполняет часть работы по подготовке
установки. Наконец, если все идет хорошо, метод performInstall()
выполняет все требуемые действия разом. Не показан процесс сохранения
информации о процессе установки с помощью метода logComment(), и
сообщения о процессе выполнения, посылаемые пользователю с помощью
методов alert() или . Метод prompt()
как метод здесь недоступен.
Простейшая версия этого скрипта, полезная для целей тестирования, приведена в листинге 17.3.
var TEXT_NAME = "Test Application Release 3.2";
var REG_NAME = "/Test Company/Test Application";
var VERSION = "3.2.0.1999";
var rv = SUCCESS;
function schedule_folders() {
var tree = getFolder("Chrome"); // Special keyword
setPackageFolder(tree);
addDirectory("chrome"); // topmost directory
}
function prepare() {
initInstall(TEXT_NAME, REG_NAME, VERSION);
if ( schedule_folders()!= SUCCESS) return getLastError();
return SUCCESS;
}
rv = prepare();
(rv == SUCCESS) ? performInstall() : cancelInstall(rv);
В этом примере функция обрезана до простейшего состояния
и содержит лишь функцию schedule_folders(). Эта функция реализует
критически важный шаг сравнения иерархии директорий в файле XPI и
локальной файловой системы.
Этот процесс имеет следующую механику. Специальное слово
В Листинге 17.3 все фалы в
комплекте XPI (кроме install.js) имеют в качестве корневой директории
директорию с именем addDirectory() заменит ее на то, что нужно в данном конкретном
случае.
Если файл XPI имеет в качестве "затычки" слово
"
chrome/content/TestApp/TestApp.xul chrome/locale/en-US/TestApp/master.dtd chrome/skin/classic/TestApp/global.css
Папки в файловой системе сравниваются с папками в комплекте XPI, и этот процесс может повторяться несколько раз в процессе установки. Комплект XPI может иметь несколько деревьев файлов с разными корневыми директориями. Например, если XPI имеет три дерева файлов, каждому дереву ищется соответствующее ему место в локальной файловой системе. Файл XPI может содержать
install.js subtree1/file1 subtree1/file2 subtree2/file3 subtree2/file4 subtree3/file5 subtree3/file6
Каждое
Наконец, если приложение должно быть удалено, может быть
использован метод между initInstall()
и performInstall(). Он удалит приложение,
основываясь на информации об истории установки, хранящейся в регистре
Mozilla.
Файл XPI имеет формат обычного ZIP-файла. Используйте WinZip,
Есть одно требование к содержанию данного файла: он должен содержать в своем корне файл install.js. Обычной практикой является то, что все остальное в этом файле соответствует структуре директорий в зоне установки платформы. Если структура директорий файла XPI не соответствует реальной файловой структуре, скрипт install.js будет посложнее.
Можно создать
На рисунке 17.1 показано содержание комплекта XPI Chatzilla -
клиента быстрой связи (
(рис 17.1) Файл XPI приложения Chatzilla для Microsoft Windows.Корневая директория, в данном случае называемая bin, собирает все
необходимые файлы вместе, в одно
Данный компонент добавляет платформе с установленной Chatzilla
новые свойства: опцию командной строки ( - ) и ).
Если файл XPI реализует только скин или локаль, скриптинг может
быть укорочен. В этом случае не требуется скрипт install.js. В
install() вызывается installChrome(). Поскольку
установка
В этом случае файлы, содержащиеся в файле XPI, просто копируются в
директорию
Если файл XPI распространяется web-сервером, он имеет тип
application/x-xpinstall
В этом случае система XPInstall обрабатывает этот файл автоматически. В таком случае нет необходимости в скрипте, привязанном к обработчику события в коде приложения. Любой скрипт install.js из файла XPI будет запущен автоматически.
Программист приложения может вообще избежать использования системы XPInstall. Теги XUL, описываемые в разделе "Технологии установки" позволяют легко создавать диалоговые окна, которые ведут себя как мастер установки.
Пользователь выбирает, откуда установить приложение. На следующей серии рисунков отображен процесс установки с точки зрения пользователя. Первое в этой цепочке - документ, еще не являющийся частью устанавливаемого приложения, см. рисунок 17.2.
Это HTML-страница, но это мог бы быть и XUL-документ. В таком
случае

(рис 17.3) Шаг первый удаленной установки: HTML-страница.(рис 17.2) Шаг второй удаленной установки: список комплектов.Этот диалог сообщает пользователю, что, собственно, устанавливается. Если пользователь выберет Cancel, процесс будет остановлен. Если пользователь соглашается, установка начинается и может идти до конца, не предоставляя пользователю новой возможности прекратить процесс. На следующем шаге пользователь видит индикатор прогресса, см. рисунок 17.4.
(рис 17.4) Шаг третий удаленной установки: комплекты XPI загружаются.Перечисленные комплекты загружаются по очереди. Файл install.js, который содержится в каждом комплекте, начинает выполняться сразу после окончания загрузки. Если скрипт не содержит специального кода, он выполняет свою работу без вмешательства пользователя. Если в нем содержатся подсказки или вопросы пользователя, они выглядят как обычные приглашения JavaScript, как показано на рисунке 17.5
Результатом выполнения скрипта install.js может быть либо прерванная, либо неудавшаяся загрузка, либо полная установка XPI-комплекта. Затем пользователь видит сообщение об итогах процесса, см. рисунок 17.6.
Если процесс установки требует, чтобы приложение после установки было запущено заново, пользователь также получит сообщение об этом.

(рис 17.6) Шаг четвертый удаленной установки: необязательное взаимодействие с пользователем.(рис 17.5) Шаг пятый удаленной установки: результаты.
Во время удаленной установки платформа управляет всем процессом, получая инструкции из скрипта install.js, выполняет все указанные действия, и сохраняет записи о них. Выполняются следующие шаги:
InstallTrigger.install() или InstallTrigger.installChrome(). Она порождает окна, которые видит пользователь, и управляет ими.registerChrome().Таков в целом процесс удаленной установки. Проверка соответствия версий ложится на плечи прикладного программиста, т.е. на код в на файле install.js.
Иногда система XPInstall задействует оставшуюся часть платформы для выполнения своей работы. Например, использует диалоговое окно предупреждения. Если это необходимо, скрипт, выполняющий свою работу где-то в другом месте платформы, будет блокирован до тех пор, пока XPInstall не закончит работу с внешним ресурсом. Обычно каждая подобная блокировка кратковременна и не имеет заметных последствий.
В оставшейся части лекции описываются технологии, используемые при удаленной установке.
Платформа использует несколько различных типов файлов данных. Есть
три главных типа этих файлов, и каждый из них имеет свой формат. Это
регистры,
Регистры - это файлы, доступные для чтения/записи, которые система использует как простую базу данных. Информация об имени приложения, версии и конфигурациях сохраняется в регистрах.
--enable-debug.
Форматы, используемые этими файлами, включают формат регистров
Mozilla (он описывается ниже) формат файлов Microsoft Windows .ini,
Регистр Mozilla - файл, по формату напоминающий регистр Microsoft Windows. К нему практически нет доступа, но взглянуть на его устройство полезно, это позволит лучше понять некоторые особенности Mozilla.
Регистр состоит из иерархии ключей, каждый из которых может иметь
несколько пар атрибут-значение. Ключи могут быть поименованы
иерархически, что по сути является путем к ключу. В корне иерархии
ключ "/" и несколько специальных имен, указывающих на важные
разделы иерархии. Это эквиваленты именам HKEY_ в Microsoft. Mozilla
использует юникодные
В отличие от регистра Windows, Mozilla использует прямые слеши (/)
в качестве разделителей в
| Тип файла | Имена файлов, использующие этот тип | Использование |
|---|---|---|
| Mozilla |
mozver. |
Регистр платформы, имена и версии приложений, информация, необходимая для удаления приложения, информация о |
| Microsoft Windows.ini | pluginreg. |
|
| manifest.ini, master.ini, talkback.ini | Конфигурационные файлы | |
| XML |
||
| Line-formatted |
installed- |
|
| Free format text | install.log, install_status.log |
Все регистры Mozilla имеют одинаковую структуру верхних уровней. Все регистры состоят из корня (а именно /) и четырех дочерних директорий:
"/Users/" "/Common/" "/Version Registry/" "/Private Arenas/"
Если при компиляции платформы указан специальный ключ, появляется пятая директория: "/Current User/". В стандартной системе она не присутствует. Ключ, хранимый в одном из четырех путей, может выглядеть, например, так:
"/Version Registry/mozilla.org/Mozilla/XPCom/bin"
Этот ключ не случайно выглядит как имя приложения в регистре -
строка после "/Version
Регистр Mozilla - хранилище информации для старта платформы. После того, как платформа стартует, она считывает информацию из регистра. Наиболее смущающий аспект в системе регистров - то, что их несколько, и каждый содержит только часть необходимой информации. Таблица 17.2 разъясняет этот момент.
"Регистр
Регистр Mozilla недоступен из скрипта install.js, если только не вызывается дополнительный выполняемый файл. К нему можно получить доступ из обычного приложения с помощью следующей пары XPCOM:
@mozilla.org/registry;1 nsIRegistry
Этот интерфейс предоставляет методы для чтения и записи, которые
можно использовать для передвижения по дереву ключей регистра.
Интерфейс не имеет очевидного способа прочитать (nsRegistryKey "магическое"
значение 32 (
| Имя | Однопользовательская ОС | Многопользовательская ОС | Файлы | Ключи | Использование |
|---|---|---|---|---|---|
| Регистр версий | 1 | 1 на пользователя | mozver. |
Versions Private arenas | Глобальный регистр информации о версиях для всех установок платформы, включая регистр |
| Глобальный регистр | 1 | 1 на пользователя | mozregistry. |
- | Не используется в настоящее время |
| Регистр приложений | 1 | 1 на пользователя | Appreg, |
Common | Регистр всех пользовательских профилей и всех доступных |
| Регистр компонентов | 1 на платформу | 1 на платформу | component.reg, "Component |
Common | Регистр всех доступных компонентов XPCOM |
Иногда приложению требуется провести пользователя по весьма извилистому пути. Установка приложения - как раз такой случай. Обычный способ справиться с этой задачей - снабдить пользователя диалоговым окном, помогающим ему на каждом из шагов. Такие диалоговые окна иногда называют "мастерами" (wizard).
XUL имеет тег <wizard> для создания окна помощи при сложных
процессах, подобных установке приложения. <wizard> подобен
причудливой комбинации тегов < и <. Каждый
тег <wizard> содержит один или более тегов <wizardpage>.
Каждый тег <wizardpage> может содержать произвольный XUL-контент.
Подобно тегу <, тег <wizard> представляет полное
окно и используется вместо тега <window>. Как карты в колоде,
теги <wizardpage> сложены в стопку один поверх другого. Тег <wizard> имеет кнопки Next, Back, Cancel и Finish, с помощью
которых пользователь может перелистывать страницы, точно так же, как
между вкладками (tabs). И <wizard>, и <wizardpage>
основаны на связках XBL, хранящихся в файле wizard.xml архива
В архиве "wizard". Эти файлы содержат добавочные возможности тега <wizard>, в частности, в форме JavaScript-объекта WizardManager.
Если ваше приложение нуждается в нескольких Мастерах, стоит заглянуть
в этот код, это поможет сэкономить время. Он позволит создать
центральный объект, хранящий всю скриптовую логику Мастеров. Это
рекомендуемый способ действий.
На рисунке 17.7 показано окошко,
основанное на теге <wizard>.
Это окно используется в
(рис 17.7) Создание почтового счета на основе тега <wizard>.Эти теги не используются при обычной установке системы, обсуждаемой
в данной лекции. Они используются при установке по выбору, установке из
Тег <wizard> предоставляет окошку некоторое содержание,
логику навигации и обработку событий. Минимум, который должен
реализовать программист приложения, - снабдить его недостающим
содержанием в виде контента - тегов <wizardpage> (которые обычно
состоят из элементов форм и объясняющего текста) и скриптов,
проверяющих вводимые данные и реагирующих на действия пользователя.
Тег <wizard> имеет следующие специальные атрибуты:
title pagestep firstpage lastpage onwizardnext onwizardback onwizardcancel onwizardfinish
title определяет строку, которая появится в верхней части окна,
после слов "Welcome to the".
pagestep определяет, на сколько страниц нужно
"перепрыгнуть", если выбраны кнопки Back или Next. Значение
по умолчанию - 1 (одна).
firstpage получает значение true, когда
показана первая страница.
lastpage получает значение true, когда показана последняя
страница.
Остальные атрибуты - это обработчики событий, срабатывающие при
нажатии кнопок Next, Back, Cancel, и Finish. Эти обработчики имеют
значимые действия по умолчанию. Так же, как для < и <window>, атрибуты width, height, screenX и screenY не работают
в теге <wizard>. Тег <wizard> автоматически получает width="500px", height="380px".
Вдобавок к атрибутам, XBL-определение тега <wizard> имеет
методы и свойства, позволяющие имитировать пользовательскую реакцию из
скрипта.
На рисунке 17.8 изображено
содержание тега <wizard>, если никакого иного
содержания программист не определил.
(рис 17.8) Простейший мастер на основе тега <wizard>.
Тег <wizardpage> подобен тегу <box>. Он используется
практически только внутри тега <wizard>. Можно поместить в него
любой XUL-контент, но не смешивайте его со встроенной системой
навигации Мастера. Лучше добавить несколько страниц, чем усложнять
существующие. <wizardpage> имеет следующие атрибуты:
pageid next onpagehide onpageshow onpagerewound onpageadvanced
pageid - идентификатор страницы, отдельный от идентификатора id. Он
используется внутренним механизмом Мастера и всегда должен быть
определен.
С помощью атрибута next можно нарушить стандартный порядок
просмотра страниц Мастера. Он содержит идентификатор pageid. Если он
установлен, Мастер больше не следует своей простой стратегии просмотра
страниц вперед и назад. Вместо этого любой шаг навигации определяется
атрибутом next. Чтобы это работало, нужно присвоить значение свойству
next <wizardpage>, а не самому тегу. Если это
сделано, вся навигация определяется тегами <wizardpage>,
имеющими атрибут next.
Остальные четыре атрибута - обработчики событий. Они срабатывают,
когда страницы Мастера появляются и исчезают, и когда пользователь
перелистывает страницы. Они не имеют реализации по умолчанию. <wizardpage> - действительно простейшая вещь.
Система удаленной установки XPInstall снабжает прикладного
программиста двумя объектами, используемыми на обычной HTML или XUL
странице: InstallTrigger и InstallVersion. I nstallTrigger и InstallVersion - свойства глобального (window) объекта; объект InstallVersion может быть создан методом InstallTrigger.getVersion().
Таблица 17.3 описывает объект InstallTrigger. Заметьте, что доступны некоторые
добавочные константы с тем же смыслом.
| Константы, свойства и методы | Использование |
|---|---|
|
Битовые флаги масок для installChrome() |
MAJOR_DIFF(4), MINOR_DIFF(3), REL_DIFF(2), BLD_DIFF(1), |
Константы, возвращаемые compareVersion() ; указывают, чем отличаются две версии; значения с противоположным знаком также возможны, кроме значения 5 |
Boolean enabled() |
True, если система XPInstall активирована в свойствах платформы |
Boolean install(Object xpi_list, function(url, |
True, если список XPI-комплектов был установлен без ошибки, аргумент function вызывается для каждого XPI URL, имеющего ошибку установки; см. раздел "Скрипты" |
Boolean installChrome(Number flags, String url, String name) |
То же, что и install(), за исключением того, что флаги являются битовым OR, то есть говорят о том, что контент существует, а install.js не запущен; name - текстовое имя приложения |
Number compareVersion(String name, String |
Сравнивает версию устанавливаемого приложения с имеющейся в регистре с тем же именем "name"; возвращает позитивное число, если версия устанавливаемого приложения больше |
InstallVersion getVersion(String name) |
Возвращает версию регистрового имени устанавливаемого приложения, или null |
Таблица 17.4 описывает объект InstallVersion. Заметьте, что доступны добавочные
константы, имеющие то же самое значение, что и основные.
| Константы, свойства, методы | Использование |
|---|---|
MAJOR_DIFF(4), MINOR_DIFF(3), REL_DIFF(2), BLD_DIFF(1), |
Константы, возвращаемые compareTo (), показывают отличия двух версий |
major |
Имеет значение главного числа версии |
minor |
Имеет значение подчиненного числа версии |
release |
Имеет значение |
build |
Имеет значение |
void init() |
Устанавливает значение версии "0.0.0.0" |
void init(String version) |
Устанавливает указанный номер версии |
String toString() |
Возвращает строку, соответствующую версии |
Number compareTo(String |
Сравнивает имеющуюся версию с устанавливаемой; возвращает позитивную константу, если устанавливаемая версия больше |
Объект InstallVersion также доступен из скрипта install.js
Скрипту install.js доступны следующие объекты:
Install InstallVersion FileSpecObject File WinProfile WinReg
Объект InstallVersion описан в разделе "Объекты на стороне
web"; остальные описываются здесь.
Объект Install - это глобальный объект в скриптовом окружении
install.js. Методы этого объекта могут вызываться непосредственно или
с префиксом Install. Объект Install - эквивалент свойству window
web-страницы.
Объект Install - объект-фабрика, с его помощью можно создать все
иные существующие в XPInstall объекты. Он хранит все аргументы,
переданные ему
Таблицы 17.5, 17.6, и 17.7 описывают этот объект. Все его свойства доступны только для чтения.
| Константа, свойство или метод | * | Использование |
|---|---|---|
|
Значения битовой маски флагов свойств и registerChrome() ; использование DELAYED_CHROME задерживает регистрацию до следующего старта платформы. |
|
Number buildID |
Номер |
|
| Error |
||
String |
Содержит тип операционной системы и версию, наподобие window.navigator.userAgent |
|
String jarfile |
||
String |
jarfile |
|
String |
В URL файла XPI содержит любую строку после "?", или null |
|
String url |
Полный URL файла XPI, переданный install() или installChrome() |
|
Number flags |
Флаги, переданные методом installChrome() объекта InstallTrigger |
|
Number _finalStatus |
Значение, возвращаемое счетчику в диалоговом окне удаленной установки | |
Boolean _installedFiles |
Получает значение False, если вызван метод cancelInstall() |
|
File File |
Ссылка на объект File |
|
Object Install |
Ссылка на глобальный объект Install |
|
Number addDirectory(String XPItree) Number addDirectory(String name, String XPItree, FileSpecObject OSpath, String localPath) Number addDirectory(String name, String version, String XPItree, FileSpecObject OSpath, String localPath) Number addDirectory(String name, InstallVersion version, String XPItree, FileSpecObject OSpath, String localPath) |
+ | Копирует указанный путь XPItree в локальную файловую систему; устанавливает с именем текущего приложения или регистровым именем приложения, если оно указано; всегда устанавливает с номером последней версии, или, если версия указана, сравнивает указанную версию с имеющейся, если имеется более новая, процесс установки прекращается; если место для копирования не указано, копирует в |
Number addFile(String XPIfile) Number addFile(String name, String version, String XPIfile, FileSpecObject Ospath, String localPath, [Boolean force]) Number addFile(String name, InstallVersion version, String XPIfile, FileSpecObject OSpath, String localPath, [Boolean force]) |
+ | Копирует файлы из XPI-архива в локальную файловую систему; устанавливает в |
Null alert(String value) |
Отображает окно модального диалога, ожидающее подтверждения пользователя | |
void cancelInstall() void cancelInstall(Number |
Не выполняются никакие предписанные инструкции; если указана причина, она указывается в коде ошибки, в противном случае указывается NSTALL_CANCELLED |
|
Boolean |
Отображает окно модального диалога, ожидающее принятия или отклонения условия пользователем; в случае отклонения возвращает false |
|
Number execute(String XPIpath, String
args, Boolean blocking)
Number execute(String XPIpath, String
args);
Number execute(String XPIpath);
|
Выполнить программу, расположенную по адресу XPIpath в архиве XPI; можно передать ей системно-зависимую строку аргументов; можно, присвоить параметру blocking значение true, это задерживает процесс установки до окончания выполнения программы; значение blocking по умолчанию равно false |
|
Number gestalt(String |
Только для платформы Macintosh - возвращает значение селектора согласно Gestalt Manager; в противном случае null |
|
FileSpecObject getComponentFolder(String name) FileSpecObject getComponentFolder(String name, String |
возвращает имя папки из subpart имени приложения, если null |
|
FileSpecObject getFolder(String |
Возвращает имя папки, соответствующее null в случае неудачи |
|
Number getLastError() |
Возвращает последний SUCCESS |
|
WinProfile getWinProfile(FileSpecObject folder, String filename) |
Возвращает объект WinProfile указанного в файле .INI; возвращает null, если ОС не Microsoft Windows |
|
WinReg getWinRegistry() |
Возвращает объект WinReg |
|
Number initInstall(String text_name, String reg_name, String |
Начинает назначенный процесс данной установки; устанавливает имя данного приложения в text_name, имя регистра reg_name, версию - в version ; возвращает ошибки |
|
Object loadResources(String XPIpath) |
Возвращает JavaScript-объект, моделируемый на основании файла свойств (stringbundle) в архиве XPI; этот файл свойств имеет относительное имя пути XPIpath; каждое свойство в фале появляется как свойство объекта JavaScript; возвращает null в случае ошибки |
|
Null logComment(String text) |
+ | Записывает text, с некоторым форматированием, в файл install.log |
|
Этот метод позволяет обновить данный файл на основе побайтной дельты; не рекомендуется к использованию, задействуйте вместо этого addFile() |
|
Number performInstall() |
Выполняет все предписанные задачи и возвращает |
|
Number registerChrome(Number flags, FileSpecObject folder) Number registerChrome(Number flags, FileSpecObject folder, String rdfpath) |
Заставляет платформу перепрочитать flags сообщает, какие folder - местоположение рассматриваемых файлов, rdfpath - необязательный подпуть (включающий имя файла) к файлу ontents. |
|
Number refreshPlugins() Number refreshPlugins Boolean reloadPages) |
Заставляет платформу обновить доступные reloadPages имеет значение false, перезагрузки не происходит |
|
void resetError() void resetError(Number error) |
Устанавливает последнюю полученную ошибку в ноль или данное значение, если оно имеется | |
Number setPackageFolder(FileSpecObject folder) |
Заменяет значение |
|
Number |
Назначает имя регистра указанного приложения к удалению; возвращает |
Следующие замечания поясняют таблицу 17.5
Важно понять, что возвращаемые значения ошибок предписанных методов описывают лишь проблемы с процессом назначения инструкций. Они не сообщают о проблемах, возникших во время выполнения предписанных инструкций. Даже если проблем не возникает на этапе назначения инструкций, они могут появиться во время установки приложения.
Значения ошибок - обычно отрицательные целые. Целые между -200 и
-299 зарезервированы; значения меньшие -5550 относятся к платформе
Macintosh; 0 есть SUCCESS, а 999 - REBOOT_NEEDED. Все значения,
генерируемые платформой, имеют соответствующие имена свойств,
содержащие константы. В таблице 17.6 эти имена перечислены.
Список корректных селекторов метода gestalt() и их значений можно
найти по адресу http://www.rgaros.nl/gestalt/index.html.
Специальные ключевые слова, передаваемые как аргументы методу getFolder(), перечисляются в Таблице 17.7.
Ключевое слово "Program" соответствует корню области установки платформы. Ключевое слово "file:///" соответствует корню локальной файловой системы. Чтобы посмотреть значения специальных ключевых слов на конкретном компьютере, используйте следующую строчку кода:
alert(getFolder(keyword).toString());
FileSpecObject - объект, подобный значению (value-like object),
который передается между методами других объектов в системе XPInstall.
Совершать какие-либо действия с этим объектом приходится редко. Он
никогда не порождается оператором new в JavaScript. Он имеет лишь одно
полезное свойство:
String toString()
Этот метод возвращает путь к папке, уникальный для каждой операционной системы, который представляет объект FileSpecObject.
Объект Install отвечает за установку и проверку соответствия папок,
файлов и File, по сравнению с ним, отвечает
за проверку и точное манипулирование конкретным файлом. Некоторые из
методов объекта Install используются для выполнения запланированных
задач во время установки. Все методы объекта File выполняются на более
позднем этапе.
Всегда используется только один объект File, он доступен как
свойство с именем File глобального объекта. Все методы этого объекта
доступны как:
File.method_name(args);
| Имя | Имя | Имя |
|---|---|---|
ACCESS_DENIED |
INSUFFICIENT_DISK_SPACE |
READ_ONLY |
ALREADY_EXISTS |
INVALID_ARGUMENTS |
REBOOT_NEEDED |
APPLE_SINGLE_ERR |
IS_DIRECTORY |
SCRIPT_ERROR |
BAD_PACKAGE_NAME |
IS_FILE |
SOURCE_DOES_NOT_EXIST |
CANT_READ_ARCHIVE |
KEY_ACCESS_DENIED |
SOURCE_IS_DIRECTORY |
CHROME_REGISTRY_ERROR |
KEY_DOES_NOT_EXIST |
SOURCE_IS_FILE |
DOES_NOT_EXIST |
MALFORMED_INSTALL |
SUCCESS |
DOWNLOAD_ERROR |
NETWORK_FILE_IS_IN_USE |
UNABLE_TO_LOAD_LIBRARY |
EXTRACTION_FAILED |
NO_INSTALL_SCRIPT |
UNABLE_TO_LOCATE_LIB_FUNCTION |
FILENAME_ALREADY_USED |
NO_SUCH_COMPONENT |
UNEXPECTED_ERROR |
GESTALT_INVALID_ARGUMENT |
PACKAGE_FOLDER_NOT_SET |
UNINSTALL_FAILED |
GESTALT_UNKNOWN_ERR |
PATCH_BAD_CHECKSUM_RESULT |
USER_CANCELLED |
INSTALL_CANCELLED |
PATCH_BAD_CHECKSUM_TARGET |
VALUE_DOES_NOT_EXIST |
INSTALL_NOT_STARTED |
PATCH_BAD_DIFF |
| Microsoft Windows | Macintosh | UNIX | |
|---|---|---|---|
"Plugins" |
" |
"Mac System" |
"Unix Local" |
"Program" |
"Windows" |
"Mac Desktop" |
"Unix Lib" |
" |
"Mac |
||
"Profile" |
"Mac Startup" |
||
"Preferences" |
"Mac |
||
"OS |
"Mac Apple Menu" |
||
"file:///" |
"Mac |
||
"Components" |
"Mac Extension" |
||
" |
"Mac Fonts" |
||
"Mac Preferences" |
|||
"Mac Documents" |
Таблица 17.8 описывает объект File.
| Константа, свойство или метод | * | Использование |
|---|---|---|
Number copy(FileSpecObject src, FileSpecObject target) |
+ | Копирует файл или папку по месту назначения |
Number dirCreate(FileSpecObject local) |
+ | Создает локальную директорию local |
FileSpecObject dirGetParent(FileSpecObject dir) |
Возвращает имя директории, родительской по отношению к dir, или null |
|
Number dirRemove(FileSpecObject local) |
+ | Удаляет директорию local |
Number dirRename(FileSpecObject local) |
+ | Переименовывает директорию local |
Number diskSpaceAvailable(FileSpecObject local) |
Возвращает количество доступного места в байтах на диске/томе, содержащем local | |
Number execute(FileSpecObject file [, String args [, Boolean blocking ] ] ) |
Запускает выполняемый файл file, с аргументами args. Если blocking имеет значение true, установка приостанавливается до окончания выполнения программы. По умолчанию blocking имеет значение false |
|
Boolean exists(FileSpecObject local) |
Возвращает true, если файл или папка local существует |
|
Boolean isDirectory(FileSpecObject local) |
Возвращает true, если local является локальной папкой |
|
Boolean isFile(FileSpecObject local) |
Возвращает true, если local является локальным файлом, но не папкой |
|
Boolean isWritable(FileSpecObjec local) |
Возвращает true, если для папки или файла local есть права на запись |
|
Number macAlias(FileSpecObject src, String filename, FileSpecObject target) Number macAlias(FileSpecObject src,
String filename, FileSpecObject target, String |
+ | Создает Macintosh |
Number modDate(FileSpecObject local) |
Возвращает значение в миллисекундах, когда local был изменен. Это время вычисляется по-разному для каждой платформы | |
Boolean modDateChanged(FileSpecObject local, number modDate) |
Возвращает true, если файл local был изменен после modDate() |
|
Number move(FileSpecObject src, FileSpecObject target) |
Передвигает файл src в папку target. Не может передвигать директории Microsoft Windows | |
String nativeVersion(FileSpecObject local) |
Считывает информацию о Microsoft Windows версии файла local (например, версию DLL) | |
Number remove(FileSpecObject local) |
+ | Удаляет файл или папку local |
Number |
+ | Присваивает файлу или папке local имя name |
Number size(FileSpecObject local) |
Возвращает значение в байтах размера файла local | |
String windowsGetShortName(FileSpecObject local) |
Только для Microsoft Windows, возвращает 8.3-имя файла, в противном случае возвращает null |
|
Number windowsRegisterServer(FileSpecObject local) |
+ | Только для Microsoft Windows - регистрирует файл local как сервер |
Number windowsShortcut(FileSpecObject local, FileSpecObject target, String linkname, FileSpecObject dir, String params, FileSpecObject icondb, Number index) |
+ | Только для Microsoft Windows - создает ссылку на файл local в директории target. Дает ей имя linkname с расширением .lnk. Делает |
String windowsVersion(FileSpecObject local) |
Возвращает информацию для Microsoft Windows о версии файла local, или возвращает null |
Объект WinProfile, созданные с помощью метода Install.getWinProfile(), может выполнять операции с характерным для
Microsoft Windows файлом .INI, например,C:\WINDOWS\
String getString(String section, String key) String writeString(String section, String key, String value)
Поскольку файл .INI имеет расширенный ASCII формат, в него нельзя записывать информацию в юникоде.
Объект WinReg, созданный с помощью метода Install.GetWinRegistry(), дает доступ к регистру Windows. Операции с
регистром выполняются незамедлительно, они не откладываются.
Объект WinReg содержит текущий корневой ключ регистра.
По-умолчанию, это HKEY_CLASSES_ROOT.
Имена путей в регистре Windows разделены обратным слешем (\). В
скриптах JavaScript обратный слеш нужно писать дважды (\\), противном
случае он понимается как
Таблица 17.9 описывает объект
WinReg. Некоторые методы возвращают данные, но многие лишь код
статуса. Когда возвращается код статуса, null означает, что платформа
Mozilla не может корректно обработать изменения регистра. Обычно это
означает проблемы с аргументами метода. Если возвращается не null,
значение берется из реальной операции с регистром. Даже когда
возвращаемое значение - обычные данные, null означает неудачное
действие, в этом случае также, скорее всего, из-за проблем с
аргументами. Необходимо всегда проверять возвращаемое значение на null.
| Константа, свойство или метод | Использование |
|---|---|
HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS |
Зарезервированные константы для хорошо известных корневых ключей |
Number createKey(String subkey, String name) |
Создает подключ subkey с именем класса name. Имя может быть строкой длины нуль. |
Number deleteKey(String subkey) |
Удаляет подключ subkey |
Number deleteValue(String subkey, String name) |
Удаляет пару атрибут-значение подключа name |
String enumKeys(String subkey, Number index) |
Возвращает подключ с номером index ключа subkey. Возвращает строку длины ноль, если ключ не существует |
String enumValueNames(String subkey, Number index) |
Возвращает имя атрибута с номером index ключа subkey |
Number getValueNumber(String subkey, String |
Возвращает DWORD-значение атрибута ключа subkey |
String getValueString(String subkey, String |
Возвращает строковое значение атрибута ключа subkey |
Number getValue(String subkey, String |
Возвращает DWORD-значение атрибута ключа subkey |
Boolean isKeyWritable(String subkey) |
Возвращает true, если есть права на запись ключа subkey |
Boolean keyExists(String subkey) |
Возвращает true, если ключ subkey существует |
void setRootKey(String key) |
Устанавливает корневой ключ в одно из перечисленных в первой строке таблицы значений. Возвращает null в случае неудачи |
Number setValueNumber(String subkey, String |
Устанавливает атрибут ключа subkey в значение . Возвращает null в случае неудачи |
Number setValueString(String subkey, String |
Устанавливает атрибут ключа subkey в значение str. Возвращает null в случае неудачи |
Boolean valueExists(String subkey, String |
Возвращает true, если ключ subkey имеет атрибут |
Система XPInstall не дает доступа к интерфейсам XPCOM из скрипта install.js.
Есть, однако, несколько компонентов и интерфейсов за пределами
XPInstall, которые дублируют функциональность XPCOM. Если необходима
собственная система
Данная XPCOM пара предоставляет доступ к регистру Mozilla, хотя она не завершена и не очень гибка:
@mozilla.org/registry;1 nsIRegistry
Этот интерфейс работает с различными файлами регистра, как если бы
они были одним файлом. Регистр также можно понимать как источник
данных
@mozilla.org/registry-viewer;1 nsIRDFDataSource
Другой интерфейс к регистру предоставляется так называемым
@mozilla.org/chrome/chrome-registry;1 nsIXULChromeRegistry;1
Для разработчиков на платформе Microsoft Windows представляют интерес следующие два интерфейса:
@mozilla.org/winhooks;1 nsIWindowsRegistry @mozilla.org/winhooks;1 nsIWindowsHooks
Эти интерфейсы предоставляют много возможностей по низкоуровневому доступу к Microsoft Windows.
Особняком от этих интерфейсов, работающих с регистрами, стоит много интерфейсов для работы с файлами и сетью, описанными в лекции 16, "Объекты XPCOM", в том числе интерфейсы для распаковывания архивов ZIP.
Несколько замечаний относительно собственно объектов XPInstall.
Объекты "на стороне Web", InstallTrigger и InstallVersion не имеют полезных интерфейсов XPIDL. Они,
однако, имеют , зарегистрированные в XPCOM, кроме самой
инфраструктуры XPInstall:
@mozilla.org/xpinstall/installtrigger;1 @mozilla.org/xpinstall/installversion;1 @mozilla.rg/xpinstall;1
Тем не менее использовать эти бессмысленно, поскольку
полезных интерфейсов все равно нет. Объекты, доступные в скриптовом
окружении install.js, также не представлены в XPCOM. В этом втором
случае нет даже и для этих объектов.
В данном разделе "Практика" мы должны упаковать уже работающее приложение Notetaker в XPI-файл и установить его, используя XPInstall. Теоретически, наше приложение должно действовать прямо с удаленного web-сервера, но смешивать локальный контент для приложения с оверлеями, расположенными на web-сервере, бессмысленно. На практике это может даже не работать. Так что займемся установкой приложения, загружаемого с удаленного сервера.
Хотя код приложения уже завершен, кое-что нужно добавить. Наша стратегия: связать все вместе в свете механизма, описанного в данной лекции:
Приступим.
Сначала подберем подходящее имя.
Текстовое имя. Выберем "NoteTaker Web Notes". Рекламу прибережем для web-странички, предлагающей приложение пользователю.
Имя приложения в регистре. Это "/Nigel McFarlane/NoteTaker". Если бы наше приложение взяли в главную ветку разработки браузера Mozilla, то имя могло бы быть просто "NoteTaker", что дополнялось бы строкой наподобие "/mozilla.org/Browser/". В этом случае полное имя могло бы быть "/mozilla.org/Browser/NoteTaker". Однако пока такого не случилось.
Номер версии. Нашему приложению не хватало тестирования в реальных условиях, но оно, вроде бы, работает. Назовем его версию 0.9. В полной нотации 0.9.0.0. Можно придумать еще множество усовершенствований и модификаций, но пусть они относятся к версии 1.0
Теперь общая подготовка распространяемого приложения, исходники, воздействие и требования.
Исходники. Все, что обсуждалось в этой книге, и есть основа данного
Воздействие. Воздействие приложения NoteTaker невелико. Это лишь
три вещи: иерархия папок в директории
Требования. Требования к данному программному обеспечению состоят
из нескольких частей. Из-за того, что мы недавно включили объекты
XPCOM (file-based
Это все требования со стороны логистики.
Мы включим файл README.txt для разработчиков, которые имеют дело с исходными текстами. Мы напишем его, основываясь на информации из последней рассмотренной темы.
Нам нужен файл contents.
Мы хотим показать простейший пример поддержки локалей. Для этого
нам нужно иметь файлы contents.
Нам нужно также дать простейший пример установки
Наконец, нам нужно обеспечить установку. Это задача для одного HTML-файла и двух скриптов. Утилита NoteTaker маленькая и целиком основана на платформе и приложении "классический браузер". Мы надеемся, что скрипты будут простые, а не сложные.
Поскольку файл HTML должен показываться любым браузером, ему лучше быть в высшей степени переносимым, наподобие того, что показан в листинге 17.4.
<html>
<head>
<script src="deploy.js"/>
<body>
<h1>NoteTaker Download</h1>
<p>The NoteTaker tool adds Web Notes to
your Mozilla-based Web browser. Web Notes are placed on
top of displayed Web pages. They hold information that you
record for your own purposes.
</p>
<p>Only the Classic Browser, version 1.4, is supported.
It is part of the established Mozilla Web application suite.
The standalone Mozilla Browser is not yet supported.
</p>
<p>Download here: <a href="notetaker.xpi"
onclick="download(event)">NoteTaker tool 0.9</a>
</p>
</body>
</html>
Функция следует наброску, сделанному в листинге 17.1.
В данном случае полный скрипт показан в листинге 17.5. Пуленепробиваемое
определение браузера - довольно тягостное дело, здесь мы ограничимся
лишь наиболее значимыми альтернативами.
function download(e) {
if ( ! deploy() )
alert("NoteTaker 0.9 requires Classic Mozilla 1.4");
e.preventDefault();
}
function is_moz_browser() {
return (
window.navigator
window.navigator.userAgent
window.navigator.userAgent.search(/^Mozilla\/5\.0/) != -1 );
}
function is_target() {
var agent = window.navigator.userAgent;
return (
agent.search(/rv:1\.4/) != -1 // matches
agent.search(/Phoenix/) == -1 // no match
agent.search(/Firebird/) == -1 // no match );
}
function is_app_version_ok() {
var it = window.InstallTrigger;
var result = it.compareVersion(
"Nigel McFarlane/NoteTaker", "0.9.0.0");
return ( result == it.NOT_FOUND ||
Math.abs(result) <= it.REL_DIFF );
}
function deploy() {
if ( !is_moz_browser() ) {
return false;
}
if ( !window.InstallTrigger.enabled() {
return false;
}
if ( !is_target() ) {
return false;
}
if ( !is_app_version_ok() } {
return false;
}
var xpi_container = {
"NoteTaker Web Notes" : "notetaker.xpi"
};
with (window.InstallTrigger)
install(xpi_container, null);
return true;
}
Здесь нам не требуются никакие параметры, так что эта часть скелета
скрипта из Листинга 17.1 не
используется. Если пользователь попробует установить NoteTaker не на
ту платформу или не на то приложение, мы ему пожалуемся. Здесь нет
обработчика событий для функции install(), поскольку мы ничего не
можем сделать, если ситуация зайдет в
Три функции проверок просты. Каждый браузер, чей userAgent
начинается с "Mozilla/5.0" может быть браузером mozilla.org.
Если userAgent содержит "is_app_version_ok() позволяет установить версию
0.9.1.0 поверх 0.9.0.0. Это даст некоторую гарантию защиты от
разработчика, считающего, что отступить назад в номере
Заключительная часть системы установки - скрипт install.js. Листинг 17.6 показывает основную часть этого скрипта, основанного на скрипте, приведенном в листинге 17.2
var TEXT_NAME = "NoteTaker Web Notes";
var REG_NAME = "/Nigel McFarlane/NoteTaker";
var VERSION = "0.9.0.0";
var rv = SUCCESS;
function prepare() {
initInstall(TEXT_NAME, REG_NAME, VERSION);
if ( schedule_files() != SUCCESS ) return getLastError();
if ( register_chrome() != SUCCESS) return getLastError();
return SUCCESS;
}
rv = prepare();
if (rv == SUCCESS) { performInstall();
} else {
alert("Installation failed. (Error = " + rv + ")" );
cancelInstall(rv);
}
Так же, как и в случае
Чтобы выполнить эти шаги, нам нужно знать содержание XPI. Заглянем вперед, в раздел "Финальный комплект", и увидим, что содержимое XPI:
install.js notetaker.jar extras/README.txt extras/notetaker.rdf
Собственно приложение располагается в архиве notetaker.
Листинг 17.7 показывает две
функции, отсутствующие в листинге 17.6. Они выполняют необходимые
манипуляции с файлами XPI и регистром
function schedule_files() {
addFile(TEXT_NAME, VERSION, "notetaker.jar",
getFolder("Chrome"), "notetaker.jar", true);
addFile(TEXT_NAME, VERSION, "extras/notetaker.rdf",
getFolder("Profile"), "notetaker.rdf", true);
return SUCCESS;
}
function register_chrome() {
var jar_root = getFolder("Chrome", "notetaker.jar");
registerChrome(PACKAGE | DELAYED_CHROME,
jar_root, "content/notetaker/");
registerChrome(SKIN | DELAYED_CHROME,
jar_root, "skin/modern/notetaker/");
registerChrome(LOCALE | DELAYED_CHROME,
jar_root, "locale/en-US/notetaker/");
return SUCCESS;
}
Вызов второй функции addFile() показывает, как можно сравнить путь
к любому файлу в файле XPI с любым путем локальной файловой системы.
Вызов getFolder() в функции register_chrome() показывает, как корень
иерархии папок в файле schedule_files(), и register_chrome() выполняются без обращения к
файлу notetaker.xpi. Их вызовы addFile() и registerChrome()
выполняются позже, когда стартует функция performInstall().
Это все, что есть в скрипте install.js
Теперь мы получили или создали все необходимые нам файлы, и можем, наконец, собрать финальный XPI файл. Он должен содержать как минимум файл install.js (поскольку наше приложение - нечто большее, чем просто скин или локаль), так что начнем с создания zip-архива, содержащего этот файл.
Главным содержанием файла XPI являются коды нашей утилиты
NoteTaker. Аккуратный и эффективный способ все организовать - завести
единственный архив
На протяжении книги мы строили утилиту NoteTaker как набор
отдельных файлов и
Пакет в
notetaker/content <---> content/notetaker notetaker/locale/en-US <---> locale/en-US/notetaker notetaker/skin/modern <---> skin/moder/notetaker
Единственное решение - сделать копию исходных файлов из
Вторая трудность с
На Рисунке 17.9 показан
Теперь у нас есть два файла для финального XPI: install.js и
notetaker.
Больше ничего не требуется, кроме как разместить нашу HTML-страничку со ссылкой на файл XPI на web-сайте. На этом мы завершаем пример разработки утилиты NoteTaker.

(рис 17.10) Архив JAR, содержащий пакет NoteTaker.(рис 17.9) Архив XPI, содержащий полный дистрибутив NoteTaker.
Метод logComment() объекта Install является единственным способом
получить alert(). Сообщения записываются в файл install.log,
который сохраняется в корневую область платформы.
Обычный источник проблем при инсталляции - несоответствие иерархии путей в файле XPI и локальной файловой системе. Если они указаны неверно, или не соответствуют друг другу, на данном этапе установки не может быть скопирован ни один файл. Это может быть легко установлено исследованием лог-файла.
Если ничего не происходит (или происходит, но не то), хорошая
стратегия отладки - упростить процесс установки. Уберите цифровую
подпись, затем участки кода, ответственные за проверку версий. Начните
с файла XPI, чье содержание всего лишь должно быть скопировано в
Если в приложении есть оверлеи, важно следить, чтобы не была
повреждена база данных оверлеев. Если какой-либо из оверлеев имеет
Мы вообще рекомендуем тестировать установку приложения не на той платформе, которая используется для ежедневной работы, а на специальной копии. Эта отдельная платформа может быть "Зоной Краха", предназначенной для экспериментов. На платформе Microsoft Windows лучше даже завести специальный компьютер, поскольку есть лишь одна Mozilla и регистр Windows на хост. Если очень постараться, из скриптов XPInstall можно повредить и сам регистр Windows.
Подсистема Mozilla XPInstall многолика и может использоваться по- разному. Прикладные программисты, которые не хотят изучать процесс компиляции самой системы, видят лишь некоторые ее стороны.
Наиболее привлекательной из технологий XPInstall является
удаленная установка. Это действительно удобный механизм
Программист приложения может постепенно переходить на рельсы пользовательской установки, или системной установки, по мере того, как его приложение становится более зрелым и набирает пользовательскую базу. Система XPCOM предоставляет достаточно возможностей, чтобы можно было, если потребуется, создать на основе платформы собственную инсталляционную систему. Единственная часть платформы, которую трудно воспроизвести без C/C++ кода - это часть родного инсталлятора, ответственная за самое начало запуска платформы.
Завершением рассмотрения XPInstall заканчивается наша книга о технологиях Mozilla. Сегодня платформа Mozilla - это развитая и богатая возможностями среда разработки приложений. Это очень заметный и очень важный Open Source проект, и его будущее поистине блестяще.
Удачи вам в работе с Mozilla!
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.