Добрался таки до разработки расширений - вот тренируюсь
Многие вопросы решились чтением статей (особенно помогла статья про создание тулбара здесь, что-то удалось найти в существующих расширениях.
Но вот что осталось:
1. Как лучше хранить на долговременной основе структуры типа списков, таблиц и деревьев? Если использовать свойства самого Лиса, то как лучше организовывать хранение? Есть ли в этом принципиальные отличия между 2-м и 3-м Лисами? Пробовал на эту тему смотреть код SessionSaver-а, но как-то там слишком запутано написано;
2. Есть где-нибудь полное описание всего JavaScript-а Лиса в одном месте? А еще лучше, чтобы все это было в какой-нибудь среде разработки (ну или туда можно было бы это подключить)?.. А то пробовал несколько: кучу расширений и Комодо - как-то все не то
3. Можно ли использовать локализованные ресурсы из DTD-файлов из JavaScript-а? Или только открывая их как файлы и парся? Или через getByID()?
Хочу поделиться своей находкой (по крайней мере в статьях про это явно не нашел; пример правильного использования случайно нашел в одном из расширений (только вот запамятовал в каком ) - если открыл Америку - сильно не пинайте):
Столкнулся с проблемой использования ресурсов из DTD-файлов в вызовах функций. То есть использование такого ресурса в качестве значения поля проблемы не вызывает, а вот вызов функции уже не получается
Оказалось, что кавычки (их же можно использовать только как текстовые строки) вокруг вставленного идентификатора и вокруг его значения в DTD должны быть одинаковыми (либо обе ', либо обе ")! Если они разные, почему-то выдается сообщение об отсутствии ресурса (видимо это особенность парсера).
Отсюда следует, что в DTD-файлах имеет смысл использовать именно одинарные кавычки для обрамления значений ресурсов, так как практически везде в XML (и соответственно в XUL) по-умолчанию используются двойные кавычки - имхо проще переделать ресурсы.
--- ---
Отсутствует
1) Я храню там же, где настройки. Но можно, наверное, хранить при помощи SQLite или JSON.
2) Если я правильно понял вопрос, то здесь.
3) Локализация JavaScript производится при помощи properties-файлов.
Отсутствует
homo_nudus
Спасибо, посмотрю
Только вот по поводу 3-го пункта возник вопрос - где размещать инициализацию текстовых переменных из properties-файлов?
Если делать ее непосредственно в общей части js-файлов - на тот момент данные еще не подгружены.
onLoad можно делать далеко не для всех сущностей - для тех же оверлеев нельзя.
Можно конечно отслеживать это самому и вызывать при первом вызове функций, которые используют эти данные, но неужели не предусмотрено для этого стандартных средств?
Вот еще вопрос возник:
4. Можно ли как-то настроить отображение в консоли утф-8 кириллицы? А то ведь все соотв файлы со строковыми данными должны быть в утф-8. Или только перекодировать перед выводом в консоль?
--- ---
Отсутствует
3) В xul-файле создаёте элемент stringbundleset c одноимённым идентификатором, в нём - элемент stringbundle, в свойстве src которого прописываете путь к файлу .properties:
<stringbundleset id="stringbundleset"> <stringbundle id="myExtensionStrings" src="chrome://myExtension/locale/myExtension.properties"/> </stringbundleset>
В этом же xul-файле создаёте такие скрипты:
<script type="application/x-javascript" src="путь к основному скрипту"/> <script type="application/x-javascript"> <![CDATA[ window.addEventListener("load", имя_функции_с_кодом_всех_нужных_инициализаций, false); ]]> </script>
В основном файле скрипта, в функции инициализации определяете строковые переменные:
myExtensionStrbundle = document.getElementById("myExtensionStrings"); myExtensionLoading = myExtensionStrbundle.getString("loading"); ...
Может, есть другие способы, но этот работает.
4) К сожалению, не знаю.
Отсутствует
homo_nudus
В этом же xul-файле создаёте такие скрипты:
Все, кроме этого у меня было.
А вот с ним как-то все равно не работает - более того - выдает сообщение об ошибке в консоль:
Ошибка: uncaught exception: [Exception... "Could not convert JavaScript argument" nsresult: "0x80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)" location: "JS frame :: chrome://formfiller2/content/toolbar.xul :: <TOP_LEVEL> :: line 10" data: no]
Вот как я это все организовал:
<stringbundleset id="stringbundleset"> <stringbundle id="stringbundle" src="chrome://formfiller2/locale/formfiller2.properties"/> </stringbundleset> <script type="application/x-javascript" src="chrome://formfiller2/content/main.js"/> <script type="application/x-javascript"> <![CDATA[window.addEventListener("load", "onLoad( )", false);]]> </script>
+
function onLoad() { strBndl=document.getElementById("stringbundle"); unknownError=strBndl.getString("unknownError"); dump(strBndl+"\n1\n"); dump(unknownError+"\n1\n"); return true; }
--- ---
Отсутствует
Строка:
должна быть:
(второй аргумент addEventListener - ссылка на функцию, а не строка.)
Отсутствует
по-моему проще так:
var bundle = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(Components.interfaces.nsIStringBundleService).createBundle("<путь до properties-файла>"), bundle.GetStringFromName("foo");
Отсутствует
AllSeeingI, точно, только в этом ошибка. Проверил, выдаёт аналогичное сообщение.
Shutnik, спасибо. Так, наверное, элегантнее.
Отсутствует
AllSeeingI
второй аргумент addEventListener - ссылка на функцию, а не строка
Спасибо, так работает
Вот бы еще консоль уникодофицировать?..
--- ---
Отсутствует
Shutnik
по-моему проще так
Действительно так проще
Резюмируя по пункту 3:
Уж как-то больно много надо делать телодвижений (причем шаблонных) для использования параметров
Или как-то это все можно сделать проще?
Опять же и шаблоны бы не помешали - например задать строку для вывода динамического диапазона уже проблема - надо создавать для этого несколько параметров, либо парсить самостоятельно.
С обработкой незаданных параметров тоже как-то непонятно - у меня не получилось ее реализовать (я хотел вместо таких параметров выдавать стандартное сообщение, прописанное в коде).
А еще появились новые вопросы:
5. Где-нибудь есть справка по всем подобным вещам с их подробным описанием?
6. Можно ли модифицировать стандартные диалоговые окна? А то я хочу убрать у prompt кнопку Отмена. Ну или как делать самому диалоги с возвращаемыми значениями?
7. Можно ли сделать многострочный тултип?
--- ---
Отсутствует
6) См. здесь (вообще этот маленький учебник хорошо бы просмотреть полностью).
7) При помощи элемента tooltip можно создавать сложные подсказки, вкладывая в элемент другие элементы.
Отсутствует
Forest
у nsIStringBundleService есть метод formatStringFromName. передаём имя строки, массив с параметрами, количество параметров - получаем строку, где %S заменены на передаваемые параметры. вот вам и шаблоны
Отсутствует
homo_nudus
В принципе какая-то версия всего этого у меня есть.
Но наверняка тут есть все.
Спасибо
Shutnik
у nsIStringBundleService есть метод formatStringFromName
Спасибо, посмотрю
Вот, кстати, очень полезную страницу нашел: Interfaces
--- ---
Отсутствует
Что-то не могу найти инфу по тому, как сделать боковую панель
Нашел только ссылки на нечто 2002 года, и то недоступное.
vladmir
http://fotoleto.ru/mozilla/dev.html
Спасибо, интересная страница, только вот ссылки на сайдбары оттуда тоже не работают
--- ---
Отсутствует
Про сайдбары нашел
Вот кстати нашел еще одну очень полезную ссылку - XUL_Tutorials
И вот еще один вопрос:
У меня в массиве хранится табличная структура.
Я хочу отобразить ее текущую выбранную запись.
Есть готовые компоненты для такого? Или надо все руками делать?
--- ---
Отсутствует
Попробовал перенести кнопки с тулбара на сайдбар (с toolbarbutton на button) и обнаружил, что вещи типа
и
перестали выдавать данные по текущему открытому сайты - стали ссылаться на окно сайдбара.
Прочитал, что это связано с тем, что панели инструментов не включаются в так называемый фокус ринг (то есть фокус на них не фиксируется).
Я правильно понимаю, что кнопку, которая должна получать фокус текущего выбранного элемента на сайте, можно сделать только из toolbarbutton? Или можно и обычную кнопку доработать?
Или может быть вообще можно получить историю изменения фокуса?
Еще возник вопрос, как сделать действительно глобальную переменную (и можно ли вообще ее сделать)?
А то в 2-х .xul файлах подключил один и тот же .js файл, однако после определения переменных в одном файле, в другом они не определились
Ну или мб дело в последовательности их обработки? Тогда как задать правильный порядок?
--- ---
Отсутствует
как сделать действительно глобальную переменную
Это здесь: http://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code#Advanced_data_sharing
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Почему в таком случае при вызове CKGFF2_CbImport() недоступен результат вызова onLoad?
Вроде все в одном файле?..
<overlay id="CKGFF2-Overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript" src="chrome://formfiller2/content/main.js"/> <script type="application/x-javascript"> <![CDATA[window.addEventListener("load", onLoad, false);]]> </script> <broadcasterset id="mainBroadcasterSet"> <broadcaster id="CKGFF2-viewSidebar" label="&FormFiller2.sidebarTitle;" autoCheck="false" type="checkbox" group="sidebar" sidebartitle="&FormFiller2.sidebarTitle;" oncommand="toggleSidebar('CKGFF2-viewSidebar');" > <button id="CKGFF2-Import" tooltiptext="&FormFiller2.tbImportTT;" label="&FormFiller2.tbImport;" default="true" oncommand="CKGFF2_CbImport()" /> </broadcaster> </broadcasterset> </overlay>
--- ---
Отсутствует
Вопрос по локализации:
Можно ли сделать дефолтную локаль такую, чтобы параметры, которые есть в ней, брались только оттуда?
А чтобы еще в отдельных локалях их можно было переписывать, но не во всех?
--- ---
Отсутствует
Можно ли сделать дефолтную локаль такую, чтобы параметры, которые есть в ней, брались только оттуда?
можно конечно. сунь её в content и подключай оттуда же, а не из каталога с локалями
на счёт перезаписать не уверен, скорее всего должно ругаться на уже объявленную сущность, но можно попробовать
Отсутствует
Shutnik
можно конечно. сунь её в content и подключай оттуда же, а не из каталога с локалями
Имеется в виду, чтобы все такие сущности выносить в отдельный файл, который хранить вне local?
То есть стандартными средствами такое не предусмотрено?
--- ---
Отсутствует
Имеется в виду, чтобы все такие сущности выносить в отдельный файл, который хранить вне local?
То есть стандартными средствами такое не предусмотрено?
ну из всех locale из chrome.manifest всегда подключается только одна. если надо что-то общее для всех - выноси вне locale
Отсутствует