Часть 7. Тестирование и отладка тулбара

На протяжении всего процесса разработки нашего расширения вы, конечно, сталкивались со всякими проблемами. А чтобы эти проблемы пофиксить, их нужно сначала обнаружить. Какого рода инструменты помогут в отладке и решении проблем с нашим расширением для FireFox? К счастью, такие инструменты имеются. Следующие методы очень помогли мне в разработке Googlebar Lite, и, надеюсь, вам тоже пригодятся.

Что делать, если FireFox сломался?

Однажды с вашим расширением может случиться такая серьезная ошибка, в результате которой FireFox откажется работать. Если такое произойдет, сперва проверьте, что процесс firefox запущен и "висит". Если так, просто убейте этот процесс (Ctrl+Alt+Del вам в руки — прим. пер.). После того, как процесс остановлен, запустите Firefox в безопасном режиме. Есть несколько способов сделать это:

В безопасном режиме FireFox загрузится без расширений и тем. Раз FireFox запустился, теперь вы можете открыть Инструменты -> Расширения и удалить свое сглючившее расширение. После перезапуска браузера все должно быть нормально.

Ведение лога в консоли JavaScript

Один удобный способ тестировать JavaScript код — выводить отладочные значения в консоль JavaScript, которая доступна через Инструменты -> Консоль JavaScript. Для этого нужно получить доступ к экземпляру nsIConsoleService интерфейса. Используйте следующий код:

const GBLTut_ConsoleService =
      Components.
          classes['@mozilla.org/consoleservice;1'].
              getService(Components.interfaces.nsIConsoleService);

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

function GBLTut_Log(aMessage)
{
    GBLTut_ConsoleService.logStringMessage('My_Extension: ' + aMessage);
}

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

GBLTut_Log("The value of the URL variable is: " + URL);

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

Запись логов в стандартную консоль

Альтернативный способ сохранения отладочной информации доступен через механизм стандартной консоли. Перед тем, как начать пользоваться этим способом, нужно проделать некоторые операции с нашим браузером. Наберите в адресной строке about:config и нажмите ентер. (не удивляйтесь — перед вам своего рода "реестр" мозиллы — здесь хранятся все настройки браузера. Оглядитесь — это интересно =) — прим. пер.). Щелкните правой кнопкой мыши на списке настроек и выберите в контекстном меню "Создать -> Булево". Назовите новую настройку browser.dom.window.dump.enabled и установите ее в true.

Следующий шаг — нужно добавить параметр -console к ярлыку FireFox. Этот параметр заставит появляться стандартную консоль вывода каждый раз, когда вы запускаете FireFox. Теперь любой вывод, совершенный функцией dump() будет появляться в окне консоли. Функция dump() работает так же, как стандартная функция JavaScript alert().

Полезные установки браузера

Существует две установки браузера, которые могут значительно упростить отладку. Обе можно выставить в about:config, и обе воздействуют на вывод сообщений в консоль JavaScript.

Первая опция, javascript.options.showInConsole, будучи выставленной в true, будет сбрасывать в консоль JavaScript все ошибки, которые появятся в XUL файлах. По умолчанию она установлена в false, поэтому нужно вручную изменить ее значение. Вторая опция, javascript.options.strict, позволит более строго отображать предупреждения JavaScript в консоли JavaScript. Она тоже установлена в false по умолчанию. Поскольку многие разработчики не включают эту опцию при написании своих скриптов, вы увидите множество предупреждений, относящихся к их кодам. В принципе, эти предупреждения можно игнорировать.

Инспектор DOM

Одним из лучших помощников для тех, кто пишет расширения, будет инспектор DOM (Document Object Model, объектной модели документа). Этот инструмент позволяет изучать объектную модель, включая HTML и XUL. Инспектор DOM поставляется вместе с Firefox, однако по умолчанию при установке он не выбран, чтоб его установить, нужно воспользоваться расширенной ("Advanced") установкой. С помощью этого инструмента можно собрать большое количество ценной информации, так что настоятельно рекомендую научиться им пользоваться.

Вот несколько руководств по работе с инспектором DOM:

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

Динамическая разработка

Динамическая разработка расширений стала проще чем когда либо с выходом Firefox 1.5. Принципиально новый файл chrome.manifest упрощает процесс регистрации chrome и позволяет вам разрабатывать приложения в реальном времени. Используя этот механизм, вы можете указать на каркас (framework) расширения на жестком диске (вместо JAR файла). Вы можете править различные XUL и JavaScript файлы, и изменения будут отражаться мнгновенно, без необходимости перепаковывать расширение. Узнать больше об этой новой фиче вы можете в статье "getting started with extension development" в базе знаний MozillaZine.

То ли этого не было в статье, то ли я забыл. Есть еще вот такая полезная префа, которую желательно создать в about:config и установить в true:

nglayout. debug. disable_xul_cache

В результате, опереленные Вами элементы интерфейса не будут кешироваться. Скорее всего не работает в FF < 1.5

Кстати, динамическую разработку можно осуществлять и в более ранних версиях FireFox, однако это дело куда более сложное. Если есть желание разобраться, ознакомьтесь со статьей об отключении кэша XUL.

Ну вот и все =)