• Содержание
  • Разработка приложений с помощью Mozilla / автор: Н.Макфарлейн
    1. Глава: Основные концепции

    В этой главе дается обзор архитектуры Mozilla и используемых в ней концепций. Кода здесь почти нет. Те читатели, которые лишь недавно начали работу с Mozilla, после прочтения первой главы получат основную информацию об этой платформе, а также смогут примерно представить, на что им предстоит тратить время и усилия. В этой главе речь пойдет о том, что собой представляет платформа, как в Mozilla используются технологии XML и как она реализует принципы быстрой разработки приложений. Те, кто уже знаком со структурой платформы, могут перейти к главе 2, "Проектирование с XUL".

    В разделе "Практика" этой главы приведено несколько простых примеров программ. Они помогут заглянуть внутрь существующего приложения на основе Mozilla, написать свою первую программу и начать разработку проекта NoteTaker ("блокнот"), которым мы будем заниматься на протяжении всей книги.

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

    Даже при первом взгляде на диаграмму видно, что платформа разделятся на две основные части. Справа (внешний интерфейс) находятся ориентированные на пользователей технологии: события, стили CSS (Cascading Style Sheet, каскадные таблицы стилей), DOM (Document Object Model, объектная модель документа). URL (Uniform Resource Locators, унифицированные указатели ресурса) - основа WWW - предоставляют доступ к этим технологиям. Слева же (внутренняя реализация) находятся системные, объектные технологии, например компоненты. Точкой доступа к этим технологиям являются идентификаторы контрактов (одна из концепций Mozilla). Обе части платформы объединяются языком программирования JavaScript и форматом обмена данными RDF (Resource Description Framework, схема описания ресурсов). JavaScript хорошо подходит для связи компонентов внутри платформы Mozilla.

    Наблюдать эти две части платформы воочию очень легко: достаточно открыть окно любой программы на основе Mozilla, например, браузер или почтовый клиент Netscape 7.0 - все, что появится в этом окне, будет создано на основе XML. Простейший пример использования объектов, связанных с внутренней реализацией платформы - небольшой текст кода на JavaScript, отправляющий данные из HTML-формы на web-сервер.

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

    1.1. Название продуктов Mozilla

    Слово Mozilla первоначально было только названием проекта. Оно было предложено в 90-х годах Джеми Завински, сотрудником компании Netscape Communications. Это же слово обозначало и талисман проекта - зеленую рептилию. Появилось оно как сокращение от Mosaic Killer ("убийца Mosaic") и отражало дух соперничества при разработке ПО. Браузер Mosaic был предшественником браузера Netscape 1.0.

    Но с тех пор слово Mozilla стало использоваться гораздо чаще, оно одновременно означало и проект, и конечный продукт, и платформу, а организация, занимающаяся разработкой и продвижением Mozilla, стала называться mozilla.org. Сейчас Mozilla - общее название для группы технологий вроде .Net и Java. Для именования продуктов и технологий внутри этой группы используются собственные названия. Официальный сайт Mozilla, который иногда так и называется, mozilla.org, можно найти по адресу mozilla.org

    Mozilla впервые стала публичным проектом в 1998 г., когда были открыты исходные коды от пакета приложений для работы в Internet Netscape Communicator 5.0. Традиция проектов с открытыми исходными кодами подразумевает публичную проверку кода, значительный вклад разработчиков-энтузиастов и свободное использование. С течением времени Mozilla стала универсальным названием для всего, что связано с проектом 5.0. Прошло еще некоторое время, и в июне 2002 г. было объявлено о готовности Mozilla 1.0 к выпуску. Проект был переименован в Mozilla 1.0. Цифру 5.0 по-прежнему можно найти в строке идентификатора браузера (введите в строку адреса about:mozilla).

    Теперь версии 6.0, 6.5, 7.0 и старше относятся к собственным продуктам Netscape, например, Netscape Navigator. Версии 1.0, 1.1, 1.2 и далее - версии платформы Mozilla, а также пакетов приложений для работы в Internet, создаваемым mozilla.org, потомков Netscape Communicator.

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

    Разделение между платформой Mozilla и приложениями mozilla.org со временем становится более очевидным. То, что раньше было большим пакетом приложений, теперь стало целой платформой, поверх которой создается множество небольших приложений.

    По крайней мере, до версии 1.4 у этих приложений были названия, доставшиеся им в наследство от Netscape: Навигатор, Компоновщик и почтовый клиент. Кроме того, они очень тесно связаны друг с другом. С одной стороны, это позволяет пользователю работать только с одним типом интерфейса, при этом не страдает функциональность. С другой стороны, эффективная поддержка такого продукта невозможна: изменения в одном компоненте могут повлиять на все остальные. Поэтому примерно с версии 1.5 браузер и почтовый клиент стали отдельными приложениями. У них появились свои названия: браузер Mozilla (название проекта - Firefox) и почтовый клиент Mozilla (название проекта - Thunderbird). Тем не менее, полный пакет приложений все еще доступен (Mozilla Application Suite).

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

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

    В нашем курсе "классический браузер" означает браузер, интегрированный в пакет приложений mozilla.org. Классическая Mozilla относится ко всему пакету приложений, Навигатор - к браузеру Netscape версий 7.0 или 4.79 и т. д. Классический браузер может отображать свое содержимое с помощью темы Classic (которая воспроизводит оформление продуктов Netscape 4.x) или Modern (которая воспроизводит оформление продуктов 5.x). Таким образом, "классическая" тема (Classic) появилась на шаг раньше классического браузера.

    Конечный продукт проекта Mozilla - Gecko, или среда исполнения Gecko. Это "урезанная" версия платформы, содержащая только основную функциональность для отображения элементов. Она еще не выделилась в отдельный продукт, но так как ее название звучит все чаще и чаще, это, скорее всего, случится.

    Подведем итог этих пояснений относительно названий: данный курс - только о платформе Mozilla. Для объяснения работы этой платформы в курсе используется классический браузер и другие части классической Mozilla, но здесь также рассказывается и о том, как построить отдельное приложение. Разрабатываемое на протяжении курса приложение NoteTaker добавляется как расширение к браузеру только потому, что оно слишком маленькое, и поэтому нет смысла делать его самостоятельным. Во время чтения рекомендуется использовать классическую Mozilla 1.7, содержащую платформу Mozilla 1.7. В оставшейся части главы мы обсудим некоторые другие названия и термины, связанные с технологиями Mozilla.

    1.1.1. Версии платформ

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

    • стабильные версии, или основные. Это версии х.y.z; их пользователям гарантируется, что наиболее важные функции (интерфейсы) не изменятся до выпуска следующей основной версии. Примеры: 1.0.1, 1.4.1, также 1.0;
    • версии для тестирования новой функциональности. Это версии х.у, где y > 0. В таких версиях реализуются улучшения и исправления ошибок основных версий. Пример: 1.6, 1.7;
    • версии alpha, beta и release candidate (RC, кандидат для выпуска). Перед выпуском версии, например, 1.7, обязательно будут выпуски версий 1.7alpha и 1.7beta - версий, которые более функциональны по сравнению с 1.6, но недостаточно стабильны, чтобы быть выпущенными как версия 1.7. Версии 1.7RC1 и 1.7RC2 и т. д. более надежны и могут стать окончательной версией 1.7, если пройдут финальное тестирование;
    • версии с обратной связью (talkback). При выпуске любой версии может быть дополнительно собрана версия со включенной функцией обратной связи, которая собирает информацию о состоянии программы в момент аварийного завершения работы. Эти данные отправляются в mozilla.org, где они будут использованы для отладки и определения надежности версии;
    • нестабильные и отладочные версии. Каждую ночь автоматически собираются версии, которые содержат все последние изменения и для которых нет никакой гарантии, что они будут работать корректно. Такие версии компилируются с дополнительными функциями отладки, которые можно использовать для анализа работы сборки. Функции для отладки включены и в само приложение, и в платформу;
    • неофициальные версии. Так как исходный код приложений доступен всем желающим, любой может собрать собственную версию, если компьютер позволяет это сделать. Многочисленные параметры компиляции определяют окончательную функциональность, которая будет доступна в исполняемом файле. Изменив стандартный набор параметров, сборщик берет на себя ответственность за некоторый риск. Этот риск связан с тем, что при разработке расширений и следующих версий считается, что используются все функции по умолчанию. Так что неофициальные версии могут не отвечать изменениям в последующих версиях платформы и не поддерживать некоторые приложения Mozilla.

    Во время изучения этого курса можно использовать любую готовую версию платформы: основную или для тестирования функциональности.

    1.1.2. Примеры приложений

    Вот некоторые из известных приложений, созданных на основе платформы Mozilla:

    • Netscape 7.0. Коммерческая версия Mozilla, включающая в себя дополнительную функциональность, отвечающую целям бизнеса AOL Time Warner в Internet. Основные различия: поддержка системы мгновенных сообщений AOL, интеграция с серверами AOL, менее гибкая система подавления всплывающих окон, измененная обработка cookies, общая доводка графического интерфейса. Netscape 7.0 основывается на Mozilla 1.0.1. Netscape 6.x также основывался на Mozilla, но на версии 0.9.4, и содержал много ошибок.
    • Compuserve 7.0. У AOL есть также более старая клиент-серверная служба для работы в Internet, у которой все еще очень много пользователей. Версия 7.0 клиента основывается на Mozilla 1.0.1.
    • AOL 8.0 для MacOS X. Основной клиент для работы в Internet пользователей AOL. Он очень распространен и обладает легко настраиваемым интерфейсом. Начиная с версии 8.0, вариант для Macintosh больше не использует Internet Explorer, а поддерживает Mozilla 1.0.1.
    • браузер Mozilla. браузер от mozilla.org, более компактный и несколько менее функциональный по сравнению с классическим браузером Mozilla.

    Два отличных примера приложений не для Internet дают OEone и ActiveState.

    Продукция OEone (www.oeone.com) предназначена для начинающих пользователей. Продукт OEone HomeBase является особой комбинацией Linux и расширенной версии платформы Mozilla под названием Penzilla. В результате получается система для работы с компьютером, содержащая все необходимое. На рисунке 1.1 показан снимок такого рабочего стола на основе Mozilla.

    Рабочий стол OEone HomeBase. (www.oeone.com)

    Рис. 1.1.  Рабочий стол OEone HomeBase.

    ActiveState (www.activestate.com) предлагает интегрированную среду разработки для программистов под названием Komodo, которая также основывается на платформе Mozilla. Снимок окна можно увидеть на рисунке 1.2.

    Среда разработки ActiveState's Komode 3.1. (www.activestate.com)


    Рис. 1.2. Среда разработки ActiveState's Komode 3.1. (www.activestate.com)

    Кроме перечисленных обычных и web-приложений, можно создавать и другие легко настраиваемые приложения. С помощью стандартной платформы Mozilla можно реализовать почти один и тот же графический интерфейс в любой операционной системе. Конечно, было множество попыток создать браузер, который бы полностью соответствовал внешнему виду отдельной ОС. Это сильно модифицированные версии Mozilla, которые мы не будем рассматривать в этом курсе:

    • Camino (ранее Chimera) - браузер для Mac OS X, использующий интерфейс Cocoa и традиционную систему меню Macintosh;
    • Galeon, Nautilus - программы просмотра, тесно интегрированные с интерфейсом рабочего стола GNU/Linux GNOME. Частично эта интеграция будет реализована и в стандартной платформе, например, поддержка GTK 2.0;
    • K-Meleon - браузер для Microsoft Windows, использующий технологию ActiveX. Внешне похож на Internet Explorer.

    Число приложений, основанных на платформе Mozilla, постоянно растет: ежемесячно появляются уведомления о создании новых продуктов. Их можно найти в центре новостей сообщества Mozilla, www.mozillazine.org.

    1.1.3. Немного жаргона

    На англоязычных сайтах (да и русскоязычных тоже) и в списках рассылок, посвященных Mozilla, часто могут встречаться разные выражения, специфичные только для сообщества Mozilla. Объяснять здесь их все бессмысленно. Если вы знаете английский язык, можете обратиться к документам www.mozilla.org/docs/jargon.html и http://devsupport.mozdev.org/QA/thesaurus/. Мы приведем лишь небольшой список наиболее часто употребляемых слов:

    • XP (cross platform) - кроссплатформенный, то есть легко переносимый на другие платформы; встречается в XPCOM, XPFE, XPInstall, XPIDL;
    • FE (front end) - графический интерфейс, графическая часть Mozilla;
    • BE (back end) - программная часть Mozilla, "движок";
    • i18n (internationalization) - интернационализация, поддержка многих языков;
    • l10n (localization) - локализация, поддержка и доработка для использования конкретного языка;
    • tree (дерево разработки) - система исходных кодов Mozilla, из которой компилируются новые версии;
    • bloat (раздуваться) - тенденция любой функционально совершенствуемой программы увеличиваться в размерах;
    • landed (размещенный) - обычно в выражении "landed functionality", окончательное внесение изменений в дерево разработки;
    • dogfood ("собачий корм") - от выражения "eat your own dogfoot" ("сам ешь свой собачий корм") - этап тестирования, когда вы проверяете собственные исправления;
    • porkjockeys ("наездник на свинье") - от поговорки "when pigs fly" (дословно "когда свиньи полетят", то есть "когда рак на горе свистнет") - те, кто хочет радикально перепроектировать Mozilla;
    • r=[адрес эл. почты] - изменения проверены и одобрены владельцем модуля с указанным адресом электронной почты;
    • sr=[адрес эл. почты] - изменения архитектуры проверены и одобрены владельцем модуля с указанным адресом электронной почты;
    • Zarro Boogs - от zero bugs (ноль ошибок) - по этому запросу ошибок не найдено.

    Наконец, существует целый список пересекающихся друг с другом технических терминов, например, Seamonkey, NGLayout, Necko и т. д. Только некоторые из них относятся к отдельно выделяемому приложению или технологии, так что в этом курсе мы постараемся их избегать.

    1.2. Использование XML

    XML (Extensible Markup Language, расширяемый язык разметки) - весьма успешный стандарт, созданный Консорциумом World Wide Web, W3C (www.w3c.org). Mozilla широко поддерживает XML, так что мы кратко опишем, для чего этот стандарт применяется.

    Основная цель XML - обеспечить нотацию для описания и структурирования информации, которой могут быть данные любого типа. Ведущие стандарты XML также предоставляют наборы понятий и синтаксиса, их можно использовать для создания описательных терминов, относящихся к какому-либо одному типу данных, например, векторной графике. Такие наборы терминов называются приложениями XML. Самое известное приложение XML - XHTML, XML-версия обычного HTML.

    XHTML описывает информацию, состоящую из текста, изображений и ссылок на другие XHTML-документы. Каждый отдельный пример этих данных называется экземпляром или документом. Таким образом, XHTML определяет именно гипертекстовые документы и никакие другие. Существует множество других доступных всем определений приложений XML, например, SVG (для описания векторной графики), MathML (для описания математических формул) и RDF (для описания различных ресурсов). Приложение XML для Mozilla, XUL, определяет графический интерфейс пользователя. В качестве примера кода XML приведем обычный SVG-документ.

    <?xml version="1.0" encoding="windows-1251"?> 
    <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" 
     "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"> 
      <svg width="500" height="400"> 	
        <rect x="35" y="32" width="300" height="85"/> 	
        <text x="50" y="67">Прямоугольник</text> 
      </svg>
    
    Листинг 1.1. Пример документа SVG 1.0, приложения XML

    Первые три строки этого примера определяют тип документа, остальные - его содержимое. Используя определение соответствующего приложения XML, программисты создают ПО, которое может обрабатывать документы такого типа. Обработка документов может быть как очень сложной, так и очень простой. В случае примера из листинга 1.1, программа может прочитать этот документ и отобразить прямоугольник со словом "Прямоугольник" внутри, пример такой программы - браузер. XML-документы, как уже говорилось выше, можно подвергнуть и другой, более тонкой обработке: их можно преобразовывать, пересылать, создавать, делить на части и комбинировать, а также просто отображать.

    Успех XML основывается на нескольких простых принципах, которые мы рассмотрим ниже.

    1.2.1. Общая основа форматов

    У всех XML-документов, независимо от приложения, в основе лежит один и тот же формат. Поэтому в процедурах анализа разных типов документов много общего. Таким образом, разработчики могут не тратить напрасно силы в спорах о синтаксисе, ведь эти споры обычно редко касаются собственно данных, для которых предназначены соответствующие форматы. Разработчики могут сосредоточиться на более важных задачах, а для различных программ более не нужны специальные модули для чтения файлов форматов других систем.

    Другое следствие этого принципа - многократное использование и улучшение программных инструментов. Общие операции для работы с XML известны всем, следовательно, поиск или создание инструмента, который мог бы обрабатывать XML, облегчается. Программисты могут использовать эту функциональность во многих современных инструментах, в том числе и в Mozilla.

    1.2.2. Принцип открытости и завершенности

    Этот принцип взят из мира ООП (объектно-ориентированного программирования). Он заключает в себе идею, что некоторая часть программы может быть одновременно завершенной и тем не менее открытой для дальнейших изменений. Это в полной мере относится к XML. Основные стандарты XML полностью определены и завершены, так же как и стандарты различных приложений XML; тем не менее, каждый может при желании создать новое приложение XML. Это очень гибкие условия. Более того, стандарты XML допускают смешивание частей экземпляров одних приложений (это называется фрагментами документов) с другими: один документ может содержать и код XHTML, и код SVG. Это тоже очень удобно.

    Такая гибкость - плодородная почва для разных инноваций. Авторы документов могут выбирать любое подходящее приложение XML, что вполне естественно, а программисты, в свою очередь, могут определять любые приложения XML. Эти новые форматы могут быть основой для целого ряда документов с новым типом содержимого или новой областью использования.

    Mozilla, безусловно, выигрывает от такой гибкости. В ней реализована поддержка нескольких современных приложений XML, прежде всего, XUL (XML User-interface Language, язык описания интерфейсов на основе XML) и XBL (XML Binding Language, язык описания связей на основе XML), которые используются во многих специальных документах. В Mozilla программистам доступна простейшая обработка любых документов с синтаксисом XML, а также более специальная - для многих приложений вроде RDF и XHTML.

    1.2.3. Не только английский

    Еще одно преимущество XML - возможность использования разных языков.

    Стандарт Unicode - список всех наборов символов, используемых для письма на разных языках мира. Сопоставив таблицу символов Unicode и шрифт, мы получим визуальный символ (который также называется глифом). В XML-документах могут использоваться любые символы стандарта Unicode, поэтому информация в формате XML может храниться на любом языке.

    Первые достижения современного мира компьютеров были реализованы в англоязычной части западного полушария: в Университете Калифорнии, в Университете Беркли и в компании AT&T. Тогда казалось, что восьми битов (одного байта) будет достаточно для глифов всех знаков, обычно используемых при письме на английском. Так были созданы таблица символов ASCII, тип char в языке С и технология обработки текста в операционной системе Unix - все они использовали для одного символа один байт. Но такая широкая распространенность однобайтового представления символов препятствовала переходу на стандарт Unicode, в котором для представления одного символа используются два байта. XML - один из способов преодолеть это препятствие, так как в нем с самого начала было заложено использование Unicode.

    Пример инструмента, использующего XML и Unicode для решения проблем интернационализации, - Mozilla. Основной язык программирования для Mozilla, JavaScript, также поддерживает Unicode.

    1.2.4. Иерархичность

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

       Шел Кондрат в Ленинград,
       А навстречу - двенадцать ребят,
       У каждого по три лукошка,
       В каждом лукошке - кошка,
       У каждой кошки - двенадцать котят,
       У каждого котенка в зубах по четыре мышонка.
    

    Окончание загадки:

       И задумался старый Кондрат:
       "Сколько мышат и котят
       Ребята несут в Ленинград?"
       Глупый, глупый Кондрат!
       Он один и шагал в Ленинград.
       А ребята с лукошками,
       С мышами и кошками
       Шли навстречу ему - в Кострому.
    

    Это пример иерархической организации объектов.

    Простота особенно важна в работе с компьютерами, потому что это абстрактная задача. Даже вне контекста компьютеров (например, в этой книге) для упорядочения больших массивов данных используется иерархическая организация. Для программистов такая особенность XML - простой путь выразить решение какой-либо задачи.

    1.3. Платформа и ее концепции

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

    Четыре основные концепции Mozilla - XUL, JavaScript, RDF и XPCOM. XUL - диалект XML, используемый для проектирования графических интерфейсов; JavaScript - язык скриптов с синтаксисом, похожим на синтаксис языка C; RDF - тоже диалект XML, используемый для хранения данных; XPCOM (Cross Platform Component Object Model, кроссплатформенная объектная модель программных компонентов) - система управления программными объектами. Эти четыре технологии будут подробно рассматриваться на протяжении нашей книги. Здесь мы только кратко охарактеризуем окружение, в котором данные технологии используются.

    Основное достоинство платформы Mozilla - возможность создания графических, интерактивных приложений. Она не предназначена для использования при написании драйверов, серверов или систем пакетной обработки данных. Но с ее помощью можно с легкостью добавить графический интерфейс к таким программам.

    1.3.1. Архитектура

    Приложения от Netscape для работы в Internet, предшественники Mozilla, создавались в спешке и были не так структурированы и открыты, как хотелось бы, что значительно ограничило использование данных программ и очень мешало, когда приложениям версии 4.х пришлось конкурировать с Internet Explorer и Outlook Express от Microsoft по функциональности.

    С тех пор Netscape, mozilla.org и программисты-энтузиасты потратили много времени, использовали все свои таланты и возможности, чтобы переработать этот пакет, разделив его на меньшие, более гибко взаимодействующие части. Некоторые не прижившиеся технологии были заменены на новые. Вместе эти части лучше организованы, чем ранее, и составляют современную платформу Mozilla. Именно эта гибкость и придает Mozilla свойства платформы, а не просто легко настраиваемого продукта.

    1.3.1.1. Многоуровневый подход

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

    Самый нижний уровень отвечает за управление и реализацию большого набора объектов. Все эти объекты взаимодействуют внутри одного исполняемого файла, а их работа координируется встроенной посреднической системой. Эта система легко переносима, так как должна работать в разных операционных системах. В Mozilla она называется XPCOM и является ядром платформы. Прямой доступ к XPCOM возможен только с использованием языков C или C++. Система XPCOM написана очень аккуратно, так что ее можно компилировать и запускать в разных ОС. Файлы, реализующие объекты, которыми управляет XPCOM, можно найти в каталоге components стандартной установки Mozilla.

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

    Некоторые из доступных в платформе объектов - довольно большие и сложные и могут обрабатывать XML. С их помощью программист может получить более удобное представление своих данных в XML. Это представление основывается на стандартах W3C DOM (www.w3c.org). То есть вместо написания собственной программы разбора XML на JavaScript программист может направить свой XML-документ специальному объекту, который после обработки выдаст набор интерфейсов более высокого уровня, например, интерфейс документа DOM 1. В этом случае в скрипте JavaScript следует просто обратиться к менеджеру объектов XPCOM и через него использовать несколько нужных объектов? Далее можно работать со всеми DOM-объектами, которые будут созданы XPCOM-объектами после обработки XML-документа.

    Функциональность уровня DOM используется почти во всех средах программирования, где обрабатывается XML, в том числе и в web- страницах XHTML при создании скриптов динамического HTML. В случае web-страницы неочевидно, что DOM-объекты получены с помощью XPCOM, но это так. Часто на этот уровень вводятся некоторые улучшения, чтобы он мог включать и другие полезные объекты вроде window и navigator из JavaScript. Иногда накладываются и ограничения из соображений безопасности. Все это есть в Mozilla, и на данном уровне нам доступна среда для работы с разными типами данных в формате XML и HTML. Наиболее важно то, что для собственного диалекта Mozilla, XUL, тоже есть такая среда, это начальный уровень для создания графических интерфейсов приложения. Пример работы с DOM можно найти на любой HTML- странице со скриптами динамического HTML.

    Некоторые объекты XPCOM сами выполняют различные действия для отображения графического интерфейса, в частности, они визуально организуют элементы и прорисовывают их. Часть платформы Mozilla, которая называется Gecko, содержит набор таких объектов. Эти объекты более высокого уровня автоматизируют отображение XML-документов, графики и текста. Если разработчику нужно, чтобы на экране была отображена какая-то информация, скрипт может отправить ее этим объектам, и она отобразится автоматически, так что использовать какие- то дополнительные программные средства не потребуется. Эта сторона платформы, возможность визуализации, проявляется в любом окне браузера.

    Наконец, XML и объекты XPCOM можно связать вместе. Это делается с помощью связей XBL, шаблонов XUL или используются другие, менее очевидные, подходы. Таким образом, автоматическая обработка XML, выполняемая объектами XPCOM, доступна на более высоких уровнях при минимальных затратах на написание кода. Пример комбинации тегов и объектов, созданной с помощью XBL, - работа со вкладками в Mozilla.

    И все-таки, если бы кроме этого платформа Mozilla ничего не содержала, это был бы всего лишь интерпретатор JavaScript вместе с большой библиотекой объектов - он не очень отличался бы от Perl, Tcl, Visual Basic или даже Java. В платформе же есть, кроме всего прочего, самый высокий уровень - оболочка приложения. Эта оболочка представляет собой код, связывающий вместе объекты XPCOM в одну исполняемую программу. Оболочка может автоматизировать и координировать выполнение различных задач, например, подключение к серверу, основную обработку документов, создание процессов; она и множество специализированных объектов XPCOM представляют собой готовую платформу для разработки. Она более полезна, чем простой набор библиотек, которые не могут ничего сделать, пока программист не обратится к ним. Оболочка приложения содержит также некоторые функции, позволяющие приложениям запускаться поверх платформы. Кроме того, это еще и механизм исполнения приложений для платформы. Файл mozilla (или mozilla.exe) - копия платформы, вызываемой из оболочки приложения.

    Значительная часть работы программиста может быть выполнена путем просто создания XML-документов, которые затем передаются оболочке.

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

    В оставшейся части обсуждения архитектуры мы рассмотрим некоторые ее уровни более подробно.

    1.3.1.2. Модель компонентов XPCOM

    Одно из важнейших достоинств Mozilla - ее внутренняя структура.

    Сама платформа написана на языках программирования C и C++, и именно они используются на самом нижнем уровне. В случае простой программы на C/C++ добавление функциональности означает компилирование и компоновку с большим числом объектов или функций. Но если вы работаете над большим проектом, этот подход слишком непрактичен.

    Дело в том, что конечная программа будет постоянно увеличиваться и работать менее эффективно, кроме того, следить за всеми реализованными объектами сложно. Наконец, если программное обеспечение используется в нескольких проектах, каждому из них может быть нужна только часть платформы. Другими словами, для каждого проекта потребуется модифицировать платформу, чтобы она соответствовала его целям, или придется смириться с тем, что в ней будет множество никогда не используемых объектов. Вероятнее всего, должен быть более разумный подход к решению этой проблемы, и он действительно есть.

    Менеджер объектов (он может называться каталогом объектов, службой именования объектов или службой обнаружения объектов) - это часть программы, которая отыскивает объекты и делает их доступными. Если все объекты предоставляют единый интерфейс, которым может пользоваться менеджер, со всеми объектами можно работать одинаково. Для достижения такого единообразия на объекты накладываются некоторые ограничения.

    Каждому объекту Mozilla соответствует собственный компонент. Компоненты создаются из объектов и интерфейсов. Список всех доступных компонентов хранится в реестре компонентов (небольшая база данных). Служба именования компонентов находит соответствующий имени компонента объект (в терминах ООП это называется фабрикой). Разработчику доступны тысячи компонентов и интерфейсов. Вот пример имени компонента, записанного в форме идентификатора контракта. Цифра в конце строки указывает версию:

    @mozilla.org/browser/httpindex-service;1
    

    Инфраструктура, для которой стандартизованы эти объекты, называется XPCOM. Технология XPCOM немного похожа на CORBA и очень похожа на COM, две другие системы управления объектами.

    CORBA (Common Object Request Broker Architecture, обобщенная архитектура брокера объектных запросов) - система для совместного использования объектов, написанных на любом из нескольких заданных языков программирования. Чтобы достичь этого, все интерфейсы объектов описываются с помощью независимого от языка синтаксиса, IDL (Interface Definition Language, язык описания интерфейсов). В Mozilla включен вариант спецификации CORBA IDL, он называется XPIDL (кроссплатформенный IDL). Это переносимый (не зависящий от аппаратной платформы и операционной системы) язык, использующийся для создания переносимого кода и библиотек типов.

    COM (Common Object Management, общее управление объектами) - система для "склеивания" различных объектов, написанных для Microsoft Windows. Mozilla также включает вариант COM, который называется XPCOM (Cross Platform COM, кроссплатформенный COM). XPIDL и XPCOM в Mozilla работают вместе и образуют систему, которая управляет объектами, подобными объектам COM и описываемыми спецификациями, похожими на использующиеся в CORBA. XPCOM - не распределенная система вроде DCOM (Distributed COM, распределенный COM) и ограничивается одним компьютером и, на данный момент, одним исполняемым файлом. Хотя спецификации объектов похожи на используемые в CORBA, по функциональности XPCOM довольно полно дублирует COM.

    Почти все версии Mozilla можно представить в виде компонентов XPCOM, и почти ко всем из них можно обращаться из скриптов JavaScript. Многие компоненты реализуют протоколы Internet или другие сетевые стандарты. Эта модель компонентов и доступные сетевые компоненты делают Mozilla похожей на миниатюрную версию платформы разработки .NET. Если компоненты платформы написаны на C/C++, как в основном и есть, значит, они должны быть написаны в соответствии со строгими правилами, соблюдение которых обеспечивает переносимость; набором таких правил и является XPCOM.

    1.3.1.3. Поддержка XML

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

    Поддержка XML в Mozilla полнее простого чтения файлов этого формата. Для работы с получаемыми XML-файлами в Mozilla существует развитая инфраструктура; в частности, в ней есть простая, но эффективная модель обработки RDF. Поддержку XML в Mozilla лучше всего рассматривать как систему, которая может взять XML из одного места и положить его в другое. Чтобы упростить этот процесс, можно применить несколько преобразований. Это могут быть слияние и фильтрация документов, работа с отдельными частями документов, операции вставки, обновления и удаления частей структуры документа и его содержимого.

    Вот примерный список всех поддерживаемых Mozilla приложений XML: XML, XML Namespaces (пространства имен XML), XLink, XHTML (и HTML), MathML, SVG, XSLT (Extensible Stylesheet Language Transformations, преобразования расширяемого языка таблиц стилей), RDF, SOAP, WSDL (Web Services Description Language, язык описания веб-сервисов) и XML Schema.

    В Mozilla также поддерживаются два уникальных (используемых только в этой платформе) приложения XML: XUL и XBL. Документы XUL описывают расположение графических элементов управления. Документы XBL предоставляют связи, с помощью которых объекты JavaScript и данные в формате XML могут быть вместе преобразованы в новые данные. XUL - ключевая технология для разработчиков приложений. Посмотрите на любое окно классической Mozilla: все, что вы в нем увидите (за исключением HTML), описывается XUL.

    Для многих из перечисленных стандартов Mozilla поддерживает DTD (Document Type Definition, декларация типа документа), но ни для одного из них она не поддерживает определения в формате XML Schema. Из поддерживаемых стандартов для визуального отображения предназначены только XHTML/HTML, SVG, MathML, XUL и XBL. Остальные используются только для обработки данных.

    1.3.1.4. Модель отображения данных Gecko

    Чтобы показать пользователю данные из XML-документа, необходима какая-нибудь система отображения. Это работа для объектов внутри платформы, отвечающих за визуализацию и формирующих часть подсистемы отображения Gecko.

    Правила, определяющие внешний вид документов XML (и частично, внешний вид HTML-документов), за последние несколько лет менялись. Если раньше эти правила встречались в таких стандартах как HTML, то сейчас они собираются в стандартах стилей, например, CSS, DSSSL (Document Style Semantics and Specification Language, язык для определения семантики и спецификации стиля документа) и XSL-FO (XSL Formatting Objects, объекты форматирования XSL). Эта тенденция отразилась и на платформе Mozilla, где внешний вид полностью определяется современной версией CSS 2, в которую включено множество специфичных для Mozilla расширений. Механизм обработки CSS 2 в Mozilla также является частью системы визуализации Gecko. Кроме того, в Mozilla CSS 2 используется и для печати.

    XML-документы изменяемы. Если они скачиваются с удаленного узла, загрузка может происходить по частям. Если на них может влиять программист, они могут увеличиваться или уменьшаться. В современных средствах отображения должна быть реализована сложная модель содержимого документа, чтобы предусмотреть возможность изменения отображаемого документа. Mozilla содержит систему отображения данных третьего поколения - также часть Gecko, - чья архитектура сопоставляется с более ранними вариантами такой системы в списке, представленном ниже. Хотя здесь имеется в виду XML, самый очевидный пример системы отображения - система отображения HTML.

    Стратегия 1а. Читать все теги из XML-документа по одному и отображать документ по мере чтения. Прервать отображение, если для следующего шага получено недостаточно тегов, что вынуждает пользователя ждать. Самые первые браузеры вроде Netscape 1.0 обрабатывали так HTML.

    Стратегия 1б. Считать все теги из XML-документа в память, заставив пользователя ждать. Проанализировать документ. Отобразить весь документ за раз. Ни один из популярных браузеров этого не делал, но пакетная обработка в XSLT в специальном ПО для печати проходит примерно так.

    Стратегия 2. Читать все теги из XML-документа по одному и отображать страницу, используя метки-заполнители для ожидаемых данных, которые еще не прочитаны. Когда данные получены, динамически заменить ими эти метки. Перерисовывать весь документ при получении новых данных, чтобы аккуратно вставить их. Так поступают Internet Explorer 4.0+ и Mozilla 1.0+.

    Стратегия 3. Читать теги так же, как это описано в стратегии 2, но при этом постараться прочитать и служебную информацию. Когда пользователь или сервер меняет служебную информацию, загружать или удалять соответствующие данные и обновлять отображение документа. Делать это даже после полной загрузки документа. Так поступает Mozilla 1.0+, используя в качестве служебной информации данные в формате RDF.

    Реализация модели отображения из стратегии 3 довольно сложна, поэтому и внутренняя структура Mozilla, отвечающая за это, тоже очень непростая.

    1.3.1.5. Поддержка web-стандартов

    Поддержка стандартов для отображения web-страниц в Mozilla - лучшая из существующих. Ближайший конкурент Mozilla - браузер Opera. Хотя эта книга не о HTML, краткий обзор будет полезен, так как HTML можно комбинировать с XUL.

    Для отображения HTML Mozilla может использовать один из трех режимов: режим совместимости, режим строгого соответствия стандартам и режим нестрогого соответствия стандартам. Первый из них больше всего подходит для поддержки HTML 4.01 и более ранних версий. Режим строгого соответствия используется только для XHTML 1.0. Режим нестрого соответствия очень похож на режим строгого соответствия, но работает и с теми web-страницами, которые не очень красиво выглядят, если применять к ним строгие стандарты. Режим отображения выбирается на основе директив в начале документа. Во всех режимах разрешено использовать некоторые расширения стандартов, и эти расширения существуют.

    Дополнительно Mozilla поддерживает стандарты HTTP 1.1; CSS 2; DOM 0, 1 и 2; ECMAScript версии 3 (JavaScript). Поддержка каскадных таблиц стилей в Mozilla не только соответствует стандартам, но и содержит некоторые собственные расширения, которые должны войти в CSS 3, или просто новаторские. DOM 3 поддерживается лишь частично. Mozilla также реализует некоторые рекомендации W3C для облегчения работы людям с ограниченными физическими возможностями.

    Мир HTML уменьшается до нескольких небольших не очень объемных отдельных стандартов и стандартных модулей, которые вместе и составляют HTML. Mozilla поддерживает XLink, но не XForms. Аналогично одни модули DOM 3 поддерживаются, а другие нет. Так как Internet Explorer поддерживает только DOM 1, Mozilla на голову впереди этого браузера в гонке по реализации стандартов. В главе 5, посвященной написанию скриптов, соответствие стандартам DOM рассматривается более подробно.

    1.3.1.6. Собственные теги и объекты

    Mozilla содержит спецификацию механизма для объединения тегов XML (текста) и скомпилированных объектов. Этот язык называется XBL, приложение XML, созданное для Mozilla. Вместе с XBL обычно используются JavaScript, CSS и другие приложения XML.

    С помощью XBL можно определить тег XML и его свойства и методы. Этот тег связывается с какой-либо инструкцией по обработке. В W3C такие инструкции называются действием (action), но они более известны как поведение (behavior, термин Microsoft). В Mozilla эти инструкции создаются в виде полностью объектно-ориентированного определения объекта. Привязка нового тега к инструкции называется связкой (binding). Инструкция может быть написана так, чтобы иметь возможность использовать все сервисы, предоставляемые платформой, в том числе объекты XPCOM и другие теги с собственными связями.

    Так как XBL позволяет определять новые теги, Mozilla приходится быть достаточно либеральной при обработке данных. Любой тег XML может оказаться определенным в каком-либо другом месте. XBL вносит свой вклад в практически нулевую проверку корректности документов в Mozilla. Это будет обсуждаться ниже в разделе "Следствия".

    1.3.2. Инновации

    Платформа Mozilla не сводится к набору объектов и набору стандартов XML. В нее также включена инфраструктура, обеспечивающая обработку и применение приложений, спроектированных для использования этих объектов и стандартов.

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

    1.3.2.1. Chrome и инструментарий для разработки

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

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

    Mozilla обращается к файлам в этом каталоге, используя собственную схему URL, chrome:. Пример такого URL:

    chrome://notetaker/content/NoteTaker.xul
    

    Адрес, начинающийся с chrome:, обычно - лишь частный случай адреса, начинающегося с resource:. Схема URL resource:, используемая в Mozilla, указывает на корневой каталог, куда установлены файлы платформы, поэтому предыдущий URL обычно эквивалентен такому:

    resource://chrome/notetaker/content/NoteTaker.xul
    

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

    Вообще говоря, все, что находится в каталоге chrome, переносимо. Хотя всегда есть исключения, приложения, установленные в chrome Mozilla для Microsoft Windows, будут обладать примерно такими же наборами файлов, как и приложения, установленные в UNIX или Macintosh. Документы XUL обычно хранятся в chrome.

    Chrome - это больше, чем внешнее оформление для приложения, так как здесь может содержаться и графический интерфейс, и основная логика работы программы. Более всего chrome похож на развитый менеджер окон для X11 вроде Sawfish для GNOME (используется в ОС Linux/UNIX) или на расширенную тему оформления для Microsoft Windows. Возьмем для примера Sawfish. Sawfish можно настроить с помощью скриптов на каком-либо языке программирования. В результате обычно добавляются кнопки или украшения к строке заголовка окна. Sawfish недоступно внутреннее содержимое окна, поэтому украшения и кнопки могут находиться только на внешней его части. С другой стороны, действие chrome в Mozilla не выходит за пределы окна, но внутри него можно менять все, что угодно. Если бы программа Microsoft Word была создана на основе Mozilla и запускалась на UNIX, с помощью Sawfish можно было бы удалить эмблему W из строки заголовка окна, но поменять панели инструментов было бы нельзя. На рисунке 1.3 показана комбинация графических элементов управления Mozilla и Sawfish в одном окне. Окно содержит оформление Sawfish, строку состояния и панели инструментов, созданные с помощью chrome Mozilla, и простой HTML-документ.

    Mozilla для GNU/Linux c менеджером окон KDE.


    Рис. 1.3. Mozilla для GNU/Linux c менеджером окон KDE.

    Sawfish красиво оформляет строку заголовка окна, по меньшей мере, с четырьмя кнопками. Файлы в chrome добавляют ко внутренней части окна не менее двух панелей инструментов, меню, строку состояния и свернутую боковую панель. Все остальное - HTML.

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

    1.3.2.2. Оформление, темы, языковые и региональные настройки

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

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

    Адреса chrome изменяются в соответствии с текущим языком интерфейса браузера и текущей темой. Это значит, что поддержка и русской, и английской кнопки "Назад" (Back) зависит только от наличия файлов для этих языков в chrome.

    1.3.2.3. Источники и адресаты данных

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

    Такой подход означает, что часть кода отвечает за предоставление данных ("поставщик", в Mozilla это называется источником данных), а другая часть - за их обработку ("потребитель", в Mozilla это адресат данных). Такое разделение позволяет направлять потоки информации внутри платформы разными способами.

    RDF - одна из сложных технологий W3C, и мы пока не будем подробно на ней останавливаться. Источники и обработчики данных внутри платформы дают программисту возможность перемещать информацию по приложению с помощью операций, очень похожих на используемые в работе с базами данных. В свою очередь, это делает платформу немного похожей на программу четвертого поколения для создания клиентов баз данных.

    Самый сложный способ работы с источниками и обработчиками данных предполагает объединение данных в формате RDF для специальной обработки. Внутри браузера Mozilla источники и адресаты RDF-данных могут связываться промежуточной обработкой, которая будет играть роль фильтра.

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

    1.3.2.4. Дополнительная функциональность

    Помимо продуманной структуры платформа Mozilla отличается еще и тем, что пытается составить конкуренцию браузеру Internet Explorer от Microsoft. Чтобы достичь этой цели, у Mozilla должна быть какая-нибудь уникальная функциональность.

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

    • автозаполнение форм - Mozilla может запоминать, что было написано в этой или другой подобной форме в прошлый раз;
    • поиск по мере набора - пользователь может перейти к любой ссылке на странице или любому слову, просто набирая их;
    • быстрый запуск - Mozilla может запускаться быстрее, если будет частично храниться в памяти;
    • автоматическое изменение размеров изображений - Mozilla может автоматически изменять размер слишком крупного изображения, чтобы оно помещалось в открытое окно браузера;
    • фильтрация рекламных рассылок - в Mozilla встроена система, эффективно сортирующая рекламу ("спам").

    Разработчики Mozilla стараются повышать производительность своего продукта, постоянно сравнивая ее с производительностью Internet Explorer и Opera. Регулярно предпринимаются шаги для удаления или замены неэффективного кода из платформы и браузеров, основанных на ней.

    1.3.2.5. Работа с удаленными приложениями

    Платформа Mozilla предоставляет два способа доступа к приложениям, разработанным для нее и расположенным на удаленном web-сервере.

    Более простой метод - простая загрузка и запуск приложения. Как можно отобразить HTML-документ с формой для заполнения и отправки, так же можно локально загрузить и отобразить XUL-документ, давая пользователю возможность работать с окнами, меню и формами приложения. При этом приложение ведет себя как установленное локально; данный подход более всего напоминает некоторые методы Microsoft .NET.

    Другой вариант - использовать технологию XPInstall. Это система удаленной установки, которая загружает архив с сайта и устанавливает его в локальный каталог chrome, то есть это приложение отныне будет доступным пользователю всегда. Процессом установки управляет специальный скрипт, а сам архив может содержать приложения, написанные на XUL, и другие файлы любых типов.

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

    1.3.3. Cледствия

    Наконец, некоторые свойства платформы появляются в результате взаимодействия множества меньших ее составляющих.

    1.3.3.1. Интеграция с графическим интерфейсом

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

    На самом нижнем уровне Mozilla опирается на набор графических элементов управления из доступного набора текущей платформы. Это GTK на Linux, Win32 на Windows и инструментарий Macintosh. Существует версия Mozilla, использующая набор элементов Qt, но она долгое время не обновлялась; для X11 без GTK версии нет. Платформа обрабатывает ввод пользователем данных самостоятельно, используя механизм событий DOM 2.

    На следующем уровне, уровне взаимодействия с рабочим столом, Mozilla реагирует на обычные события, отправляемые окнам: фокус, свертывание, закрытие. Ее поведение вполне предсказуемо в системах UNIX при работе почти со всеми менеджерами окон X11. Последние версии Mozilla поддерживают встроенные в Windows и GNOME 2.0 механизмы тем. Mozilla поддерживает выделение, вырезание и вставку текста, но эти операции иногда должны быть реализованы вручную и выполняются автоматически только в самых очевидных ситуациях. Mozilla также поддерживает копирование в буфер обмена содержимого смешанных форматов. Это значит, что часть форматирования выделенного куска текста может быть сохранена при вставке в другое приложение, например, Microsoft Word. Mozilla поддерживает стандартные операции при работе с мышью, например, перетаскивание внутри приложения, но, опять же, порой это приходится делать вручную. Аналогично, при перетаскивании какого- нибудь объекта в окно Mozilla ничего не произойдет и не будет никакого визуальной реакции на это действие, если такая ситуация не была предусмотрена программистом заранее. В большей части приложений Mozilla присутствует код, отвечающий за обработку подобных действий.

    Наконец, на уровне приложений одной из самых сильных сторон Mozilla является язык описания графических элементов, XUL. Он позволяет связывать графические объекты простым и эффективным способом.

    1.3.3.2. Переносимость

    Mozilla можно запускать на самых разных ОС и в самых разных средах. На www.mozillla.org каждую ночь собираются тестовые версии платформы Mozilla, и сборки выкладываются в виде готовых для загрузки и установки файлов. Поддерживаются, по крайней мере, следующие операционные системы (ОС):

    • UNIX: Linux i386/PowerPC, FreeBSD, HP-UX, Solaris i386/SPARC, AIX, Irix;
    • миникомпьютеры: OpenVMS;
    • персональные компьютеры: Windows 95/98/Me/NT/XP, MacOS 9.x/X, OS/2, BeOS.

    Существуют также экспериментальные версии для таких систем как Amiga. Mozilla хорошо работает под ОС GNU/Linux, а эта ОС сама поддерживает большое количество разных аппаратных платформ. Вероятнее всего, стоит говорить о возможности Mozilla работать с любым аппаратным обеспечением, поддерживаемым GNU/Linux.

    Переносимость Mozilla подразумевает не только возможность запускать ее в разном окружении. Большая часть реализованных функций идентична для всех сред. В частности, типы файлов, используемых для создания приложения Mozilla (XUL, CSS, DTD, properties, JavaScript, RDF и т. д.) - полностью переносимые форматы. Теоретически приложение Mozilla можно запускать на любой платформе, на которой может запускаться сама Mozilla, без каких-либо дополнительных усилий со стороны разработчика. На практике же незначительные различия приводят к тому, что лишь небольшое число приложений оказывается полностью переносимым без проведения дополнительного тестирования и внесения некоторых изменений.

    1.3.3.3. Отсутствие проверки корректности документов

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

    Платформа Mozilla - приложение для работы в сети, часто получающее электронную почту, web-страницы и другие сообщения. Она следует правилу, приведенному выше, и его влияние видно программисту. За исключением режима полного соответствия стандартам для HTML, платформа интерпретирует получаемые XML-документы достаточно либерально, адаптируясь ко многим простым ошибкам, пропускам и дополнениям или игнорируя их.

    Для конечного пользователя это хорошо, потому что надоедливые сообщения об ошибках сведены к минимуму. Для программиста все иначе. Добавить что-то новое в приложение Mozilla очень легко, но это новшество может никак не проявляться. Отсутствие какой-либо реакции может означать, что внесенные изменения не обработаны корректно, содержат опечатки или не реализованы вообще. Программисту при написании кода нужна более чувствительная к ошибкам система.

    К счастью, основные проверки Mozilla выполняет правильно: XML- данные должны быть корректными, а JavaScript и CSS не должны содержать синтаксических ошибок. Конечно, это примитивные проверки, но и они полезны при работе в таких областях, где ошибки могут быть менее явными.

    1.3.3.4. Расширяемость

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

    Тем не менее, она достаточно удобна, чтобы ее можно было расширять, внося различные изменения, от незначительных до фундаментальных. Можно добавлять новые объекты, в том числе объекты XPCOM, новые теги XML, новые темы или поддержку новых языков, наконец, можно добавлять приложения. При этом необязательно регистрировать все в каком-то центральном реестре или следовать логике авторов других приложений.

    Так как исходный код платформы доступен всем, возможны какие угодно улучшения. А системы chrome и XPCOM Mozilla использовать очень легко, поэтому с ними можно экспериментировать как угодно. Некоторые эксперименты проводятся над внутренней структурой самой Mozilla, например, попытки ввести тег <canvas> для XUL. Людей, создающих экспериментальные расширения для Mozilla, объединяет сайт www.mozdev.org. Для русскоязычных разработчиков существует сайт www.mozdev.ru.

    1.3.3.5. Безопасность

    В Mozilla присутствуют те же функции защиты, что и в Netscape 4.x, плюс к ним еще добавлена модель поведения "только с того же узла". При ее использовании такие потенциально опасные операции, как, например, запись в файл, должны быть строго ограничены. Инструкция по выполнению такой операции, полученная с какого-то адреса в Internet (URL), может выполняться только над ресурсом с точно таким же адресом. Это ограничение позволяет апплетам Java обмениваться информацией только с собственным сервером. Подобным образом это ограничивает отправку HTML- и XUL-форм только на те серверы, с которых эти формы загружены.

    Самым важным аспектом безопасности платформы является то, что на приложение, установленное в chrome, не налагается никаких ограничений, кроме ограничений самой операционной системы.

    Работая с платформой, можно выбрать любую из моделей защиты, описанных в главе 16, "Объекты XPCOM". В стандартную установку платформы включена поддержка большинства стандартов шифрования и работы с сертификатами.

    1.4. Среда для быстрой разработки

    Окинув беглым взглядом платформу, давайте обратимся к стилю программирования, который называется быстрой разработкой, и посмотрим, из чего он состоит.

    Для проектов быстрой разработки характерны некоторые уникальные черты. Первая из них - само название - быстрая разработка приложений; для таких проектов важнейшая цель - оперативное получение результата.

    Сама платформа Mozilla не относится к такого рода проектам. Это проект с открытыми исходными кодами, для которого экспертные оценки, инновации и стратегия развития архитектуры важны не меньше, чем возможность быстро получить готовый продукт. Более того, платформу можно использовать во встроенном программном обеспечении (записанном в ПЗУ), но эта тема, увы, в книге не рассматривается. Основные ограничения для такого ПО: объем скомпилированного кода, надежность и меньшая нужда в техническом обслуживании. Для таких приложений быстрота разработки некритична.

    Так как существуют разные альтернативы, быстрая разработка не сводится к простому использованию платформы разработки, это еще и склад ума, и процесс. Вот некоторые важные характеристики проектов быстрой разработки приложений.

    1.4.1. Меньшие затраты времени, тот же эффект

    Первое найденное решение, достигающее желаемой цели, вероятнее всего, лучшее. Это очень важно - вам не нужно следовать каким-то жестким правилам. Кто выполняет работу быстрее, тот выигрывает. Даже если выбранная методика не самая изящная и, возможно, даже не самая гибкая, тот факт, что работа выполнена, очень важен. Если полученные результаты можно потом улучшить, это тоже плюс.

    Не стоит тратить годы на разработку совершенной архитектуры. Лучше создать что-нибудь реально работающее.

    1.4.2. Визуальные прототипы

    Поведение пользователей - самая важная проблема в разработке программного обеспечения. Их действия нельзя запрограммировать, а им самим приходится сталкиваться практически с любой частью программы, что влияет на всю структуру приложения. Много времени и усилий приходится тратить на то, чтобы достичь согласия между пользователем и интерфейсом для него. В случае быстрой разработки приложений возникает необходимость в проведении быстрых и гибких экспериментов по тестированию графического интерфейса. Для таких проектов нужна возможность эффективно создавать визуальные прототипы.

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

    1.4.3. Вертикальные решения

    Быстрая разработка используется для создания продуктов специального применения, не универсальных; неважно, будет это каталог для музея или программа анализа состояния фондов. Такие продукты называются вертикальными решениями. В этих случаях обычно не нужно делать приложение настолько гибким, чтобы его можно было приспособить и для выполнения задач другого класса. Это может быть будущей целью и только если продукт уже рабочий. Поэтому незачем настаивать на использовании универсального инструментария и языков более низкого уровня вроде C++, Perl или Tcl/Tk. Вместо этого лучше пользоваться специализированными средствами, подходящими для решения конкретной задачи. Mozilla как раз предназначена для использования в вертикальных решениях разных видов.

    В проектах быстрой разработки стоит использовать узкоспециализированные средства - универсальные не всегда лучше.

    1.4.4. Программное обеспечение готовое и собственной разработки

    Становится все сложнее прислушиваться к аргументу разработчиков "не мы это писали", которым они подкрепляют свой отказ использовать в проекте чужие наработки. Общее количество написанного кода постоянно увеличивается, и шансы, что кто-то до вас уже написал то, что вам нужно, все выше. Использовать уже готовые наработки - хорошая методика, позволяющая сохранить время и силы. Так можно значительно уменьшить затраты на программирование и быстрее получить работающий результат. Использование чужих наработок очень важно для быстрой разработки приложений.

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

    1.4.5. Тестирование отдельных компонентов

    Ограничения языков программирования низких уровней, например, C, хорошо известны. Проблемы с указателями и строгая типизация требуют использования хорошего компилятора. При этом считается, что на этапе компиляции можно сэкономить время тестирования, так как она проводится очень тщательно. Действительно, объем тестирования вручную может быть уменьшен, если при компиляции используется, например, флаг --pedantic.

    Если программисты делают примерно одно и то же количество ошибок в час, вероятно, этот довод действителен и для интерпретируемых языков. Однако тогда подразумевается, что разрабатывается очень нестандартная программа. В случае быстрой разработки использование какой-либо большой платформы (вроде Mozilla) означает добавление небольших фрагментов программы, а не объемных самостоятельных частей кода. Кусочек маленькой программы гораздо легче написать правильно с самого начала, так как в нем меньше точек ветвления (выражений с if). Если приложение разрабатывается на основе какого-то другого, большего, это большее приложение одновременно постоянно тестирует создаваемое приложение. В этом случае тщательное формальное тестирование может быть излишним.

    Во время быстрой разработки используется тестирование отдельных компонентов, так как маленькие фрагменты кода с большей вероятностью написаны правильно, чем одна большая программа.

    1.5. Эффективные проекты по быстрой разработке приложений для Mozilla

    Mozilla может быть эффективным средством разработки, но здесь есть один подвох: нужную для этого информацию удастся получить не сразу. Для понимания исходного кода Mozilla требуется очень много времени. База даных ошибок Mozilla - настоящие джунгли, в которых можно потеряться, а на сайте mozilla.org старая и новая документация смешиваются без проверки на точность или адекватность. Попытки разобраться во всем этом могут поколебать решимость использовать Mozilla. Вот несколько советов, которые помогут сочетать использование Mozilla со всеми достоинствами быстрой разработки и быстро получить эффективный результат.

    Прежде всего, нужно найти всю документацию, перечисленную в разделе "Практика" вводной главы. Этой документации и хорошей книги для начала будет достаточно. Маловероятно, чтобы для быстрой разработки приложения понадобился исходный код Mozilla.

    Время от времени придется заглядывать в файлы других приложений chrome, чтобы посмотреть, как данную проблему решали другие люди. Если требуется эффективный поиск по chrome, следует скачать архив с исходными кодами Mozilla и проиндексировать его программой вроде glimpseindex(1) для UNIX или проиндексировать распакованные файлы из chrome.

    Во время создания интерфейсов с помощью XUL не стоит быть перфекционистом. Сидеть и подгонять размеры окон буквально по пикселам - неправильный подход. Достаточно будет приблизительного наброска, уточнения, а косметические поправки стоит делать только в самом конце. Не нужно бороться с инструментами собственного изготовления; надо просто использовать их оптимальным образом. Например, если вам не нравится тег <grid>, но больше ничего не подходит, просто используйте <grid> и забудьте об этом на время. Всегда держите консоль JavaScript открытой, но не пишите код на JavaScript, пока заказчик не увидит созданные вами графические интерфейсы на XUL.

    При создании рабочего прототипа или экспериментировании не старайтесь слишком часто обращать внимание на XPCOM. Большая часть данных может быть обработана после отправки данных HTML-формы на web- сервер. Не следует усложнять приложение или пытаться освоить и задействовать все объекты XPCOM. Все они все равно никогда не пригодятся. При отсутствии собственного сервера для запуска отдельной программы можно пользоваться методом execute(). Не волнуйтесь, если ваше приложение не выглядит как картинка, все равно вы сможете потом привести его в порядок.

    Если возникла какая-то техническая проблема, которую не удается решить, постарайтесь не отвлекаться на бесполезные детали. Причина большинства бед - синтаксические ошибки или недопонимание. Практически все, что вам понадобится на платформе, - XUL или CSS, и синтаксические ошибки могут быть везде. Здесь не поможет исходный код: для того, чтобы хоть немного разобраться в нем, понадобится около месяца. База данных ошибок Bugzilla тоже не всегда помогает, а только отвлекает и тратит ваше время.

    Лучше всего сохранить копию текущего кода и пытаться удалять из него части, пока не станет ясно, в чем причина проблемы. Затем следует заглянуть в книгу или отправить вопрос в подходящую конференцию. Если это не поможет решить проблему, в конце концов, у вас появится эффективный тест для Bugzilla и, возможно, кто-то быстро откликнется на сообщение об ошибке. Вполне вероятно, что незначительное изменение кода исправит положение. Так как проверка корректности документов в Mozilla не слишком эффективна и структура самой платформы плохо документирована, не всегда будет сразу очевидно, почему такое небольшое изменение привело к исчезновению проблемы. Этому всегда есть рациональное объяснение, но чтобы найти его, может понадобиться много времени. А нам нужно двигаться дальше.

    Страстным поклонникам открытых исходных кодов не следует думать, что работа над самой платформой Mozilla будет быстрой. Это не что иное, как работа над обычным довольно большим проектом на C/C++. Вы сможете продвигаться в разработке, но не так быстро, чтобы изменения были заметны ежедневно - вероятнее всего, их влияние скажется не раньше, чем через месяц. Это хобби, которое займет ваше внимание надолго и будет отнимать много времени, если, конечно, это не ваша работа. На основе Mozilla можно быстро создавать новые приложения, но разработка самой платформы не так проста.

    1.6. Практика: запускаем платформу

    Сейчас мы попробуем исследовать платформу Mozilla и подготовиться к разработке нашего приложения NoteTaker.

    1.6.1. Установка

    Для этой книги мы рекомендуем использовать версию платформы 1.7, в нее включены как сама платформа, так и классическая Mozilla. Можно использовать и более ранние версии. Обновления к книге можно проверить на сайте www.nigelmcfarlane.com.

    Перед установкой следует прочитать рекомендации по установке для своей ОС, они достаточно полные. Их можно найти в разделе загрузки сайта mozilla.org. Некоторые менее очевидные эффекты установки рассматриваются здесь.

    В Windows 95/98/Me профили пользователей по умолчанию будут находиться в этом потайном месте:

    C:\Windows\Application Data\Mozilla
    

    Если вы пользуетесь Windows NT/2000/XP, найдите такой же каталог для текущего пользователя. Если вы работаете с UNIX-системой, профили будут расположены здесь:

    ~/.mozilla
    

    Рекомендуется одновременно использовать две установки Mozilla, каждая должна быть в отдельном каталоге. Одна из них будет резервной копией, которую мы не станем трогать, а другая будет использоваться для разработки. И в Windows, и в UNIX у нас будет только один профиль пользователя по умолчанию, и он будет использоваться обеими установками. Но можно для каждой из них создать свой профиль. Чтобы это сделать, нужно отключить в профиле для разработки электронную почту, иначе может возникнуть неразбериха. При наличии двух установок вам будут доступны два каталога chrome: в одном можно экспериментировать, а другой останется на всякий случай нетронутым.

    Если установить Mozilla дважды или установить две разные версии, нужно соблюдать осторожность при их одновременном запуске. Если это разные версии, их можно различать по номерам в строке заголовка окна, но запускать одновременно, особенно во время тестирования, не рекомендуется. Дело в том, что Mozilla использует механизм сигналов. Вторая запущенная Mozilla может послать сигнал первой и сразу же завершить работу. При этом уже запущенная копия откроет новое окно. Все будет выглядеть так, как будто вы запустили еще один экземпляр платформы и открыли окно, но на самом деле откроется еще одно окно уже запущенного экземпляра. Если вы привыкли просматривать web-страницы во время разработки и пользуетесь Windows, то лучше всего будет использовать для их просмотра Internet Explorer, он подходит и для работы с документацией. В UNIX легче запустить отдельные экземпляры платформы: следует просто воспользоваться командной строкой.

    В этой книге подразумевается, что платформа установлена в каталоги по умолчанию. Для Microsoft Windows 95/98/Me это

    C:\Program Files\Mozilla
    

    В системах UNIX обычно переоценивают значение каталога /usr, что усложняет слежение за разными версиями. Можете спросить об этом у любого системного администратора. Но по умолчанию для UNIX каталог установки таков:

    /usr/local/lib/mozilla-1.7
    

    В обоих случаях каталог chrome - подкаталог этих каталогов.

    Если вы пользуетесь UNIX-системой, и у вас две установки, нужно поискать в документации по установке информацию о переменной окружения MOZILLA_FIVE_HOME. Чтобы запускать программу из пиктограммы GNOME, требуется прочитать документацию. Панель GNOME - это прямоугольник в нижней части рабочего стола. Можете перетащить пиктограмму с панели прямо на рабочий стол.

    Материал этой книги проверялся на следующих системах: Microsoft Windows 98SE с Internet Explorer 6.0 и обновлениями; Red Hat GNU/Linux 7.2 с GNOME 2.02. Также проводилось поверхностное тестирование на Microsoft Windows XP и MacOS X.

    1.6.2. Параметры командной строки

    Открыть справку по параметрам командной строки для браузера Mozilla в UNIX можно, указав при запуске параметр --help. В Microsoft Windows можно указать -h или -help, но только если запускать программу из командной строки ("Сеанс MS-DOS") или если ее вывод перенаправлен в файл. В таблице 1.1 приведены все доступные параметры, но не во всех системах наборы параметров одинаковы.

    Таблица 1.1. Параметры командной строки при запуске Mozilla

    -addressbookадресная книга почтового клиента
    -chatзапуск IRC-клиента, если он установлен
    -compose field1=val1, field2=val2,etcсоздание сообщения электронной почты
    -chrome URLоткрыть окно chrome, содержимое которого находится по заданному URL
    -consoleдополнительное окно терминала, в которое выводится отладочная информация и поступает вывод dump()
    -contentLocale ЯЗЫКоткрыть обычное окно, но предпочтительный язык для HTML будет ЯЗЫК
    -CreateProfile ИМЯоткрыть обычное окно, используя новый профиль ИМЯ
    -edit URLоткрыть в Компоновщике файл, находящийся по заданному URL
    -h -help --helpпоказать список доступных параметров командной строки
    -height Nоткрыть окно высотой N пикселов
    -installerутилита для импортирования профилей из Netscape 4.x
    -jsconsoleоткрыть консоль JavaScript
    -mailоткрыть клиент для чтения почты и конференций
    -newsоткрыть клиент для чтения почты и конференций
    -nosplashне показывать заставку при запуске
    -P ИМЯоткрыть окно от имени пользователя ИМЯ
    -ProfileManagerоткрыть окно менеджера профилей
    -ProfileWizardоткрыть окно мастера создания профилей
    -SelectProfileоткрыть окно выбора профиля
    -quietне показывать заставку при запуске
    -UILocale ЯЗЫКоткрыть обычное окно, но языком интерфейса будет ЯЗЫК
    -venkmanоткрыть отладчик JavaScript, если он установлен
    -width Nоткрыть окно шириной N пикселов

    1.6.3. Каталоги chrome и адресные книги

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

    Структурно адресная книга представляет собой часть почтового клиента. Весь почтовый клиент написан согласно принципам быстрой разработки с использованием концепции chrome. Это значит, что в нем не используется C/C++, хотя часто применяются компоненты XPCOM, написанные на этих языках. Это также означает, что вы можете настроить для себя или переписать интерфейс классического почтового клиента так, как вам угодно. Весь интерфейс написан на JavaScript и XUL и использует лишь несколько дополнительных технологий. Почтовый клиент хранится в каталоге chrome.

    В этом каталоге находятся текстовые файлы и архивы JAR. JAR расшифровывается как Java Archive (архив Java). Вообще этот формат был создан как часть проекта Java компанией Sun Microsystem. Но файлы, используемые в Mozilla, - обычные ZIP-архивы для UNIX и Windows. В Windows удобно связывать этот тип файлов с программами вроде WinZip, иначе по двойному щелчку виртуальная машина Java попытается запустить их. При связывании JAR-файлов c WinZip могут возникнуть небольшие проблемы. Если по двойному щелчку по JAR-файлу он архивируется еще раз, нужно установить расширение WinZip Command Line Support Add-on, которое можно скачать с сайта www.winzip.com. Если такой возможности нет, следует просто выбирать в меню программы File | Open Archive... В UNIX-системе нужно использовать zip/unzip, но не gzip/gunzip. В Mac OS вам понадобится StuffIt! или подобная программа.

    На рисунке 1.4 показано содержимое типичного каталога chrome для ОС Microsoft Windows.

    Каталог chrome в Altlinux Linux


    Рис. 1.4.  Каталог chrome в Altlinux Linux

    По снимку окна видно, что здесь установлена Mozilla с поддержкой двух языков: en-US (американский английский, по умолчанию) и fr-FR (французский). Mozilla автоматически создала каталог overlayinfo и отдельные текстовые файлы, которые, тем не менее, можно редактировать вручную.

    • chrome.rdf - текстовая база данных с информацией обо всех используемых JAR-архивах.
    • toolkit.jar содержит инструментарий, общий для всех приложений chrome.
    • classic.jar содержит тему Classic.
    • messenger.jar содержит клиент почты и конференций.
    • comm.jar содержит файлы chrome для обычных окон браузера и редактора HTML.

    Может показаться, что имена файлов подчиняются некоему правилу, но это не совсем так. Просто существует соглашение об именовании JAR- файлов, которые содержат только локализацию, оформление или компоненты. Использовать JAR-архивы необязательно, файлы могут храниться в несжатом виде в любом месте каталога chrome. Второе правило определяет структуру каталогов внутри chrome. Если ему не следовать, некоторые функции платформы могут не работать, поэтому данное правило важнее. Его пример показан на рисунке 1.5.

    Внутренние каталоги chrome (для всех ОС)


    Рис. 1.5.  Внутренние каталоги chrome (для всех ОС)

    В каталоге chrome находятся два приложения, packageA и packageB. Самые важные каталоги - content, locale и skin - подчеркнуты. В первом из них хранится все, что относится к логике работы приложения; во втором - файлы поддержки разных языков интерфейса; в третьем - элементы оформления графического интерфейса. Приложение, разбитое на три части, легче использовать с разными языками и темами. Внутри этих трех каталогов могут быть и другие каталоги. В нашем примере это каталоги subdir.

    Если мы заглянем внутрь какого-нибудь JAR-архива, то увидим, что не во всех из них содержатся эти три каталога. Например, в архиве modern.jar, содержащем файлы темы Modern, присутствует только каталог skin, а в venkman.jar, отладчике JavaScript, есть все три каталога. Кроме того, структура каталогов внутри JAR-файлов немного отличается от показанной на рисунке 1.5. Это сделано для того, чтобы ускорить поиск по архивам. Mozilla автоматически преобразует структуру каталогов архивов так, чтобы она соответствовала стандартной (показанной на рисунке).

    Все эти ограничения по именованию и структуре каталогов можно игнорировать, помня о двух последствиях. Во-первых, скорее всего, ваше приложение станет неорганизованной кучей файлов. Во-вторых, URL chrome обычно автоматически меняются, чтобы использовать текущий язык интерфейса и текущее оформление. Если тема MyTheme и поддержка языка MyLocale не находятся в соответствующих каталогах, они могут отображаться, но только если они жестко закодированы, кроме того, их нельзя будет изменить, если пользователь изменит текущий язык интерфейса или оформление.

    Вернемся к адресной книге. На рисунке 1.6 показаны файлы, составляющие это приложение.

    Часть архива messenger.jar, составляющая адресную книгу.


    Рис. 1.6.  Часть архива messenger.jar, составляющая адресную книгу.

    Часть архива messenger.jar, составляющая адресную книгу.

    На снимке экрана видно, что приложения chrome могут быть большими: исходный код из этого архива в несжатом виде составляет 1,5 Мбайт. Некоторые скрипты JavaScript в этом архиве достигают объема в 100 Кбайт. Ни один из этих файлов не компилируется, они все используются Mozilla такими, какими они написаны.

    Ближайшим эквивалентом файла main.c C-проектов здесь будет файл addressbook.xul. Это хорошая демонстрация функций Mozilla. Если открыть этот файл, сразу становятся очевидны его основные особенности: XML-синтаксис, использование тегов <?xul-overlay>, <?xml-stylesheet?> и <script> для включения других файлов, широкое использование DTD- файлов и ссылок на сущности, объявления пространств имен XML, обработчики событий и много-много тегов, которые, похоже, описывают графический интерфейс.

    Файлы, необходимые для работы адресной книги, содержатся не только в этом архиве. Дополнительные файлы можно найти в каталогах с темами Modern и Classic. Если удалить весь chrome или повредить его, нельзя будет пользоваться адресной книгой и, вероятно, вообще невозможно будет запустить Mozilla. Chrome жизненно важен для Mozilla.

    Можно также менять Mozilla вне каталога chrome. В главе 17, "Система распространения и установки - XPInstall", рассказывается об XPInstall; эта технология позволяет заменять почти все файлы в установке Mozilla. Некоторые из этих файлов, например, содержащие настройки, имеет смысл менять, и далее в книге будет рассказано, когда это следует делать, а когда нет. Другие файлы, например, файлы ресурсов в каталоге res, лучше не трогать. Их не нужно менять потому, что они уже были тщательно оттестированы и вряд ли удастся улучшить их. Можно менять и скомпилированные файлы, но давайте оставим написание кода на C/C++ на следующий раз. Наконец, есть файлы в профилях пользователей, допускающие изменения. Файлы с настройками и расширением .js, пожалуй, единственные, которые время от времени нужно менять вручную.

    1.6.4. "hello, world"

    Пожалуй, ни одна книга по программированию не обходится без этой простой программы, прославившейся благодаря Кернигану и Ритчи и их книге "Язык программирования Си". Оригинальная фраза "hello, world" была затем изменена на "Hello, World!", когда C стал стандартом ANSI. Mozilla сейчас еще находится на этапе развития, поэтому мы будем использовать первую версию строки.

    Mozilla отображает все простые версии "hello, world" на HTML, какие только можно придумать. Вариантов написания может быть бесконечно много. В листинге 1.2 показаны варианты для стандартного режима и для режима совместимости.

    <html>
      <body> hello, world </body>	
    </html>
    
    <?xml version="1.0"?> 
    <!DOCTYPE html PUBLIC 	
      "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 	
      <body>hello, world </body>
    </html>
    
    Листинг 1.2. "hello, world" на HTML и XHTML 1.0

    Но мы, разработчики приложений, напишем "hello, world" на XUL, языке разметки графического интерфейса пользователя. Здесь тоже очень много вариантов, но мы приведем самый простой из них, который рассказывает об этом языке совсем немного.

    <?xml version="1.0"?> 
    <!DOCTYPE window> <window xmlns=
      "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> 	
      <box>
        <description>hello, world</description> 	
      </box> 
    </window>
    
    Листинг 1.3. "hello, world" на XUL

    Прежде всего, нужно заметить, что для вывода обычного текста в XUL следует использовать специальный тег с очень длинным именем (<description>). Файлы XUL обычно не содержат просто текст, но содержат разметку. Идентификатор пространства имен XML - неявная ссылка на фильм "Охотники за привидениями". XUL произносится как "зул", а там был отрицательный персонаж именно с таким именем. Кроме того, Venkman - тоже оттуда, но это уже фамилия положительного героя. Эта строка нигде не появляется, кроме как внутри Mozilla. По адресу этого пространства имен в Internet есть страница-пустышка, она ни для чего не используется.

    Чтобы посмотреть, как работает наша первая программа, нужно сохранить ее текст в файл под названием hello.xul в любом каталоге. Для таких простых случаев это необязательно должен быть chrome. Загрузите этот файл в Mozilla, используя протокол file:, то есть просто введите его локальный адрес в строку адреса, как это обычно делается. Результат должен быть похож на показанный на рисунке 1.7 (при условии, что файл находился в каталоге /tmp).

    XUL-версия "hello, world", открытая как обычный документ

    Рис. 1.7.  XUL-версия "hello, world", открытая как обычный документ

    Содержимое файлов XUL необязательно должно появляться в окне браузера. Закройте Mozilla и запустите ее из командной строки с параметром -chrome. Для UNIX команда может выглядеть примерно так:

    /usr/local/lib/mozilla-1.7/mozilla -chrome file:///tmp/hello.xul
    

    А для Microsoft Windows так:

    "C:\Program Files\Mozilla\mozilla.exe" -chrome "file:C:/tmp/hello.xul"
    

    В любом случае результат будет похож на показанный на рисунке 1.8.

    XUL-версия "hello, world", открытая как файл chrome

    Рис. 1.8.  XUL-версия "hello, world", открытая как файл chrome

    Наш второй результат более типичен для приложений, разрабатываемых для Mozilla. Это только начало.

    1.6.5. Подготовка к разработке NoteTaker

    Приложение NoteTaker послужит небольшим примером, над которым мы будем работать в течение всей книги. Оно не будет самостоятельным, а будет работать вместе с классическим браузером Mozilla. Когда пользователь установит NoteTaker, вся первоначальная настройка будет сделана автоматически. Как разработчики, мы должны делать все сами с самого начала.

    Единственное, что нам нужно еще сделать для установки NoteTaker, - создать несколько каталогов и зарегистрировать имя notetaker как официальное расширение chrome. Тогда мы сможем обращаться к этому приложению с помощью URL chrome:. Вот инструкции по созданию каталогов:

    1. Перейдите в каталог chrome Mozilla.
    2. В нем создайте каталог notetaker и перейдите в него.
    3. Здесь создайте каталоги content, locale и skin.
    4. В каталоге locale создайте каталог en-US.
    5. В каталоге skin создайте каталог classic или modern, а лучше оба.

    Регистрация расширения производится в файле chrome/install- chrome.txt. Чтобы зарегистрировать NoteTaker как расширение chrome с названием "notetaker", нужно просто добавить эту строчку в конец файла install-chrome.txt и перезапустить платформу:

    content,install,url,resource:/chrome/notetaker/content/
    

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

    1.7. Отладка: отладка извне

    Mozilla - достаточно сложная система. Если настроить ее некорректно, сложнее будет заставить работать приложения. Число непонятных проблем уменьшается с каждой исправленной ошибкой, но лучше попытаться достичь успеха с самого начала.

    Можно использовать большое число настроек Mozilla, чтобы упростить себе жизнь. Самым очевидным решением будет научиться пользоваться отладчиком JavaScript, его кодовое название - Venkman. Вы найдете его, выбрав "Инструменты" | "Web-разработка" | Отладчик JavaScript. Если вам нравятся графические многофункциональные отладчики, это как раз для вас. Я предпочитаю философию UNIX - множество маленьких инструментов - поэтому здесь нет руководства по отладчику. Чтобы запустить отладчик, нужно добавить следующую строку в скрипт своего приложения:

    debugger;
    

    В Netscape 7.0 не входит отладчик (в 7.1 он есть), но можно загрузить и установить его самостоятельно. Найти отладчик отдельно можно на сайте DevEdge, http://devedge.netscape.com.

    1.7.1. Важные настройки

    Прежде всего, необходимо правильно настроить Mozilla. Настроек в Mozilla больше тысячи. И только небольшое их подмножество доступно через меню "Правка" | "Настройки".... Все остальные настройки задаются вручную с помощью текстового редактора. Во время редактирования настроек вручную Mozilla не должна быть запущена, потому что иначе при завершении работы она перезапишет измененные настройки. То же относится и к продуктам Netscape 4.x.

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

    Чтобы сохранить изменения настроек на диск, необходимо отредактировать файл prefs.js или preferences.js в нужном профиле пользователя, создать новый файл настроек под названием user.js в профиле или отредактировать файл all.js в каталоге установки Mozilla. Этот файл находится в подкаталоге defaults/prefs. при редактировании можно просто скопировать уже существующую строку и изменить ее. Порядок записи настроек не имеет значения.

    В таблице 1.2 приведен список настроек, которые разработчикам приложений лучше всего изменить.

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

    Возможно, вы захотите тестировать свои приложения как на Netscape 7.0, так и на платформе mozilla.org. В Microsoft Windows сложно отключить быстрый запуск для Netscape 7.0. Даже если во время установки выбрать "нет", быстрый запуск все равно может использоваться. Постарайтесь найти и удалить этот ключ из реестра Windows:

    HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
    
    Таблица 1.2. Важные настройки, значения которых разработчикам рекомендуется изменить

    НастройкаНужное значениеОписание
    browser.dom.window.dump.enabledtrueИспользовать функцию диагностики dump()
    nglayout.debug.disable_xul_cachetrueПо умолчанию приложения XUL кэшируются в Mozilla. Но во время тестирования нужно следить за результатами изменения кода, то есть необходимо, чтобы каждый раз файл загружался заново
    javascript.options.stricttrueБолее подробный вывод на консоль JavaScript
    nglayout.debug.disable_xul_fastloadtrueВторой кэш XUL, загружающийся при запуске из файла .MFL. Если оставить его включенным, это может сбивать с толку
    signed.applets.codebase_principal_supporttrueУжесточает все ограничения с целью обеспечения защиты для загружаемого содержимого за исключением случаев, когда пользователь все-таки вынужден дать привилегии доступа
    xul.debug.boxfalseЕсли это необходимо, отладку можно включить и из самого файла XUL

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

    1.7.2.1. Поведение в Microsoft Windows

    Если новое окно открывается в Microsoft Windows, оно будет относиться к текущему запущенному экземпляру Mozilla. Это значит, что в любой момент времени может быть запущен только один экземпляр Mozilla и, естественно, только одна ее версия.

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

    То есть если у вас установлены две версии Mozilla, обычно вы не можете запустить их обе одновременно. Однако это ограничение можно обойти. Для этого требуется сделать копию исполняемого файла Mozilla, отредактировать ресурсы этой копии с помощью редактора ресурсов (например, из Microsoft Visual C++) и изменить строки ресурсов 102 и 103 в таблице строк на что-нибудь другое. Сохраните изменения. Теперь эта копия может запускаться как отдельный экземпляр исходного исполняемого файла. Для нее также должен быть создан отдельный профиль. Но необходимо помнить, что вы сюда вносили изменения.

    Кроме того, можно (и иногда очень легко) создать некорректное XUL- приложение. Когда открываются окна такого приложения, кажется, что все в порядке, хотя они могут вести себя не так, как следовало бы. В некоторых случаях при закрытии таких окон платформа все равно остается запущенной. Тогда следующее открытое окно будет использовать уже запущенную платформу, хотя та может работать с ошибками из-за запуска некорректного приложения.

    Если вам кажется, что у вас именно такой случай, нажмите Control- Alt-Delete и проверьте, не запущены ли какие-нибудь процессы Mozilla, хотя все окна уже закрыты. Если вы их найдете, эти процессы спокойно можно уничтожить.

    1.7.2.2. Поведение в UNIX X11/GTK

    В системах UNIX/Linux запуск Mozilla из командной строки или пиктограммы на рабочем столе никак не будет взаимодействовать с уже запущенной платформой. То есть это коренным образом отличается от поведения платформы в Microsoft Windows и действительно для версий не ниже 1.4.

    Иногда это неудобно, поскольку в приложениях XUL обычно нет стандартных меню, предоставляющих доступ к таким удобным инструментам как Инспектор DOM, отладчик и консоль JavaScript. Без таких меню непонятно, как открыть эти инструменты, поэтому их сложнее использовать во время разработки. В Windows можно просто запустить еще одно окно навигатора и воспользоваться его меню. В UNIX так сделать нельзя.

    Тем не менее, консоль JavaScript можно запустить довольно легко, достаточно просто добавить этот ключ к команде запуска своего приложения:

    -jsconsole
    

    Более общий обходной путь подразумевает включение небольшого скрипта в ваше приложение (см. листинг 1.4). Чтобы этот скрипт работал, приложение должно быть установлено в chrome, так как необходимо снять некоторые ограничения безопасности.

    <script> 
    var options = "chrome,extrachrome,menubar,resizeable,scrollbars,
     status,toolbar"; var domins = "
     chrome://inspector/content/inspector.xul"; 
    var jscons = "chrome://global/content/console.xul"; 
    if (window.name == "_blank") { 	
      setTimeout("window.open
        '"+location+"','test','chrome')",5000); 
      setTimeout("window.close()",6000); 	
      window.open(domins,"_blank",options); 	
      window.open(jscons,"_blank",options); 
    } 
    </script>
    
    Листинг 1.4. Запуск инструментов отладки для Mozilla вместе с приложением

    Этот скрипт запускает Инспектор DOM и консоль JavaScript при загрузке документа, а затем заменяет документ его копией в другом окне. Последнее нужно, чтобы окно приложения открылось последним. Порядок загрузки позволяет Инспектору DOM "заметить" окно приложения, которое потом можно исследовать.

    Между Mozilla и тем, что вы видите на экране в ОС UNIX, находится множество промежуточных слоев - других приложений. Если активно экспериментировать, можно натолкнуться на ошибки, скрывающиеся где- нибудь в самой графической среде. Если что-то "зависает" или ведет себя совсем не так, как ожидалось, в этом сразу винят Mozilla, но причина может быть и в какой-нибудь другой программе. С помощью команд top(1), ps(1) и kill(1) завершайте работу одной программы за другой, пока проблема не исчезнет. Вот примерный порядок проверки:

    1. Перезапустить все процессы Mozilla, очистив файлы .mfasl, если они есть.
    2. Перезапустить менеджер окон (sawfish, twm, enlightenment и т.д.).
    3. Перезапустить всю графическую среду (GNOME, KDE, OpenStep и т. д.).
    4. Перезапустить X-сервер (XFree86, vncserver и т. д.).
    5. Выйти из системы и зайти в нее снова.
    6. Перезагрузить компьютер.

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

    1.7.3. Параметры компиляции

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

    Чтобы собрать Mozilla c включенными функциями отладки, потребуется использовать параметр --disable-debug. Это параметр для скрипта configure, который запускается перед началом компиляции. Если отладка включена, в компиляции будут участвовать те части кода, которые относятся к функциям отладки. Чтобы не указывать этот параметр и многие другие вручную при запуске configure, можно создать специальный файл, откуда скрипт и будет считывать параметры. Этот файл можно легко создать с помощью формы, расположенной на http://webtools.mozilla.org/build/config.cgi.

    Чтобы понять, какие переменные окружения активируют какие-либо функции отладки, изучите исходные коды Mozilla. Это также полезно, если вы хотите узнать, какие еще функции отладки можно активировать во время отладки (например, #ifdef EXTRA_DEBUG).

    1.8. Итоги

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

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

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


    об авторе

    Администрация сайта не несет ответственности за содержание и соблюдение копирайта на материалы,
    найденные в свободном доступе на просторах интернета без указания авторских прав на них.
    Документация предоставляется, размещается и публикуется пользователями сайта с максимально известной информацией об источнике.
    Если Вы являетесь правообладателем представленных статей, и не хотите их здесь видеть - напишите нам, и мы с радостью их удалим с сайта





    Сайт создан в системе uCoz