Россия, Звенигород |
Окна и панели
10.10 Отладка: диагностика окон
Прежде чем приступить к обсуждению диагностики окон, следует сделать одно замечание о работе под Microsoft Windows. В процессе разработки и отладки приложения XUL, еще полного ошибок, в платформе Mozilla иногда возникает сбой. В результате платформа остается загруженной в оперативную память даже после закрытия последнего окна Mozilla. Поэтому, когда вы запускаете приложение заново, оно использует старый экземпляр платформы, находящийся в памяти. Наиболее явный признак этой ситуации – вы то и дело правите файлы и сохраняете сделанные изменения, но при новом запуске приложения не видите результатов этих изменений.
Помочь в диагностике проблемы может тот факт, что окно заставки появляется только при запуске платформы. Если вы не видите заставки и сделанных изменений, вы, вероятно, столкнулись с описанной проблемой. При помощи клавиш Control-Alt-Del нужно открыть список запущенных процессов и завершить все процессы Mozilla.
К счастью, по мере того, как платформа становится все более зрелой, эта проблема встречается все реже. Однако знать о ней не помешает, это поможет избежать длительного и безрезультатного тестирования. В процессе отладки вы можете столкнуться со многими проблемами, и это лишь одна из них. Причины остальных следует искать в вашем собственном коде.
При анализе работы сложного приложения ничто не может заменить информации о состоянии программы, которая в реальном времени выводится в специальное окно. Платформа Mozilla позволяет добиться этого различными способами.
Простейший из них – использовать метод dump(), описанный в "Скрипты" , "скрипты". Вывод этого метода отображается в текстовой консоли, которая открывается при запуске Mozilla с ключом - console.
Почти столь же просто изучать работу приложения при помощи многочисленных панелей отладчика JavaScript. Сначала запустите отладчик вручную. Для знакомства с ним можно открыть все возможные панели, используя меню Вид | Показать / Скрыть. Как можно раньше по ходу исполнения скриптов JavaScript в документе HTML или XUL, который вы хотите отлаживать, добавьте команду:
debugger;
При выполнении этой строки скрипта управление передается отладчику, и с этого момента можно выполнять скрипты пошагово. Следует использовать панель инструментов для управления процессом отладки и внимательно изучать содержимое различных панелей отладчика.
В HTML объект document предоставляет методы open(), close() и write(). Поскольку содержимое начинает отображаться до окончательной загрузки документа, на основе этих методов можно организовать последовательный вывод диагностической информации. Окно HTML можно открыть из другого окна при помощи метода window.open(), а затем по мере необходимости добавлять к нему содержимое при помощи метода document.write().
XUL не поддерживает последовательного отображения загружаемых данных в стиле HTML, однако сходного результата можно достичь другими средствами. При помощи метода window.open() необходимо создать окно для вывода диагностической информации на основе простейшего документа XUL. Этот документ не должен иметь никакого содержимого помимо <window orient="vertical">. Для добавления содержимого в это окно следует использовать код, показанный в листинге 10.9:
var win = window.open( …new window …); function logger(message) { var obj = win.document.createElement("description"); var txt = win.document.CreateTextNode(message); obj.appendChild(txt); win.document.appendChild(obj); }Листинг 10.9. Вывод диагностической информации в новое окно XUL
Нужно иметь в виду, что элементы нового документа создаются с использованием свойств и методов данного, а не исходного документа. Эту систему можно дополнить полосами прокрутки и другими элементами управления. Если приложение считается защищенным (т.е. установлено в chrome или защищено другим способом), столь же просто использовать для диагностики консоль JavaScript. Пример работы с консолью приведен в листинге 10.10:
// Find the console var C = Components; var obj = C.classes["@mozilla.org/consoleservice;1"]; var iface = C.interfaces.nsIConsoleService; var cons = obj.getService(iface); // Log a message cons.logStringMessage("test message");Листинг 10.10. Вывод сообщений на консоль JavaScript.
Аналогичным образом можно организовать вывод на консоль Java. Преимущество этого метода состоит в том, что консоль Java не является окном XUL. Для ее использования не требуется браузера, собранного с возможностью отладки, а также текстовой консоли операционной системы (которая нужна для вывода при помощи dump() ). Сообщения могут выводиться на консоль Java, не нарушая состояния существующих окон XUL. Эта консоль не видна при получении списка открытых окон средствами XUL. Для вывода сообщения непосредственно на консоль Java можно использовать следующую старомодную строку, хорошо знакомую разработчикам со времен Netscape 4.x (здесь имеет место вызов статического метода класса):
window.java.lang.System.out.println("my message");
Защищенное приложение может самостоятельно создать консоль Java, как показано в листинге 10.11.
var C = Components; var obj = C.classes["@mozilla.org/oji/jvm-mgr;1"]; var iface = C.interfaces.nsIJVMManager; var cons = obj.getService(iface); if (cons.JavaEnabled) cons.showJavaConsole();Листинг 10.11. Открытие консоли Java из скрипта
Прежде чем открыть окно, этот код проверяет, не отключил ли пользователь подсистему Java в целом.
10.11 Итоги
Система управления окнами в Mozilla разработана под значительным влиянием технологии, используемой в традиционных браузерах. Применение метода window.open() и ряда специализированных тегов XUL позволяет достичь значительных результатов. Эти теги представляют интерес, в первую очередь, для разработчиков, чьи приложения подобны браузеру.
Архитектура XPCOM содержит целый ряд интересных объектов для управления отображаемыми документами, среди которых следует особо отметить DocShell. Эти объекты насыщены функциональностью, необходимой для сложной работы с содержимым.
Стили CSS обеспечивают дополнительные возможности настройки окон Mozilla. При помощи стилей разработчик приложения может придать окнам вид, характерный для данной платформы, чтобы приложение не выглядело чужеродным.
Многие из тегов XUL, уже обсуждавшихся в этой книге, носят статический характер и сходны с тегами для разметки отображаемого содержимого. Однако приложения часто бывают динамическими и ориентированными на работу с данными, а не статическими и ориентированными на отображение содержимого. Mozilla идет навстречу этим потребностям, предлагая новаторскую поддержку для задач обработки данных. Мы познакомимся со средствами этой поддержки в нескольких следующих лекциях, начав с языка RDF.