XUL/FAQ
Как сделать окно на весь экран?
В 1.8 версии движка - никак. Можно установить размеры окна равными размеру экрана, но даже в этом случае при запуске в xulrunner, окно коллапсирует к размерам по умолчанию. Поэтому в 1.8 версии нужно отнимать 1 от размера экрана (тем не менее, на новых версиях движка 1.8, стоит всё же проверить способ и без вычитания единицы, возможно Mozilla наконец-то это починила):
window.moveTo(0, 0); window.resizeTo(screen.width-1, screen.height-1);
В версии 1.9 всё намного лучше, но тоже не идеально, приходится пользоваться таймером:
setTimeout('window.fullScreen = true;', 1);
XMLHttpRequest не хочет ходить в сеть, раньше ходил!
Сеть в 1.9 по умолчанию находится в режиме «offline» (в 1.8 - в «online»). Поэтому всё что связано с сетью, работать не будет. Нужно принудительно включить режим "online", используя nsIIOService2:
const mIOService = Components.classes["@mozilla.org/network/io-service;1"] .getService(Components.interfaces.nsIIOService2); try { mIOService.offline = false; } catch(ex) { }
Как сделать UDP Server Socket в JavaScript?
Никак. Если потратить время, можно попытаться написать XPCOM компонент, либо использовать Python.
Как получить путь к профайлу пользователя?
var path = ""; const mDirService = new Components.Constructor("@mozilla.org/file/directory_service;1","nsIProperties"); try { path = (new mDirService()).get("ProfD", Components.interfaces.nsIFile).path; } catch(ex) { alert("Error: \n\n" + ex); return; // если внутри функции } if(path.search(/\\/) != -1) path += "\\"; else path += "/"; alert("Profile path: " + path);
Как записать локальный файл?
function save(filepath, data) { var mLocalFile = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); mLocalFile.initWithPath(filepath); if(!mLocalFile.exists()) mLocalFile.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 420); var mFileOutputStream = Components.classes["@mozilla.org/network/file-output-stream;1"] .createInstance( Components.interfaces.nsIFileOutputStream); /* * Флаги открытия, из исходников XULRunner * * #define PR_RDONLY 0x01 * #define PR_WRONLY 0x02 * #define PR_RDWR 0x04 * #define PR_CREATE_FILE 0x08 * #define PR_APPEND 0x10 * #define PR_TRUNCATE 0x20 * #define PR_SYNC 0x40 * #define PR_EXCL 0x80 * * Режимы открытия, сходны с правами файлов UNIX, и могут быть * проигнорированы на других платформах. * * 00400 Read by owner * 00200 Write by owner * 00100 Execute by owner * 00040 Read by group * 00020 Write by group * 00010 Execute by group * 00004 Read by others * 00002 Write by others * 00001 Execute by others * */ mFileOutputStream.init(mLocalFile, 0x04 | 0x08 | 0x20, 420, 0); mFileOutputStream.write(data, data.length); mFileOutputStream.close(); }
Как прочитать локальный файл?
function read(filepath) { var mLocalFile = Components.classes["@mozilla.org/file/local;1"] .createInstance(Components.interfaces.nsILocalFile); mLocalFile.initWithPath(filepath); if(!mLocalFile.exists()) return ""; var mFileInputStream = Components.classes["@mozilla.org/network/file-input-stream;1"] .createInstance(Components.interfaces.nsIFileInputStream); // 0x01 - открываем только на чтение // 0004 - чтение для всех (аналогично правам файлов в UNIX) // null - флаги поведения, не используются mFileInputStream.init(mLocalFile, 0x01, 00004, null); // для бинарных файлов используем nsIBinaryInputStream var mInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"] .createInstance(Components.interfaces.nsIScriptableInputStream); mInputStream.init(mFileInputStream); return mInputStream.read(mInputStream.available()); }
Как распарсить формат календаря iCal?
Использовать iCalReader.
Как сериализовать/десериализовать XML?
Имхо, лучший [де]сериализатор - [1].
Как написать клиента погодного сервиса?
- Изучаем документацию на Yahoo
- Берём базы международных идентификаторов на Intellicast
- Используем XML десериализатор для получения RSS данных о погоде и превращения их в JavaScript объект
- Выводим полученные данные на экран
Как отключить кеширование в XUL?
Директивами в Вашем скрипте настроек проекта (defaults/preferences/prefs.js):
pref("nglayout.debug.disable_xul_cache", true); pref("nglayout.debug.disable_xul_fastload", true);
Как выводить отладочные сообщения в шелл?
Директивой в Вашем скрипте настроек проекта (defaults/preferences/prefs.js) разрешить использование dump():
pref("browser.dom.window.dump.enabled", true);
Теперь в коде можно писать
dump("Values: " + a + ", " + b + "\n");
Как получить favicon из загруженной страницы в <browser>?
Favicon обычно хранится в html документе как
<link rel="shortcut icon" href="/images/favicon.png" />
или
<link rel="icon" href="/images/favicon.png" />
Если таких элементов нету, то подразумевается, что favicon по умолчанию расположен на HOST/favicon.ico, где HOST - доменное имя, например «google.com».
Поэтому алгоритм примерно такой:
function getFavIcon() { var rel; var favicon = null; var firstIconIndex = -1; // получаем массив тегов <link> var links = content.document.getElementsByTagName("link"); for(var i in links) { if(typeof(links[i].rel) != "undefined") { rel = links[i].rel.toLowerCase(); // Отлично, сразу нашли favicon. if(rel == "shortcut icon") { favicon = links[i].href; break; } // Возможно, favicon передаётся как rel="icon". // При этом не прекращаем поиск. else if(rel == "icon" && firstIconIndex == -1) firstIconIndex = i; } } // Не нашли подходящих тегов с rel="shortcut icon" if(!favicon) { // Возможно, нашли с атрибутом rel="icon" if(firstIconIndex != -1) favicon = links[firstIconIndex].href; else { var uri = browser.currentURI; // Ничего подходящего не нашли. // Пробуем загрузить напрямую из HOST/favicon.ico try { favicon = uri.scheme + "://" + uri.host + "/favicon.ico"; } catch(e) { favicon = ""; } } } alert(favicon); }
Полный XUL проект для демонстрации получения favicon лежит здесь (переименуйте в .tar.bz2). После запуска примера, дождитесь загрузки адреса в браузере, и нажмите кнопку вверху окна. Полученный URL favicon'а передаётся в элемент image, который загружает и отображает иконку. Сам элемент image расположен слева внизу окна.
Как внедрить SVG?
SVG картинка в качестве src атрибута элементов пока не поддерживается. Можно только внедрить SVG напрямую, вот например несколько ссылок по этому поводу:
Как создать iconview?
С помощью HTML элемента div. Не забываем, что для работы HTML элементов нужно импортировать соответствующее пространство имён (xmlns):
<?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window title="Example" width="320" height="200" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns:html="http://www.w3.org/1999/xhtml"> <html:div> <button label="1" /> <button label="2" /> <button label="3" /> <button label="4" /> <button label="5" /> <button label="6" /> <button label="7" /> <button label="8" /> </html:div> </window>
Чтобы динамически создать объект html:div, необходимо также указать методу document.createElementNS() необходимое пространство имён:
const XHTML_NS = "http://www.w3.org/1999/xhtml"; var div = document.createElementNS(XHTML_NS, "html:div");
Что такое Firefox?
Firefox — расширяемый плагинами браузер, написанный на XUL, и позволяющий также выполнять локальное и удалённое содержимое XUL (см. Введение). Плагины представляют собой устанавливаемое содержимое XUL.
Есть ли русскоязычный форум по XUL?
Есть.