>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Вопросы (и ответы) по разработке расширений http://forum.mozilla-russia.org/viewtopic.php?id=24699 |
Forest > 06-07-2008 07:16:25 | |||||||||||||||
Добрался таки до разработки расширений - вот тренируюсь Хочу поделиться своей находкой (по крайней мере в статьях про это явно не нашел; пример правильного использования случайно нашел в одном из расширений (только вот запамятовал в каком ) - если открыл Америку - сильно не пинайте): | |||||||||||||||
homo_nudus > 06-07-2008 10:24:20 | |||||||||||||||
1) Я храню там же, где настройки. Но можно, наверное, хранить при помощи SQLite или JSON. 2) Если я правильно понял вопрос, то здесь. 3) Локализация JavaScript производится при помощи properties-файлов. | |||||||||||||||
Forest > 06-07-2008 23:09:43 | |||||||||||||||
homo_nudus Вот еще вопрос возник: | |||||||||||||||
homo_nudus > 06-07-2008 23:43:48 | |||||||||||||||
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) К сожалению, не знаю. | |||||||||||||||
Forest > 07-07-2008 10:17:27 | |||||||||||||||
homo_nudus
Все, кроме этого у меня было.
Вот как я это все организовал: Выделить код Код:<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; } | |||||||||||||||
AllSeeingI > 07-07-2008 11:20:20 | |||||||||||||||
Строка: должна быть: (второй аргумент addEventListener - ссылка на функцию, а не строка.) | |||||||||||||||
Shutnik > 07-07-2008 11:23:12 | |||||||||||||||
по-моему проще так: Выделить код Код:var bundle = Components.classes["@mozilla.org/intl/stringbundle;1"].getService(Components.interfaces.nsIStringBundleService).createBundle("<путь до properties-файла>"), bundle.GetStringFromName("foo"); | |||||||||||||||
homo_nudus > 07-07-2008 13:38:27 | |||||||||||||||
AllSeeingI, точно, только в этом ошибка. Проверил, выдаёт аналогичное сообщение. Shutnik, спасибо. Так, наверное, элегантнее. | |||||||||||||||
Forest > 07-07-2008 15:26:43 | |||||||||||||||
AllSeeingI
Спасибо, так работает Вот бы еще консоль уникодофицировать?.. | |||||||||||||||
Forest > 08-07-2008 00:56:37 | |||||||||||||||
Shutnik
Действительно так проще Резюмируя по пункту 3: А еще появились новые вопросы: 6. Можно ли модифицировать стандартные диалоговые окна? А то я хочу убрать у prompt кнопку Отмена. Ну или как делать самому диалоги с возвращаемыми значениями? | |||||||||||||||
homo_nudus > 08-07-2008 09:17:34 | |||||||||||||||
6) См. здесь (вообще этот маленький учебник хорошо бы просмотреть полностью). 7) При помощи элемента tooltip можно создавать сложные подсказки, вкладывая в элемент другие элементы. | |||||||||||||||
Shutnik > 08-07-2008 11:24:58 | |||||||||||||||
Forest | |||||||||||||||
Forest > 09-07-2008 00:37:34 | |||||||||||||||
homo_nudus Shutnik
Спасибо, посмотрю Вот, кстати, очень полезную страницу нашел: Interfaces | |||||||||||||||
vladmir > 09-07-2008 08:11:25 | |||||||||||||||
Forest Правда год-другой не обновлял.-) | |||||||||||||||
Forest > 11-07-2008 14:56:28 | |||||||||||||||
Что-то не могу найти инфу по тому, как сделать боковую панель vladmir
Спасибо, интересная страница, только вот ссылки на сайдбары оттуда тоже не работают | |||||||||||||||
Forest > 12-07-2008 16:10:06 | |||||||||||||||
Про сайдбары нашел Вот кстати нашел еще одну очень полезную ссылку - XUL_Tutorials И вот еще один вопрос: | |||||||||||||||
Forest > 12-07-2008 20:28:08 | |||||||||||||||
Попробовал перенести кнопки с тулбара на сайдбар (с toolbarbutton на button) и обнаружил, что вещи типа и перестали выдавать данные по текущему открытому сайты - стали ссылаться на окно сайдбара. Еще возник вопрос, как сделать действительно глобальную переменную (и можно ли вообще ее сделать)? | |||||||||||||||
Anton > 12-07-2008 21:59:57 | |||||||||||||||
Это здесь: http://developer.mozilla.org/en/docs/Working_with_windows_in_chrome_code#Advanced_data_sharing | |||||||||||||||
Forest > 13-07-2008 01:28:52 | |||||||||||||||
Anton | |||||||||||||||
Forest > 13-07-2008 11:56:11 | |||||||||||||||
Почему в таком случае при вызове 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> | |||||||||||||||
Forest > 15-07-2008 16:13:09 | |||||||||||||||
Вопрос по локализации: | |||||||||||||||
Shutnik > 15-07-2008 16:18:30 | |||||||||||||||
можно конечно. сунь её в content и подключай оттуда же, а не из каталога с локалями на счёт перезаписать не уверен, скорее всего должно ругаться на уже объявленную сущность, но можно попробовать | |||||||||||||||
Forest > 15-07-2008 19:43:13 | |||||||||||||||
Shutnik
Имеется в виду, чтобы все такие сущности выносить в отдельный файл, который хранить вне local? | |||||||||||||||
Shutnik > 15-07-2008 22:33:17 | |||||||||||||||
ну из всех locale из chrome.manifest всегда подключается только одна. если надо что-то общее для всех - выноси вне locale | |||||||||||||||
Forest > 15-07-2008 23:15:24 | |||||||||||||||
Shutnik А можно в своих расширениях использовать стандартные иконки? | |||||||||||||||
Forest > 17-07-2008 13:35:33 | |||||||||||||||
Еще очень интересно, можно ли наследовать стандартные CSS стили? | |||||||||||||||
Shutnik > 17-07-2008 14:43:58 | |||||||||||||||
Forest наследовать нельзя, наверное. тем более обычно в css темы в селекторе указано помимо класса элемента, ещё его nodeName. | |||||||||||||||
Forest > 17-07-2008 22:36:43 | |||||||||||||||
Shutnik
Такое оказалось сделать просто: в описании стиля Вот еще тройка вопросов: 2. Пробую создавать список (listitem-ы в listbox-е) по массиву, но почему-то при удалении с последующим созданием обнаруживаются пустые элементы. Это точно происходит при удалении. Выделить код Код:// ссылка на listbox currentField = document.getElementById("CKGFF2-Current"); // удаление существующего списка (именно здесь что-то и не так) for (var i=0; i<currentField.getElementsByTagName("listitem").length; i++) currentField.removeItemAt(i); // создание нового списка for (var i=0; i<curDepth; i++) currentField.appendItem(''); Вообще как-то подозрительно я их удаляю, но по другому не получается. 3. Как в groupbox-е отцентрировать заголовок? Выделить код Код:// .xul <groupbox orient="horizontal"> <caption> <label class="label" value="&FormFiller2.lLink;" /> </caption> // .css .label { text-align: center; } тоже не помогает Добавлено Thu Jul 17 22:42:09 2008 : Выделить код Код:var list = currentField.getElementsByTagName("listitem"); for (var i=0; i<list .length; i++) list .removeItemAt(i); Но у list почему-то не оказывается метода removeItemAt. | |||||||||||||||
Shutnik > 18-07-2008 01:11:40 | |||||||||||||||
Forest | |||||||||||||||
Forest > 18-07-2008 08:46:41 | |||||||||||||||
Shutnik Выделить код Код:while(currentField.getElementsByTagName("listitem").length>0) currentField.removeItemAt(0); 3. Растяжка помогла Да и label выносить оказалось лишним. Спасибо | |||||||||||||||
Infocatcher > 18-07-2008 20:19:21 | |||||||||||||||
Forest
.getElementsByTagName – довольно тормозная штука и не стоит лишний раз к ней обращаться. Или один раз сохранить в переменную .getElementsByTagName("listitem").length и удалять с конца (length - 1, length - 2, ... , 0) А в HTML можно просто сделать
Можно попробовать сделать
Но, как я понимаю (лень проверять), отвалятся все обработчики (addEventListener), «повешенные» на parentElt. Выделить код Код:javascript: var parentElt = document.documentElement.lastChild; var copy = parentElt.cloneNode(false); var copy = parentElt.cloneNode(false); alert("Childs count:\n" + parentElt.childNodes.length); parentElt.parentNode.replaceChild(copy, parentElt); void(0); | |||||||||||||||
Shutnik > 18-07-2008 20:47:03 | |||||||||||||||
Infocatcher пишет
ну а в XUL: хотя я предпочитаю нормально удалять | |||||||||||||||
Forest > 19-07-2008 12:50:35 | |||||||||||||||
Infocatcher
Уже нашел этот вариант в домовском хелпе - предыдущие действительно какой-то кривой был и не для всех вариантов работал
Да наверное проще написать свою удалялку (язык позволяет). | |||||||||||||||
Forest > 19-07-2008 14:06:50 | |||||||||||||||
Я тут попробовал перейти от списка к дереву и столкнулся с некоторыми проблемами: Подскажите, в чем дело | |||||||||||||||
Forest > 20-07-2008 11:37:30 | |||||||||||||||
Я правильно понимаю, что в 2-ке проблемы с определением выделения внутри дерева? | |||||||||||||||
Forest > 22-07-2008 00:57:44 | |||||||||||||||
Еще пара вопросов: | |||||||||||||||
Forest > 22-07-2008 11:44:43 | |||||||||||||||
По поводу первого вопроса предыдущего поста - инспектор DOM показал, что сразу после заполнения из кода до этого пустого списка все его элементы - листья. | |||||||||||||||
Forest > 22-07-2008 12:20:44 | |||||||||||||||
Ну вот, а .getAttribute("value") работает | |||||||||||||||
Forest > 22-07-2008 21:08:50 | |||||||||||||||
Я правильно понимаю, что нельзя сохранить не все пользовательские настройки, а только часть через savePrefFile? Если отредактировать сохраненный файл, то readUserPrefs отрабатывает нормально. | |||||||||||||||
Shutnik > 22-07-2008 21:38:17 | |||||||||||||||
savePrefFile(null) сохраняет все
savePrefFile это метод nsIPrefService, а не nsIPrefBranch | |||||||||||||||
Forest > 24-07-2008 17:00:16 | |||||||||||||||
Shutnik
Ясно, значит доработаем напильником
Недоработка однако... Еще раз наткнулся на проблему при работе с атрибутами через свойства - не отображалось ни в интерфейсе, ни в ДОМе, однако при попытке вывести объект в консоль - все выводилось правильно. Еще на один косяк натолкнулся - getElementsByTagName().length после удаления всех элементов все равно выдал то же кол-во, что и до удаления, однако при попытке доступа к элементам их отсутствие очевидно. Правда в 3-ке это не проверял... | |||||||||||||||
Infocatcher > 25-07-2008 20:19:40 | |||||||||||||||
| |||||||||||||||
Forest > 25-07-2008 21:51:08 | |||||||||||||||
Infocatcher
Спасибо, очень познавательно Только вот по описанным мною ситуациям все равно остаются вопросы, баг это или я чего не понимаю. | |||||||||||||||
Infocatcher > 25-07-2008 22:31:32 | |||||||||||||||
Forest
Лично не встречал – пример бы. | |||||||||||||||
Forest > 26-07-2008 00:02:33 | |||||||||||||||
Infocatcher
Целиком расширение пока выложить не могу, но вот 2 выдержки из кода: Выделить код Код:currentMappings = document.getElementById("CKGFF2-Mappings"); for (var i = 0; i < mList.length; i++) currentMappings.appendItem(mList[i][0], mList[i][1]); currentMappings.selectedIndex = 0; Если после этого не трогая мышью этот menulist попробовать получить value выделенного элемента через свойство - получим undefind, а вот если через атрибут - работает. Выделить код Код:// не работает currentMappings.selectedItem.value; // работает currentMappings.selectedItem.getAttribute("value"); 2. Заполняем listbox (его id = CKGFF2-Current). curDepth - положительное целое, posPhoneCount - неотрицательное целое. data - массив строк: Выделить код Код:currentField = document.getElementById("CKGFF2-Current"); // сначала удаляем старые элементы currentFields = currentField.getElementsByTagName("listitem"); var nListitem = currentFields.length; for (var i = nListitem-1; i>=0; i--) currentField.removeChild(currentFields[i]); // потом добавляем новые for (var i=0; i<(curDepth+2+4*posPhoneCount); i++) currentField.appendItem(''); // потом заполняем их var cf = 0; for (var i=0; i<curDepth; i++) { if ((posName3-1)==i) { currentFields[cf++].setAttribute("label", "/ "+data[recordNumber][i]); var delim = data[recordNumber][i].indexOf(" "); currentFields[cf++].setAttribute("label", " - "+data[recordNumber][i].substring(0,delim)); currentFields[cf++].setAttribute("label", " - "+data[recordNumber][i].substring(delim+1)); } else if ((pp=posPhone.indexOf(i+1))>=0) { currentFields[cf++].setAttribute("label", "/ "+data[recordNumber][i]); currentFields[cf++].setAttribute("label", " - "+data[recordNumber][i].substring(0,3)); var phoneNumber = data[recordNumber][i].substring(3).split(/[ -]/).join(); currentFields[cf++].setAttribute("label", " -/ "+phoneNumber); currentFields[cf++].setAttribute("label", " - "+phoneNumber.substring(0,3)); currentFields[cf++].setAttribute("label", " - "+phoneNumber.substring(3)); } else { currentFields[cf++].setAttribute("label", " "+data[recordNumber][i]); } } В таком варианте все работает. заменить на просто может работать польностью, а может и не полностью (то есть до определенного индекса заполнится нормально, а после - нет). Исследований, зависит ли это именно от индекса, я не проводил. Выделить код Код:currentFields = currentField.getElementsByTagName("listitem"); var nListitem = currentFields.length; for (var i = nListitem-1; i>=0; i--) dump("listitem["+i+"] = "+currentFields[i].label); - выводится все, как и должно быть Такие вот пироги... | |||||||||||||||
Forest > 26-07-2008 23:30:23 | |||||||||||||||
Ну хотя бы замечания по коду выскажите (если есть конечно) | |||||||||||||||
Forest > 31-07-2008 13:29:08 | |||||||||||||||
Если у устанавливаю value у поля со списком - могу я проконтролировать, что значение подошло? | |||||||||||||||
Anton > 31-07-2008 15:06:06 | |||||||||||||||
Если Выделить код Код:<menulist id="ml01" editable="true"> <menupopup> <menuitem label="1" value="xyzt"/> <menuitem label="2" value="abcd"/> </menupopup> </menulist> то должно помочь Выделить код Код:if (document. getElementById ("ml01"). getElementsByAttribute ("value", "xyz"). length) ... | |||||||||||||||
Forest > 31-07-2008 16:15:45 | |||||||||||||||
Anton
Спасибо
. | |||||||||||||||
Anton > 31-07-2008 17:06:31 | |||||||||||||||
это не "из того же разряда" | |||||||||||||||
Forest > 31-07-2008 19:20:41 | |||||||||||||||
Anton
Это почему это? | |||||||||||||||
Anton > 31-07-2008 19:52:49 | |||||||||||||||
Неужели ? Вообще, непонятно, зачем оптимизировать по времени доступ к menulist, но вариант с getElementsByAttribute не единственный, можешь попробовать хэш типа "значение":"индекс" или ещё что-нибудь, а насколько каждый вариант будет быстрым покажет только эксперимент.
Я уже думаю, и не только список. Даже уверен. Не пойму только, в чём проблема. Поставь проблему понятней. | |||||||||||||||
Forest > 31-07-2008 20:08:30 | |||||||||||||||
Anton
Ну так я вроде сразу и написал: Forest пишет
Хотя наверное не очень понятно. | |||||||||||||||
Anton > 31-07-2008 20:28:14 | |||||||||||||||
Ну и где там про оптимизацию по времени ? Факт изменения value можешь проверять обработчиками onchange, oninput, onselect. | |||||||||||||||
Forest > 31-07-2008 21:37:23 | |||||||||||||||
Про оптимизацию было сказано в сравнительном качестве. | |||||||||||||||
Forest > 02-08-2008 23:36:49 | |||||||||||||||
Anton
Я правильно понимаю, что getElementsByAttribute работает только для XUL? | |||||||||||||||
Anton > 03-08-2008 09:16:45 | |||||||||||||||
Нет, не правильно. p.s. для html, насколько мне известно - собственная реализация (в т. ч. и getElementsByAttribute) через xpath, перебор или строчный поиск в innerHTML. | |||||||||||||||
Forest > 03-08-2008 11:20:15 | |||||||||||||||
Anton
Тогда почему у меня Лис (2-я версия) на вызов getElementsByAttribute говорит, что он не является методом? Добавлено Sun Aug 3 11:47:58 2008 :
Но думаю такой метод должен быть определен везде, так как он фактически позволяет выбирать элементы произвольного типа. | |||||||||||||||
Anton > 03-08-2008 11:55:14 | |||||||||||||||
Forest
Так ты же его, скорее всего, не определил. Напрямую он определён только в XUL. Если добавить код, типа
то getElementsByAttribute будет работать и в xml и в html. | |||||||||||||||
Forest > 03-08-2008 11:59:11 | |||||||||||||||
Anton Прямо так в коде и написать (включая ... в теле)? | |||||||||||||||
Anton > 03-08-2008 12:11:25 | |||||||||||||||
А сам-то как думаешь ? ) | |||||||||||||||
Forest > 03-08-2008 13:24:14 | |||||||||||||||
Anton
То есть ты предлагаешь мне самому реализовать getElementsByAttribute? Добавлено Sun Aug 3 13:26:36 2008 : | |||||||||||||||
Anton > 03-08-2008 15:15:35 | |||||||||||||||
Насколько мне известно - нельзя. | |||||||||||||||
Forest > 03-08-2008 16:54:51 | |||||||||||||||
Anton Anton пишет
была совершенно пустой, так как я именно про реализацию этой фичи фактически и писал! | |||||||||||||||
Anton > 03-08-2008 17:50:57 | |||||||||||||||
Forest
Всегда пожалуйста. Надеюсь, мне удалось положительно повлиять на твой способ постановки вопросов...
... хотя и не в полной мере. Что ж, на то они и примеры. | |||||||||||||||
Forest > 03-08-2008 19:10:12 | |||||||||||||||
Anton
И не надейся! | |||||||||||||||
Anton > 03-08-2008 19:35:24 | |||||||||||||||
Forest
Жаль.
Хорошо. Вопрос был такой:
и я ответил: "...Если <menulist...". | |||||||||||||||
Forest > 03-08-2008 21:20:57 | |||||||||||||||
Anton
Я умею учиться и критически отношусь к себе, но в данном случае считаю претензию необоснованной.
1. Да, я забыл указать про html! Хотя у меня есть подозрение, что произошло нечто другое - я "забыл" про html потому, что знал про то, как это делается для XUL, и неосознанно счел это очевидным. А теперь о том, чего не было:
- вопрос об оптимизации не ставился! | |||||||||||||||
Shutnik > 03-08-2008 22:46:40 | |||||||||||||||
для html встроенного getElementsByAttribute нет. если уже действительно нужно, то можно сделать самому. | |||||||||||||||
Forest > 04-08-2008 01:03:00 | |||||||||||||||
Shutnik
Как и ожидалось, false | |||||||||||||||
Forest > 26-08-2008 14:30:32 | |||||||||||||||
Возникла задача - реализовать копирование (ctrl+c например) для контролов xul-а (конкретно это был листбокс). Выделить код Код:... <keyset id="sidebarKeyset"> <key id="copy_key" oncommand="CKGFF2_GetSelected(event);" modifiers="accel" key="C" /> </keyset> ... <listbox id="CKGFF2-Current" flex="1" key="copy_key" /> ... Не смог получить в обработчике CKGFF2_GetSelected(event) контекст listbox-а - везде только keyset. В принципе установкой обработчика в сам listbox проблема решается, но тогда приходится отслеживать то ли нажато. | |||||||||||||||
Anton > 26-08-2008 16:13:22 | |||||||||||||||
Пробуй event.explicitOriginalTarget | |||||||||||||||
Forest > 27-08-2008 15:02:48 | |||||||||||||||
Anton
Спасибо, помогло Только вот я почитал доку на developer.mozilla.org и как-то не уверен, что это допустимый вариант использования (правда там вообще дока неполная). | |||||||||||||||
Anton > 27-08-2008 22:04:01 | |||||||||||||||
или document. commandDispatcher. focusedElement | |||||||||||||||
Forest > 01-09-2008 15:48:15 | |||||||||||||||
Anton
Да, это тоже должно подойти, спасибо Добавлено Mon Sep 1 16:04:21 2008 : Выделить код Код:// временный файл создаем в папке tmp var tmpFile = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("TmpD", Components.interfaces.nsIFile); var tmpPath = tmpFile.path; tmpFile.append("TmpFile"); var tmpFullPath = tmpFile.path; // Запускаем наш скрипт с перенаправлением вывода во временный файл var runFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); runFile.initWithPath("c:\\script.bat"); var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess); process.init(runFile); var args = [">", tmpFullPath]; process.run(false, args, args.length); // Получаем данные из временного файла var istream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); istream.init(tmpFile, 0x01, 0444, 0); istream.QueryInterface(Components.interfaces.nsILineInputStream); var line = {}, hasmore; hasmore = istream.readLine(line); Оно работает, но как-то кривовато выглядит не работает, а попытка работать с файлом через nsIFile (а не через nsILocalFile) успехом пока не увенчалась. Вообще или я еще не до конца разобрался с этим, либо все таки АПИ работы с файловой системой у Лиса хромает?.. От ссылочки на правильную документацию про это/пример не отказался бы (особенно с удалением). Или нормально это все можно только через XPCOM сделать? | |||||||||||||||
Forest > 02-09-2008 14:35:18 | |||||||||||||||
Что-то похоже либо я чего-то не понимаю, либо с многоплатформенностью у Лиса есть проблемы | |||||||||||||||
Forest > 03-09-2008 13:26:50 | |||||||||||||||
Еще кстати указанный код почему-то не работает с ехе-файлами?.. | |||||||||||||||
Forest > 04-09-2008 22:55:02 | |||||||||||||||
Продолжая тему горячих клавиш и их обработчиков: Вот пример: Выделить код Код:<command id="SF_Fill_CMD" oncommand="SF_Fill();" /> <key id="SF_Fill_Key" keycode="VK_F4" oncommand="SF_Fill();" /> <toolbarbutton id="SF-Fill" tooltiptext="&ScriptFilling.bFillTT;" label="&ScriptFilling.bFill;" command="SF_Fill_CMD" /> Кстати, этот пример под 2-й версией не работает вообще: command ладно, а вот то, что key не работает - уже неприятно... И вообще никто не в курсе, этот бардак на девелоперском оффсайте устранять вообще будут (или в чем его смысл хотя бы)? | |||||||||||||||
Anton > 04-09-2008 23:38:08 | |||||||||||||||
проверял на XUL Runner'е, вроде есть: Выделить код Код:<?xml version="1.0"?> <?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <!-- your code here --> <commandset id="cs01"> <command id="c01" oncommand="alert('xyz')"/> </commandset> <keyset id="ks01"> <key id="k01" key="a" command="c01"/> </keyset> <button id="b01" label="do command" command="c01" key="k01"/> <button id="b02" label="disable command" oncommand="document.getElementById('c01').setAttribute('disabled','true');"/> <button id="b03" label="enable command" oncommand="document.getElementById('c01').removeAttribute('disabled');"/> </window> | |||||||||||||||
Shutnik > 05-09-2008 12:27:53 | |||||||||||||||
Forest | |||||||||||||||
Forest > 08-09-2008 12:46:16 | |||||||||||||||
Shutnik
Там действительно есть Anton Так действительно в 3-ке работает, спасибо Но все равно смущает тот факт, что недостаточно добавить key, а надо еще и command Теперь буду разбираться, как же прикрутить хоткей на Фх в 2-ке?.. | |||||||||||||||
Anton > 09-09-2008 08:45:46 | |||||||||||||||
| |||||||||||||||
Forest > 26-09-2008 12:24:52 | |||||||||||||||
Anton Только вот видимо у меня случай особый - кнопки на тулбаре. 26-09-2008 12:31:02 | |||||||||||||||
Shutnik > 26-09-2008 12:38:15 | |||||||||||||||
Forest | |||||||||||||||
Anton > 26-09-2008 14:38:50 | |||||||||||||||
Forest пишет
Пропустил самое главное : ) И ещё, атрибуты key в <toolbarbutton - лишние. | |||||||||||||||
Forest > 26-09-2008 15:10:24 | |||||||||||||||
Anton
Вот и я тоже думаю, что что-то важное упускаю | |||||||||||||||
Forest > 26-09-2008 19:24:02 | |||||||||||||||
Anton
Все проверил - работает - спасибо Shutnik
return действительно нужен, но у меня проблема оказалась в другом - промежуточный вызов-обертка, в котором я забыл сделать return На будущее - интересно, можно ли как-то смотреть возвращаемые такими обработчиками значения?.. | |||||||||||||||
Anton > 27-09-2008 03:15:52 | |||||||||||||||
Есть об этом и в документации и в примерах. | |||||||||||||||
Forest > 27-09-2008 10:09:37 | |||||||||||||||
Anton
Нисколько не сомневаюсь, что где-то оно есть. (ссылок тоже нет). Так что у меня в очередной раз складывается впечатление, что кто-то из нас двоих неправильный (я или эта документация).
Так что за ссылки на эти документы (а особенно на пример поиска, который позволяет их найти) был бы очень признателен. | |||||||||||||||
Anton > 27-09-2008 15:11:35 | |||||||||||||||
Forest пишет
"Каждый элемент оверлея вставляется в позицию главного окна, определяемую соответствующими атрибутами id. Например, если элемент оверлея имеет атрибут id со значением "file_menu", соответствующий элемент (имеющий атрибут id со значением "file_menu") главного окна, использующего оверлей, будет изменён. Атрибуты и дочерние элементы элемента из оверлея будут добавлены в этот элемент главного окна. Дочерние элементы элемента overlay, не имеющие атрибутов id будут добавлены в главное окно. Это позволяет добавлять скрипты в главное окно из оверлея." | |||||||||||||||
Forest > 06-10-2008 23:19:09 | |||||||||||||||
Anton Но все таки примеров у них явно не хватает.
- это уже не перевод их текста, а собственные знания Вот ещё с какой проблемой столкнулся: у моей кнопки на тулбаре название сбоку, а не снизу + в Настройке панелей инструментов у неё нет картинки. и из .xul: Выделить код Код:<toolbox id="navigator-toolbox"> <toolbar id="SF-Toolbar" class="chromeclass-toolbar" context="toolbar-context-menu" toolbarname="&ACFilling.toolbarName;" hidden="false" persist="hidden"> <toolbaritem flex="0"> <toolbarbutton id="SF-Fill" tooltiptext="&ACFilling.bFillTT;" label="&ACFilling.bFill;" command="sfc_fill" /> </toolbaritem> </toolbar> </toolbox> <toolbarpalette id="BrowserToolbarPalette"> <toolbarbutton id="SF-Fill" tooltiptext="&ACFilling.bFillTT;" label="&ACFilling.bFill;" command="sfc_fill" /> </toolbarpalette> Смотрел готовые расширения (например для работы с HandyCache) - особой разницы не нашёл (ну или не там искал). - и сразу надпись стала под кнопкой, но вот только картинки в Настройке панелей инструментов теперь явно от стандартного тулбара, причем она там вся - все 5х14 картинок?.. | |||||||||||||||
Infocatcher > 07-10-2008 00:13:39 | |||||||||||||||
Forest
Значит, при настройке тулбара видно только class="toolbarbutton-1". В chrome.manifest нужно добавить примерно следующее: Соответственно, в css должен описываться внешний вид кнопки. | |||||||||||||||
Forest > 08-10-2008 14:37:02 | |||||||||||||||
Infocatcher
Да, спасибо, так заработало . Но вот на 3-ке без него уже не работает. | |||||||||||||||
Forest > 27-10-2008 11:10:13 | |||||||||||||||
А контекстное меню (contentcontextmenu) tabbrowser-ра - это что? | |||||||||||||||
Forest > 17-11-2008 00:10:43 | |||||||||||||||
Код из about Лиса не работает в Громоптице. Выделить код Код:<text value="&tbae.creator;" class="url" tooltiptext="&tbae.creator.email;" onclick="window.open('mailto:&tbae.creator.email;');"/> В Лисе при нажатии на такое открывается окно и пытается запуститься почтовый клиент.
| |||||||||||||||
Anton > 17-11-2008 14:30:39 | |||||||||||||||
Forest | |||||||||||||||
Shutnik > 17-11-2008 14:51:13 | |||||||||||||||
или | |||||||||||||||
Forest > 18-11-2008 09:00:40 | |||||||||||||||
Anton | |||||||||||||||
Snipe > 18-11-2008 13:24:50 | |||||||||||||||
Не подскажите, с чего начать, чтобы сделать самый простой работающий аддон для FF. М.б. кто-то сможет что-то подсказать. | |||||||||||||||
Shutnik > 18-11-2008 15:33:19 | |||||||||||||||
Snipe | |||||||||||||||
Shutnik > 19-11-2008 17:07:35 | |||||||||||||||
Snipe | |||||||||||||||
Snipe > 20-11-2008 11:26:36 | |||||||||||||||
Еще раз спасибо. Сейчас попробую. А пока еще ряд вопросов: Посмотрел, если испольовать Выделить код Код:<overlay xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <hbox id="browser-bottombox"> то получается что мой аддон появляется под статусбаром, а мне надо над. 2, 3 уже сам разобрался. window.content.location.href использовал. | |||||||||||||||
Z&N > 20-11-2008 11:28:58 | |||||||||||||||
Snipe | |||||||||||||||
Snipe > 20-11-2008 13:45:40 | |||||||||||||||
Z&N пишет
Спасибо. Поставил - разбираюсь. | |||||||||||||||
Forest > 24-11-2008 00:45:41 | |||||||||||||||
Пытаюсь работать с аттачами в приходящих письмах (ThunderBird 2). Вообще на developer.mozilla.org на эту тему информации кот наплакал В принципе пытаюсь копать расширение attachment_extractor, но там как-то уж очень всё заморочено Подскажите пожалуйста (лучше пример или ссылку на правильный сайт) | |||||||||||||||
Shutnik > 24-11-2008 10:54:47 | |||||||||||||||
Forest | |||||||||||||||
Forest > 24-11-2008 14:06:56 | |||||||||||||||
Shutnik Ну или можно попробовать выделить/открыть письмо - мб так и надо будет делать. Я правильно понимаю, что полное АПИ можно достать только из исходников? Про 3-ку кстати тоже такой информации не густо, хотя наверняка они апи расширяли?.. | |||||||||||||||
Shutnik > 24-11-2008 14:56:56 | |||||||||||||||
«почти всё» - это найти все письма с аттачами? это делает очень просто перебором списка писем. | |||||||||||||||
Forest > 24-11-2008 18:30:36 | |||||||||||||||
Нашёл пример на оффсайте, который по описанию похож на то, что нужно - но при попытке его выполнить Птиц виснет MessageURI получен от загружающегося сообщения, а msgWindow - из примера по ссылке. То есть вот: Выделить код Код:var msgWindow = Components.classes["@mozilla.org/messenger/msgwindow;1"].createInstance(Components.interfaces.nsIMsgWindow); var content = ""; var MsgService = messenger.messageServiceFromURI(mURI); var MsgStream = Components.classes["@mozilla.org/network/sync-stream-listener;1"].createInstance(); var consumer = MsgStream.QueryInterface(Components.interfaces.nsIInputStream); var ScriptInput = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(); var ScriptInputStream = ScriptInput.QueryInterface(Components.interfaces.nsIScriptableInputStream); ScriptInputStream.init(consumer); try { MsgService.streamMessage(mURI, MsgStream, msgWindow, null, false, null); } catch (ex) { alert("error: "+ex) } ScriptInputStream.available(); while (ScriptInputStream.available()) { content = content + ScriptInputStream.read(512); } alert(content); | |||||||||||||||
Forest > 24-11-2008 19:25:20 | |||||||||||||||
Проверил - виснет на . | |||||||||||||||
Anton > 24-11-2008 20:26:40 | |||||||||||||||
Forest пишет У меня есть кнопка для TB с точно таким же кодом, не виснет. Может, с адресами что-то ? Выделить код Код:var Cc = Components. classes; var Ci = Components. interfaces; function getDirectory () { var prefs = Cc ["@mozilla.org/preferences-service;1"]. getService (Ci. nsIPrefService). getBranch ("custombuttons.buttons.saveSelected."); var fp = Cc ["@mozilla.org/filepicker;1"]. createInstance (Ci. nsIFilePicker); try { var folder = prefs. getComplexValue ("lastFolder", Ci. nsILocalFile); fp. displayDirectory = folder || null; } catch (e) {} fp. init (window, "", fp. modeGetFolder); var res = fp. show (); if (res != fp. returnOK) return null; prefs. setComplexValue ("lastFolder", Ci. nsILocalFile, fp. file); return fp. file; } function saveAsFile (uri, dir) { var content = ""; var subject = messenger. messageServiceFromURI (uri). messageURIToMsgHdr (uri). mime2DecodedSubject; filename = GenerateValidFilename (subject, ".eml"); var msgService = messenger. messageServiceFromURI (uri); var msgStream = Cc ["@mozilla.org/network/sync-stream-listener;1"]. createInstance (); var consumer = msgStream. QueryInterface (Ci. nsIInputStream); var scriptInput = Cc ["@mozilla.org/scriptableinputstream;1"]. createInstance (); var scriptInputStream = scriptInput. QueryInterface(Ci. nsIScriptableInputStream); scriptInputStream. init (consumer); try { msgService. streamMessage (uri, msgStream, msgWindow, null, false, null); } catch (ex) { alert("error: "+ex) } scriptInputStream. available (); while (scriptInputStream. available ()) { content = content + scriptInputStream. read (512); } var subject = msgService. messageURIToMsgHdr (uri). mime2DecodedSubject; var fileName = GenerateValidFilename (subject, ".eml"); var file = dir. clone (); file. append (fileName); if (file. exists ()) file. createUnique (Ci. nsIFile. NORMAL_FILE_TYPE, 0664); var foStream = Cc ["@mozilla.org/network/file-output-stream;1"]. createInstance (Ci. nsIFileOutputStream); var flags = 0x02 | 0x08 | 0x20; foStream. init (file, flags, 0664, 0); foStream. write (content, content. length); foStream. close (); } var dir = getDirectory (); if (!dir) return; var messageArray = GetSelectedMessages(); for (var i = 0; i < messageArray. length; i++) saveAsFile (messageArray [i], dir); | |||||||||||||||
Forest > 24-11-2008 21:48:27 | |||||||||||||||
Anton
Я правильно понимаю, что этот код сохраняет все выбранные сообщения целиком в файлы? А mime2DecodedSubject предпочтительнее использовать чем просто Subject? А зачем кстати в коде 2 раза получается subject, причём на одном уровне и оба раза через var: до и после кода, который у меня не работает? | |||||||||||||||
Anton > 24-11-2008 22:06:10 | |||||||||||||||
Forest пишет
Да.
Если речь идёт о nsIMsgDBHdr. subject vs nsIMsgDBHdr. mime2DecodedSubject, то да, для задачи сохранения сообщений в файлы - предпочтительнее.
Видимо, такая у var subject судьба ) | |||||||||||||||
Forest > 01-12-2008 01:25:06 | |||||||||||||||
Собственно с вашей помощью осилил код Attachment Extractor-а, и даже смог написать свой работающий вариант. Только вот новый ступор - можно как-то создать и отослать письмо полностью автоматом? | |||||||||||||||
Anton > 02-12-2008 10:32:00 | |||||||||||||||
Forest Выделить код Код:try { var gIOService = Components. classes ["@mozilla.org/network/io-service;1"]. getService (Components. interfaces. nsIIOService); var uri = gIOService. newURI ("mailto:recipient@mail.com", null, null); var sMsgComposeService = Components. classes ["@mozilla.org/messengercompose;1"]. getService (Components. interfaces. nsIMsgComposeService); var params = sMsgComposeService. getParamsForMailto (uri); params. composeFields. from = "user@mail.com"; params. composeFields. subject = "any subject"; params. composeFields. body = "\nany message"; params. composeFields. forcePlainText = true; params. composeFields. useMultipartAlternative = true; var am = Components. classes ["@mozilla.org/messenger/account-manager;1"]. getService (Components. interfaces. nsIMsgAccountManager); var identity = am. createIdentity (); identity. fullName = "Full Name"; identity. email = "user@mail.com"; var smtpService = Components. classes ["@mozilla.org/messengercompose/smtp;1"]. getService (Components. interfaces. nsISmtpService); var ss = smtpService. createSmtpServer (); identity. smtpServerKey = ss. key; ss. hostname = "smtp.mail.com"; ss. port = 25; ss. username = "user"; // ******************* ss. password = "password"; // *************** var msgWindow = Components. classes ["@mozilla.org/messenger/msgwindow;1"]. createInstance(); msgWindow = msgWindow. QueryInterface (Components. interfaces. nsIMsgWindow); msgWindow. SetDOMWindow (window); msgWindow. rootDocShell. allowAuth = true; var compose = sMsgComposeService. InitCompose (window, params); compose. SendMsg (Components. interfaces. nsIMsgCompDeliverMode. Now, identity, "fakeAccount", msgWindow, null); } catch (e) { alert (e); } | |||||||||||||||
Forest > 02-12-2008 23:15:15 | |||||||||||||||
Anton | |||||||||||||||
Forest > 06-12-2008 13:45:54 | |||||||||||||||
Диалоговое окно в процессе работы меняет размер. На centerWindowOnScreen() ругается, что нет такого. | |||||||||||||||
Shutnik > 06-12-2008 14:57:18 | |||||||||||||||
Forest пишет
sizeToContent вызывается из window, centerWindowOnScreen должен вызываться от элемента dialog | |||||||||||||||
Anton > 06-12-2008 16:21:01 | |||||||||||||||
В XUL Explorer по alert(centerWindowOnScreen) из <dialog>...</dialog> выдаётся Выделить код Код:function centerWindowOnScreen() { var xOffset = screen.availWidth / 2 - window.outerWidth / 2; var yOffset = screen.availHeight / 2 - window.outerHeight / 2; xOffset = xOffset > 0 ? xOffset : 0; yOffset = yOffset > 0 ? yOffset : 0; window.moveTo(xOffset, yOffset); } | |||||||||||||||
Forest > 06-12-2008 22:41:21 | |||||||||||||||
Shutnik
Похоже на то, но тут ситуация специфическая. Anton
Спасибо, работает Похоже я нашёл баг в Attachment Extractor-е - опубликовал его на оффсайте. Вот: Multiple sequence extractions fail!. | |||||||||||||||
Forest > 08-12-2008 10:56:25 | |||||||||||||||
Что-то похоже window.setTimeout в Птице 2 значение таймаута не воспринимает: ставлю 10000 - всё равно выходит по избыточности рекурсий через 1000 раз (а с таким таймаутом она должна была этот цикл крутить 3 часа - 10000 сек) | |||||||||||||||
Cristian > 08-12-2008 12:53:32 | |||||||||||||||
Forest пишет
Вообще-то, милисекунд. | |||||||||||||||
Forest > 08-12-2008 17:45:08 | |||||||||||||||
Cristian
Я имею в виду суммарно. При этом используется следующий код для ожидания: Выделить код Код:function wait4Load() { if(условие выхода из ожидания) { return true; } else { setTimeout(wait4Load(),10000); } } Я ведь вроде всё правильно написал? Или эту задачу (ожидания события) можно решить как-то иначе? | |||||||||||||||
Anton > 08-12-2008 18:01:17 | |||||||||||||||
Разумеется, нет. У тебя при вычислении аргументов для setTimeout вызывается wait4Load, отсюда и переполнение стёка.
Использовать глобальные уведомления (nsIObserverService). Если ждёшь загрузку письма, может быть (точно не знаю) в TB на это уже есть глобальное уведомление. | |||||||||||||||
Forest > 08-12-2008 20:07:10 | |||||||||||||||
Anton
А что надо вызывать? На самом деле прочитал про это дело здесь - так там часы сделаны как с использованием setTimeout (собственно у меня также и сделано), так и setInterval. 08-12-2008 20:26:24 | |||||||||||||||
Anton > 08-12-2008 21:00:06 | |||||||||||||||
setTimeout, что ты и пытаешься сделать, только этого не происходит, по причине того, что аргументы setTimeout перед передачей ей управления вычисляются. Первым (а хотя бы и вторым) вычисляется первый аргумент "wait4Load ()", который есть вызов функции.
не забудь скобки поставить ) | |||||||||||||||
Forest > 08-12-2008 21:20:43 | |||||||||||||||
Anton
Вот я тормоз - скобки поставил | |||||||||||||||
Anton > 08-12-2008 22:03:42 | |||||||||||||||
Если id интервала не будет достоянием кода из разных окон, то вряд ли. | |||||||||||||||
Forest > 09-12-2008 09:52:25 | |||||||||||||||
Anton | |||||||||||||||
Anton > 09-12-2008 14:29:45 | |||||||||||||||
Я предполагал, что может "не взлететь". | |||||||||||||||
Snipe > 09-12-2008 15:04:36 | |||||||||||||||
А как-то с cookies можно работать в XUL? | |||||||||||||||
Anton > 09-12-2008 15:08:43 | |||||||||||||||
https://developer.mozilla.org/En/Code_snippets/Cookies | |||||||||||||||
Snipe > 15-12-2008 17:54:00 | |||||||||||||||
Anton пишет
Спасибо, то что надо. С одной частью сам разобрался, просто добавить в начальную страницу можно примерно так: Выделить код Код:var Cc = Components.classes; var Ci = Components.interfaces; var url = "http://forum.mozilla-russia.org/"; var param = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); var str = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString); str.data = url; param.setComplexValue("browser.startup.homepage", Ci.nsISupportsString, str); Осталось только первый запуск и разрешение пользователя %) | |||||||||||||||
Forest > 15-12-2008 20:02:39 | |||||||||||||||
Snipe
По первому запуску тут была целая тема. | |||||||||||||||
Forest > 18-12-2008 13:26:22 | |||||||||||||||
Такой вопрос возник про 2-ку (даже про Птицу, но не думаю, что там есть различия): Или это всё появляется лишь в 3-ке? | |||||||||||||||
Anton > 18-12-2008 22:51:56 | |||||||||||||||
Что значит "включать" ? | |||||||||||||||
Forest > 20-12-2008 00:09:06 | |||||||||||||||
Anton
Это именно тот вариант, про который я говорил - получается, что он единственный. А действительно нельзя сделать окно настроек расширения окном с изменяемым размером? | |||||||||||||||
Forest > 20-12-2008 14:33:14 | |||||||||||||||
Ну всем хорошо сочетание (для того же окна настроек расширения) , но если размер содержимого начинает превышать размер окна - всё ломается | |||||||||||||||
entropy > 18-01-2009 13:00:03 | |||||||||||||||
Подскажите, пожалуйста, нигде так и не смог найти ответ. Пишу расширение, которое читает данные из файла и сравнивает их с тем, что на html странице. В текстовом файле может находиться текст как на русском, так и на английском языках. Вот сейчас пытаюсь реализовать код, который бы читал данные из файла и выводил бы их алертом. Всё работает, за исключением того, что русские буквы в алерте выводятся коряво, а английские - нормально. Выделить код Код:var mLocalFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); var line = {}; mLocalFile.initWithPath("C:\\1.txt"); if(!mLocalFile.exists()) return ""; var mFileInputStream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); - mFileInputStream.init(mLocalFile, 0x01, 0444, 0); var mInputStream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); mInputStream.init(mFileInputStream); var mn = mInputStream.read(mInputStream.available()); alert(mn); | |||||||||||||||
Anton > 18-01-2009 13:10:02 | |||||||||||||||
Примерно так: Выделить код Код:var suc = Components. classes ["@mozilla.org/scriptableunicodeconverter;1"]. createInstance (Components. interfaces. nsIScriptableUnicodeConverter); suc. charset = "windows-1251"; mn = suc. ConvertToUnicode (mn); см. http://xulplanet.com/references/xpcomref/ifaces/nsIScriptableUnicodeConverter.html | |||||||||||||||
entropy > 18-01-2009 14:20:03 | |||||||||||||||
Anton спасибо большое! | |||||||||||||||
Forest > 18-01-2009 23:39:25 | |||||||||||||||
entropy пишет
Можно просто файл с текстом сохранить как utf8. | |||||||||||||||
Anton > 19-01-2009 15:10:11 | |||||||||||||||
Forest пишет
Ошибаешься. | |||||||||||||||
entropy > 20-01-2009 21:40:58 | |||||||||||||||
А подскажите, пожалуйста, ещё по кодировке. Выделить код Код:function convert(data){ var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter); suc.charset = "windows-1251"; return suc.ConvertToUnicode(data); } content.document.body.innerHTML = convert("Текст"); Опять получается коряво. | |||||||||||||||
Crazy-EyE > 20-01-2009 22:27:26 | |||||||||||||||
Насколько я помню, все строки в JS во время выполнения уже в Unicode, поэтому дополнительно еще раз конвертировать не стоит. Вопрос в том, правильно ли определяется кодировка самого JS-файла. Об этом здесь: International characters in XUL JavaScript. А вообще правильно не писать нелатинские буквы в коде и использовать локализацию. | |||||||||||||||
Snipe > 22-01-2009 14:48:11 | |||||||||||||||
Forest пишет
А нельзя вот так? : Выделить код Код:var scripteg = document.createElement('script'); scripteg.src = 'URL'; kakoi_nibud_el.appendChild(scripteg) или так?: Честно говоря сам не пробовал. А вот мой вопрос: | |||||||||||||||
Forest > 23-01-2009 00:29:00 | |||||||||||||||
Snipe пишет
Если я правильно понял, о чём речь, то window.open должен помочь. | |||||||||||||||
Snipe > 05-02-2009 13:15:39 | |||||||||||||||
Всем привет. Как можно слово это выровнять по левому краю? align="left" не помогает. | |||||||||||||||
Anton > 05-02-2009 15:05:21 | |||||||||||||||
Snipe 'tbid' - id toolbarbutton'а | |||||||||||||||
Snipe > 05-02-2009 15:14:02 | |||||||||||||||
Anton пишет
Ну и конструкция. | |||||||||||||||
Snipe > 05-02-2009 19:19:09 | |||||||||||||||
Хочу вызывать функцию при смене табов пользователем. Выделить код Код:window.addEventListener('select', function(event) { if (event.originalTarget.tagName == 'xul:tabs') alert('test') }, false); Вроде работает, но т.к. опыта мало..., вдруг есть какой-нибудь более правильный вариант?! | |||||||||||||||
entropy > 06-02-2009 14:19:56 | |||||||||||||||
В контекстном меню Лисы есть такой пункт как "Получить исходный код выделенного фрагмента". Подскажите, пожалуйста, как произвести эту операцию программно, в коде расширения, и получить этот исходник в переменную. | |||||||||||||||
Snipe > 19-02-2009 14:43:40 | |||||||||||||||
Всем привет. Уверенное "НЕТ" тоже будет хорошим ответом. | |||||||||||||||
Anton > 19-02-2009 20:17:11 | |||||||||||||||
Есть такой вариант: Выделить код Код:var obj = Components.classes["@mozilla.org/network/dns-service;1"]. getService(Components.interfaces.nsIDNSService); var hip = obj. resolve (obj. myHostName, 0); var ip; var res = ""; while (hip. hasMore ()) { ip = hip. getNextAddrAsString (); res += ip + "\n"; } alert (res); | |||||||||||||||
Eictol0n > 20-02-2009 14:36:56 | |||||||||||||||
Подскажите, а возможно ли сделать и как следуешее - встроить функцию в DOM сайта ? в смысле хочу вызывать с сайта функцию скажем document.myDom.myFunction(); возвращающую/устанавливающие некие сеттинги заданные в sqlite на стороне пользователя. Я что-то поискал и не нашел где это описано. | |||||||||||||||
Crazy-EyE > 20-02-2009 18:58:15 | |||||||||||||||
Eictol0n, Interaction between privileged and non-privileged pages | |||||||||||||||
Snipe > 24-02-2009 12:39:14 | |||||||||||||||
Anton пишет
Не знаю, что делаю не так, но не работает, а try/catch выдает И еще вопрос, как узнать IP сайта, на который пользователь зашел? | |||||||||||||||
Snipe > 24-02-2009 16:17:06 | |||||||||||||||
Еще вопрос. У меня в аддоне событие происходит по загрузке страницы: Выделить код Код:window.addEventListener( 'load', function () { gBrowser.addEventListener('load', pageLoaded, true); }, false ); А можно как-то сделать, чтоб событие происходило не по окончании загрузки, а при начале. | |||||||||||||||
Anton > 24-02-2009 16:22:26 | |||||||||||||||
Скорее, я ошибся с решением. | |||||||||||||||
Crazy-EyE > 24-02-2009 18:31:57 | |||||||||||||||
gBrowser.webProgress для всех табов или аналогично для конкретного browser-а На всякий случай: есть еще DOMContentLoaded - когда загрузился только html, а картинки и т.д. - еще нет. | |||||||||||||||
Snipe > 25-02-2009 11:02:38 | |||||||||||||||
Crazy-EyE пишет
C DOMContentLoaded понятно: а с gBrowser.webProgress что-то никак не разберусь, м.б. есть где-то пример? Добавлено: Выделить код Код:var myProgressListener = {'onLocationChange': function(a, b, c, d){pageLoaded(a, b, c, d);}}; gBrowser.addProgressListener(myProgressListener); | |||||||||||||||
Crazy-EyE > 25-02-2009 12:58:22 | |||||||||||||||
EDIT: исправил ссылку | |||||||||||||||
Snipe > 25-02-2009 15:03:32 | |||||||||||||||
Crazy-EyE пишет
(There is currently no text in this page) Но все равно спасибо, первый пост помог. Пока вроде работает, как выше писал. | |||||||||||||||
Snipe > 25-02-2009 17:59:14 | |||||||||||||||
Совсем нубский вопрос. | |||||||||||||||
ПротопопулуS > 25-02-2009 18:22:24 | |||||||||||||||
А зачем через аддон? Поисковики и так ставятся неплохо... Вот отсюда | |||||||||||||||
Snipe > 25-02-2009 18:26:33 | |||||||||||||||
ПротопопулуS пишет
НУ сам по себе поисковик не нужен без аддона, а лишние действия для пользователя (поставить отдельно поисковик и отдельно аддон) - тоже не хотелось бы. | |||||||||||||||
Crazy-EyE > 25-02-2009 21:34:57 | |||||||||||||||
Snipe, упс, исправил.
Если внутри расширения сделать директорию /searchplugins и положить туда поисковик, думаю, будет работать (сам не пробовал). Application-specific Extension Files В крайнем случае есть еще Multiple Item Packaging. | |||||||||||||||
Snipe > 26-02-2009 15:30:12 | |||||||||||||||
Crazy-EyE пишет
Спасибо, работает. | |||||||||||||||
Snipe > 26-02-2009 16:19:40 | |||||||||||||||
А можно как-то после установки расширения и соответственно поискового плагина с разрешения пользователя ставить плагин по умолчанию? Как всегда, уверенное нет - тоже хороший ответ. | |||||||||||||||
ipSlicer > 02-03-2009 14:06:27 | |||||||||||||||
entropy Вот код скриплета Выделить код Код:javascript:function%20getSelSource()%20{%20x%20=%20document.createElement(%22div%22);%20x.appendChild(window.getSelection().getRangeAt(0).cloneContents());%20return%20x.innerHTML;%20}%20function%20makeHR()%20{%20return%20nd.createElement(%22hr%22);%20}%20function%20makeParagraph(text)%20{%20p%20=%20nd.createElement(%22p%22);%20p.appendChild(nd.createTextNode(text));%20return%20p;%20}%20function%20makePre(text)%20{%20p%20=%20nd.createElement(%22pre%22);%20p.appendChild(nd.createTextNode(text));%20return%20p;%20}%20nd%20=%20window.open().document;%20ndb%20=%20nd.body;%20if%20(!window.getSelection%20||%20!window.getSelection().rangeCount%20||%20window.getSelection().getRangeAt(0).collapsed)%20{%20nd.title=%22Generated%20Source%20of:%20%22%20+%20location.href;%20ndb.appendChild(makeParagraph(%22No%20selection,%20showing%20generated%20source%20of%20entire%20document.%22));%20ndb.appendChild(makeHR());%20ndb.appendChild(makePre(%22%3Chtml%3E\n%22%20+%20document.documentElement.innerHTML%20+%20%22\n%3C/html%3E%22));%20}%20else%20{%20nd.title=%22Partial%20Source%20of:%20%22%20+%20location.href;%20ndb.appendChild(makePre(getSelSource()));%20};%20void%200 Если интересен сам скриплет, то все должно быть в одну строчку без переносов, а так - готовое решение javascript | |||||||||||||||
entropy > 09-03-2009 08:04:13 | |||||||||||||||
ipSlicer | |||||||||||||||
Snipe > 11-03-2009 15:14:43 | |||||||||||||||
Всем привет. | |||||||||||||||
Snipe > 13-03-2009 10:31:13 | |||||||||||||||
Можно как-то через event, по событию load для нового таба получить document этого таба? Но мне надо получить содержимое таба, который не текущий. Например как после нажатия колесом мышки на ссылку. | |||||||||||||||
Anton > 13-03-2009 17:39:41 | |||||||||||||||
Если сам таб не нужен, примерно так: Выделить код Код:... if (event. originalTarget. nodeName == "#document") { var loc = event. originalTarget. location. href; if (loc. substr (0, 32) == "http://forum.mozilla-russia.org/") { var doc = event. originalTarget; ... | |||||||||||||||
Snipe > 18-03-2009 12:04:20 | |||||||||||||||
А как сделать настройки для расширения через кнопку "настройки", которая показывается под каждым расширением в списке расширений? | |||||||||||||||
Crazy-EyE > 18-03-2009 12:09:16 | |||||||||||||||
| |||||||||||||||
Snipe > 20-03-2009 09:22:37 | |||||||||||||||
Crazy-EyE пишет
Спасибо огромное, то что надо. Читал эту статью давным давно - пропустил и забыл этот пункт. А у меня вот такой вопрос еще назрел. | |||||||||||||||
alex_past > 20-03-2009 10:59:14 | |||||||||||||||
Я страницу верчу через DOM как угодно, и после любых перетасовок wz-tooltips работает без проблем | |||||||||||||||
Snipe > 20-03-2009 16:33:42 | |||||||||||||||
Можно как-то узнать, есть ли на данном сайте стили на определенный тег? Т.е. где-нибудь в CSS написано .a {color:red;text-decoration:none} и т.п. | |||||||||||||||
Shutnik > 20-03-2009 22:28:53 | |||||||||||||||
Snipe | |||||||||||||||
Infocatcher > 20-03-2009 22:36:57 | |||||||||||||||
Snipe > 23-03-2009 11:13:20 | |||||||||||||||
Получается немного не то: Если совсем точно, мне нужно узнать, есть ли где-нибудь в CSS строчка А{...} Как, например FireBug показывает? | |||||||||||||||
Anton > 23-03-2009 15:29:29 | |||||||||||||||
Смотреть надо в сторону https://developer.mozilla.org/En/DOM/Document.styleSheets, я думаю. Вот код, который собирает все правила из первого stylesheet текущего документа: Выделить код Код:var doc = getBrowser (). contentDocument; var sss = doc. styleSheets; var cssrs = sss. item (0). cssRules; var s = ""; for (var j = 0; j < cssrs. length; j++) s += cssrs. item (j). cssText + "\n"; alert (s); Где-то среди cssRules. item (j) возможно, найдётся и "А{...}". | |||||||||||||||
Snipe > 23-03-2009 18:50:43 | |||||||||||||||
Anton пишет
Спасибо, попробую так. Выделить код Код:var ios = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); var cookieUri = ios.newURI("http://.mysite.com", null, null); var cookieSvc = Components.classes["@mozilla.org/cookieService;1"].getService(Components.interfaces.nsICookieService); cookieSvc.setCookieString(cookieUri, null, "your_key=your_value;", null); И на сайте ставлю куки (.mysite.com). Все что нашел на MDC:
Можно как-то в куке, которая с расширения ставится добавить эту точку? | |||||||||||||||
Anton > 24-03-2009 14:03:51 | |||||||||||||||
Snipe пишет
Там же вроде есть нужный код, на процитированной странице ? | |||||||||||||||
Snipe > 27-03-2009 09:20:57 | |||||||||||||||
Anton пишет
Разобрался, спасибо. %) Теперь опять к настройкам. Можно как-то получить доступ к функции обновления (т.е. к основному окну браузера из окна настроек) не через window.opener? | |||||||||||||||
Anton > 28-03-2009 05:24:16 | |||||||||||||||
observer на preference или обычный observer на глобальное уведомление ? | |||||||||||||||
Alive > 29-03-2009 23:48:03 | |||||||||||||||
Можно ли из плагина получить доступ к полю формы открытой веб-странички, на котором стоит курсор... и как? Цель - вставить код смайлика в поле ввода на, допустим, форуме. | |||||||||||||||
Anton > 31-03-2009 06:48:26 | |||||||||||||||
примерно так. | |||||||||||||||
Alive > 31-03-2009 10:07:15 | |||||||||||||||
Anton, спасибо за совет, но оно не работает. почему-то не срабатывает. | |||||||||||||||
Anton > 31-03-2009 10:41:06 | |||||||||||||||
Alive | |||||||||||||||
Alive > 31-03-2009 11:07:15 | |||||||||||||||
Благодарю, toolbarbutton даже красивее смотрится | |||||||||||||||
timonof > 31-03-2009 11:29:42 | |||||||||||||||
Есть такая задача - нужно в google notebook extension сделать строку поиска. Желательно чтобы данные формировались по ходу поиска. Сколько такая штука будет стоить? можно тут, можно в личку, можно в аську 99525нольдва | |||||||||||||||
Snipe > 02-04-2009 11:22:03 | |||||||||||||||
Возможно как-то из одного окна браузера получить доступ к JavaSctipt'у расширения другого окна? | |||||||||||||||
Anton > 02-04-2009 12:46:00 | |||||||||||||||
Snipe
Возможно. Способов реализации несколько: Какой выбрать лучше - зависит от задачи. | |||||||||||||||
Snipe > 06-04-2009 11:13:54 | |||||||||||||||
Anton пишет
Спасибо, второй вариант отлично подошел. | |||||||||||||||
=Agasfer= > 06-04-2009 11:22:02 | |||||||||||||||
Вопрос не по разработке, а по обновлению. | |||||||||||||||
Snipe > 24-04-2009 11:43:42 | |||||||||||||||
И снова здравствуйте. Выделить код Код:<menupopup id="wearherMenu" style="padding:-50px;"> <iframe id="wearherIfr" src="http://" type="content" style="overflow:hidden;width:400px;height:200px;padding-left:-50px;"/> </menupopup> wBlock.setAttribute('popup', 'wearherMenu'); Можно как-то документ в ifram'e прокрутить на нужный кусок документа? | |||||||||||||||
Al_H > 24-04-2009 12:24:42 | |||||||||||||||
Snipe, метод scrollTo( x, y); | |||||||||||||||
Snipe > 24-04-2009 17:08:59 | |||||||||||||||
Al_H пишет
alert($('wearherIfr').scrollTo); выдает undefined | |||||||||||||||
Anton > 24-04-2009 18:12:04 | |||||||||||||||
Это метод окна, а не iframe, соответственно iframe. contentWindow. scrollTo | |||||||||||||||
dima9111 > 01-06-2009 14:04:41 | |||||||||||||||
Добрый день ! Хочу сделать плагин который будет собирать статистику по активности браузера на основе движка cnstat (думаю всем известный движок). В плагин требуется установить код который предоставляет cnstat | |||||||||||||||
dima9111 > 02-06-2009 11:51:23 | |||||||||||||||
Ещё вопрос по теме, если я установил Greasemonkey. Под него можно запустить любой яваскрипт можно ли конвртировать Greasemonkey в независимый плагин? | |||||||||||||||
Forest > 02-06-2009 12:31:05 | |||||||||||||||
dima9111 dima9111 пишет
В смысле? А сейчас он какой? | |||||||||||||||
Crazy-EyE > 02-06-2009 14:00:11 | |||||||||||||||
dima9111, можно попробовать http://arantius.com/misc/greasemonkey/script-compiler | |||||||||||||||
dima9111 > 03-06-2009 12:28:26 | |||||||||||||||
Crazy-EyE пишет
Дружище выручил!!!! Респект и уважуха!!! | |||||||||||||||
dima9111 > 25-06-2009 00:34:08 | |||||||||||||||
Каким способом лучше добавть ява код от гугл аналитик в firefox | |||||||||||||||
Claire > 24-11-2009 17:20:42 | |||||||||||||||
Хочу создать собственный журнал посещений с использованием sqlite. Но не могу разобраться с принципами работы с sqlite на javascript. Если есть инф-я по этому поводу, подскажите. буду очень признательна (какие именно ф-ции в коде мозилы отвечают за считывание/добавление даных в бд places.sqlite?) | |||||||||||||||
Рено Гринлиф > 18-12-2009 12:27:11 | |||||||||||||||
Claire пишет
https://developer.mozilla.org/en/Storage.
Нужно построить DOM дерево. Выделить код Код:... statement=connection.createStatement("select * from tree order by parent_id"); my_document=document.implementation.createDocument("http://www.w3.org/1999/xhtml","root",null); my_document.documentElement.setAttribute("id","0"); while (statement.executeStep()){ element=my_document.createElement(statement.row.tag); element.setAttribute("id",statement.row.id); my_document.getElementById(statement.row.parent_id).appendChild(element); } ... Успешно вставляет первые два элемента (что в корне), но потом их не находит для вставки остальных. Говорит: "TypeError: my_document.getElementById(statement.row.parent_id) is null". | |||||||||||||||
Anton > 19-12-2009 08:20:35 | |||||||||||||||
Рено Гринлиф
Столбец в таблице называется parent_id | |||||||||||||||
Рено Гринлиф > 19-12-2009 15:39:42 | |||||||||||||||
Извиняюсь. Опечатку (в сообщении) исправил, ошибка осталась. | |||||||||||||||
Anton > 19-12-2009 16:39:04 | |||||||||||||||
Рено Гринлиф
Причина, как я понял, в том, что createElement создает элементы в namespace отличном от namespace элемента root. Так что должно работать | |||||||||||||||
Рено Гринлиф > 19-12-2009 18:04:52 | |||||||||||||||
Благодарю за помощь. | |||||||||||||||
Kepper > 14-01-2010 15:49:21 | |||||||||||||||
Зравствуйте. Оно по действию пользователя будет анализировать текущую страницу и на другой тсранице выдавать результат. Делаю это все на основе ReloadEvery 3.6.2 (https://addons.mozilla.org/en-US/firefox/addon/115) В результате получился в выпадающее меню один пункт который, который вызывает функцию с обработкой из прекрепленнго .js файла Я все никак не могу получить доступ к данным на текущей html странице. Следующие команды нормально выдают заголовок, адресс текущей страницы alert("document.body.className="+document.body.className); - прекращается выполнение скрипта var elems = document.getElementsByTagName("img"); Так как будут анализироваться произвольные страници, то использовать getElementById() нельзя window.document.childNodes - исследование показалдо наличие 11 узлов один из которых XULobject, у которого еще 42 узла(но для разных страниц это число одинаково, значит очень сомнительно, что это, то что мне нужно). alert("window.document.body.innerhtml="+window.document.body.innerhtml); - прекращается выполнение скрипта Подскажите пожалусто как мне получить доступ? | |||||||||||||||
Kepper > 22-01-2010 10:28:33 | |||||||||||||||
Оказывается я ломился в обьект который содержит выпадающее меню, а не страницу. Для доступа к текущей странице можно использовать следующий код var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) var body = mainWindow.getBrowser().selectedBrowser.contentDocument.body; Пока для меня это осталось магическим кодом. | |||||||||||||||
Claire > 28-01-2010 11:25:35 | |||||||||||||||
эта ссылка мне знакома. но все равно спасибо) Выделить код Код:<tree flex="1"> <treecols> <treecol id="sender" label="Sender" flex="1"/> <splitter class="tree-splitter"/> <treecol id="subject" label="Subject" flex="2"/> </treecols> <treechildren id="tc"> <script type="application/x-javascript" src="chrome://<package_name>/content/script_name.js"/> </treechildren> </tree> - файл script_name.js может быть таким: Выделить код Код:const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; var tr_ch=document.getElementById("tc"); var i; for (i=0;i<10;i++) { var it=document.createElementNS(XUL_NS, "treeitem"); // create a new XUL treeitem var r=document.createElementNS(XUL_NS, "treerow"); // create a new XUL treerow var cel1=document.createElementNS(XUL_NS, "treecell"); // create a new XUL treecell cel1.setAttribute("label","col1 row"+i); var cel2=document.createElementNS(XUL_NS, "treecell"); // create a new XUL treecell cel2.setAttribute("label","col2 row"+i); tr_ch.appendChild(it); it.appendChild(r); r.insertBefore(cel1,r.cel); r.appendChild(cel2); } Посмотри. может пригодится 28-01-2010 11:37:32 | |||||||||||||||
Claire > 11-02-2010 12:01:15 | |||||||||||||||
Нашла на сайте мозилы код: Выделить код Код:var history = Cc["@mozilla.org/browser/nav-history-service;1"]. getService(Ci.nsINavHistoryService); let observer = { onBeginUpdateBatch: function() { }, onEndUpdateBatch: function() { }, onVisit: function(aURI, aVisitID, aTime, aSessionID, aReferringID, aTransitionType) { }, onTitleChanged: function(aURI, aPageTitle) { }, onDeleteURI: function(aURI) { }, onClearHistory: function() { }, onPageChanged: function(aURI, aWhat, aValue) { }, onPageExpired: function(aURI, aVisitTime, aWholeEntry) { }, QueryInterface: function(iid) { if (iid.equals(Components.interfaces.nsINavHistoryObserver) || iid.equals(Components.interfaces.nsISupports)) { return this; } throw Cr.NS_ERROR_NO_INTERFACE; } }; history.addObserver(observer, false); пробовала вставлять alert("hi"); для проверки срабатывания события onVisit() - не работает. | |||||||||||||||
CountZero > 16-02-2010 22:26:06 | |||||||||||||||
вот такой вопрос: Выделить код Код:try { //largely from firebug. should refactor if (typeof Cc == "undefined") { var Cc = Components.classes; var Ci = Components.interfaces; } if (typeof CCIN == "undefined") { function CCIN(cName, ifaceName){ return Cc[cName].createInstance(Ci[ifaceName]); } } if (typeof CCSV == "undefined") { function CCSV(cName, ifaceName){ if (Cc[cName]) return Cc[cName].getService(Ci[ifaceName]); // if fbs fails to load, the error can be _CC[cName] has no properties else dump("CCSV fails for cName:" + cName); }; } function TracingListener() { //this.receivedData = []; } TracingListener.prototype = { originalListener: null, receivedData: null, // array for incoming data. onDataAvailable: function(request, context, inputStream, offset, count) { var binaryInputStream = CCIN("@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream"); var storageStream = CCIN("@mozilla.org/storagestream;1", "nsIStorageStream"); binaryInputStream.setInputStream(inputStream); storageStream.init(8192, count, null); var binaryOutputStream = CCIN("@mozilla.org/binaryoutputstream;1", "nsIBinaryOutputStream"); binaryOutputStream.setOutputStream(storageStream.getOutputStream(0)); // Copy received data as they come.*/ var data = binaryInputStream.readBytes(count); //var data = inputStream.readBytes(count); this.receivedData.push(data); binaryOutputStream.writeBytes(data, count); this.originalListener.onDataAvailable(request, context,storageStream.newInputStream(0), offset, count); }, onStartRequest: function(request, context) { this.receivedData = []; this.originalListener.onStartRequest(request, context); }, onStopRequest: function(request, context, statusCode) { try { request.QueryInterface(Ci.nsIHttpChannel); dump(request.originalURI.path); if (request.originalURI && request.originalURI.path.indexOf("/api/json/getBootstrapData.do") == 0) { //for(opt in request) { // dump("\nrequest."+opt); //} //dump(request.responseText); var data = null; if(request.requestMethod.toLowerCase() == "post") { var postText = this.readPostTextFromRequest(request,context); if (postText) data = ((String)(postText)).parseQuery(); } //dump("\nProcessing: " + request.originalURI.spec + "\n"); var date = Date.parse(request.getResponseHeader("Date")); var responseSource = this.receivedData.join(); //fix leading spaces bug responseSource = responseSource.replace(/^\s+(\S[\s\S]+)/,"$1"); responseSource = responseSource.replace(/\"testDelay\":8/gm,'"testDelay":0'); } } catch(e) { dump(e);} this.originalListener.onStopRequest(request, context, statusCode); }, QueryInterface: function (aIID) { if (aIID.equals(Ci.nsIStreamListener) || aIID.equals(Ci.nsISupports)) { return this; } throw Components.results.NS_NOINTERFACE; }, readPostTextFromRequest : function(request, context) { try { var is = request.QueryInterface(Ci.nsIUploadChannel).uploadStream; if (is) { var ss = is.QueryInterface(Ci.nsISeekableStream); var prevOffset; if (ss) { prevOffset = ss.tell(); ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); } // Read data from the stream.. var charset = "UTF-8"; var text = this.readFromStream(is, charset, true); // Seek locks the file so, seek to the beginning only if necko hasn't read it yet, // since necko doesn't seek to 0 before reading (at lest not till 459384 is fixed). if (ss && prevOffset == 0) ss.seek(Ci.nsISeekableStream.NS_SEEK_SET, 0); return text; } else { dump("Failed to Query Interface for upload stream.\n"); } } catch(exc) { dump(exc); } return null; }, readFromStream : function(stream, charset, noClose) { var sis = CCSV("@mozilla.org/binaryinputstream;1", "nsIBinaryInputStream"); sis.setInputStream(stream); var segments = []; for (var count = stream.available(); count; count = stream.available()) segments.push(sis.readBytes(count)); if (!noClose) sis.close(); var text = segments.join(""); return text; } } hRO = { observe: function(request, aTopic, aData){ try { if (aTopic == "http-on-examine-response") { request.QueryInterface(Ci.nsIHttpChannel); dump(request.originalURI.path); if (request.originalURI && request.originalURI.path.indexOf("/api/json/getBootstrapData.do") == 0) { var newListener = new TracingListener(); request.QueryInterface(Ci.nsITraceableChannel); newListener.originalListener = request.setNewListener(newListener); } } } catch (e) { dump(e); } }, QueryInterface: function(aIID){ if (aIID.equals(Ci.nsIObserver) || aIID.equals(Ci.nsISupports)) { return this; } throw Components.results.NS_NOINTERFACE; }, }; var observerService = Cc["@mozilla.org/observer-service;1"] .getService(Ci.nsIObserverService); observerService.addObserver(hRO, "http-on-examine-response", false); } catch (e) { dump(e);} | |||||||||||||||
Anton > 18-02-2010 16:21:46 | |||||||||||||||
Claire Подозреваю, в начале надо написать CountZero А если определить как-нибудь функцию dump ? | |||||||||||||||
Hella > 19-02-2010 13:16:23 | |||||||||||||||
Добрый день всем, никогда не создавал расширения для фф. Не знаю с чего начать. Хочу создать расширения в виде дополнительного меню. Аналог меню Закладки, это для одного форума, чтобы сделать навигации более быстрым. | |||||||||||||||
TLemur > 20-02-2010 08:01:12 | |||||||||||||||
Hella Попробуйте в качестве точки отсчета взять это расширение. | |||||||||||||||
Claire > 21-02-2010 15:52:54 | |||||||||||||||
Anton пишет
Разумеется, я это сделала. Все равно не работает. не в этом дело. | |||||||||||||||
Anton > 21-02-2010 19:39:44 | |||||||||||||||
Claire У меня код работает, проверял на Firefox 3.5.6, 3.5.8, 3.6. При добавлении в начало кода строк а в метод onVisit строки и открытия журнальной записи после выполнения кода, появляются два сообщения "visit". | |||||||||||||||
CountZero > 22-02-2010 23:29:21 | |||||||||||||||
Anton пишет похоже, что у меня была ошибка в манифесте. сейчас всё работает почти нормально... но со странностями: если я перехватываю ответ на AJAX-запрос, html-документ или открытый в браузере яваскрипт - то расширение отрабатывает нормально. проблема в том, что мне надо перехватывать именно яваскрипт, определённый во внешнем файле через тэг <script type="test/javascript" src="http://www.example.com/example.js">. а при работе со внешними ресурсами почему-то нужные события не срабатывают | |||||||||||||||
CountZero > 23-02-2010 00:27:57 | |||||||||||||||
эта проблема тоже решилась, добавлением строки | |||||||||||||||
Claire > 27-02-2010 12:25:00 | |||||||||||||||
хочу подгружать в кэш нужные мне страницы. я так понимаю, что нужно использовать кэш- memory cache device. мне нужен пример работы с ним. а еще понять чем отличается один кэш от другого (memory cache device и disk cache device), когда использовать stream based и no stream baset. описание некоторых интерфейсов я нашла, но когда какую функцию/ интерфейс использовать мне пока не понятно.. Если работали с кэшем объясните мне, пож-та, принцип работы самого кэша и работы с ним. может пример какой есть? | |||||||||||||||
Naozumi > 04-03-2010 13:32:10 | |||||||||||||||
Скажите возможно ли из расширения вызывать метод из JS, который находится на конкретной странице? | |||||||||||||||
Elexander > 04-03-2010 15:43:00 | |||||||||||||||
Naozumi пишет
Возможно. Вставьте скрипт (<srcipt>...</script>) в страницу, он сразу исполнится. | |||||||||||||||
Naozumi > 04-03-2010 19:55:55 | |||||||||||||||
Elexander | |||||||||||||||
Elexander > 05-03-2010 10:10:55 | |||||||||||||||
Naozumi пишет
Выделить код Код:var script = "<script>alert('');</script>"; var range = document.createRange(); range.selectNode(document.getElementsByTagName("div").item(0)); var documentFragment = range.createContextualFragment(script); document.body.appendChild(documentFragment); | |||||||||||||||
Naozumi > 07-03-2010 13:07:54 | |||||||||||||||
Elexander | |||||||||||||||
Racketa > 10-08-2015 14:39:19 | |||||||||||||||
Ребят, помогите найти спецификации и технические требования к компонентам расширений. Может я не там ищу, но в центре разработчика https://developer.mozilla.org/en-US/Add-ons не нашел такой инфы Например требования к иконке (формат, размер, может ли меняться в зависимости от действия, содержать анимацию). Сейчас вот надо ставить заказ дизайнеру для разработки дизайна, а я даже требования не могу сформулировать | |||||||||||||||
Доктор ТуамОсес > 25-10-2015 15:07:24 | |||||||||||||||
А скажите пожалуйста! Скажите пожалуйста: какие преимущества оформления программы именно как расширения Firefox, а не просто JS-скрипта? | |||||||||||||||
jars > 25-10-2015 16:48:10 | |||||||||||||||
Доктор ТуамОсес пишет
Затем , чтобы те кто ваабче_нивзубногой в программировании и в JS в частности, могли поставить расширение и заиметь полезную плюшку. Доктор ТуамОсес пишет
CustomButtoms Готовые кнопки для Custom Buttons | Форум Mozilla Россия | |||||||||||||||
Доктор ТуамОсес > 25-10-2015 22:46:19 | |||||||||||||||
jars кто ваабче_нивзубногой в программировании | |||||||||||||||
jars > 26-10-2015 10:42:16 | |||||||||||||||
Ну чегож нипанятна-то Расширение - это законченный "продукт". Для него не нужно доп.костылей Доктор ТуамОсес пишет
типа GreaseMonkey и др. подобных ибо сам бравзер не желает подключать юзерскрипты, нужна_прокладка. Упаковал в *.xpi и устанавливай сразу без танцев, а ежели еще и Restartless то вообще класс. + скорей всего у расширений есть какие-то спецфичские возможности в виде API-func недоступных из userJS, тут не знаю точно. Но для задачи "поиск текста на странице и действия с ним" подойдет любой способ - расширение, GM+JS, CB | |||||||||||||||
lolipop > 26-10-2015 11:44:24 | |||||||||||||||
jars | |||||||||||||||
Доктор ТуамОсес > 26-10-2015 22:44:11 | |||||||||||||||
lolipop | |||||||||||||||
littleleshy > 27-10-2015 10:10:19 | |||||||||||||||
Доктор ТуамОсес | |||||||||||||||
Доктор ТуамОсес > 27-10-2015 22:35:48 | |||||||||||||||
littleleshy | |||||||||||||||
lolipop > 27-10-2015 23:21:21 | |||||||||||||||
Доктор ТуамОсес Вот что может стандартный скрипт на странице https://wiki.mozilla.org/WebAPI К тому же дополнение нужно правильно оформлять, с использованием xml, откуда берутся данные и на нём же рисуется менюшка дополнения. Но недавно Mozilla объявила о большой переделке, так что правила написания дополнений изменятся. Собираются её упростить, некоторые пишут, что Mozilla выкенет полезные функции, но Mozilla обещает, что всё будет хорошо. | |||||||||||||||
Доктор ТуамОсес > 29-10-2015 00:14:52 | |||||||||||||||
lolipop пишет
Это, как я понимаю "МИНУС" расширений по сравнению с коддингом на чистом JS? | |||||||||||||||
littleleshy > 29-10-2015 10:08:43 | |||||||||||||||
Доктор ТуамОсес | |||||||||||||||
Доктор ТуамОсес > 29-10-2015 20:12:49 | |||||||||||||||
А "плюсы"? | |||||||||||||||
littleleshy > 29-10-2015 23:12:51 | |||||||||||||||
Доктор ТуамОсес | |||||||||||||||
Доктор ТуамОсес > 31-10-2015 10:03:24 | |||||||||||||||
А какие IDE и тулзы для разработки расширений посоветуете? | |||||||||||||||
Cesius > 22-02-2016 18:31:24 | |||||||||||||||
Привет. Я не занимался веб разработкой, только системщина и МК. Так что сильно не пинайте)) Инфы по разработке расширений как-то мало и она очень не полная. Так вот, наверно глупые вопросы, но все же. Смотрю исходники, практикуюсь, собираю пакеты и пр. Все круто! Но, имею такой код:: Выделить код Код:<?xml version="1.0"?> <?xml-stylesheet href="chrome://helloworld/skin/overlay.css" type="text/css"?> <!DOCTYPE overlay SYSTEM "chrome://helloworld/locale/overlay.dtd"> <overlay id="helloworld-overlay" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <!-- main element of overlay --> <script src="overlay.js"/> <menupopup id="menu_ToolsPopup"> <menuitem id="helloworld-hello" label="&helloworld;" oncommand="alert(2);"/> </menupopup> <toolbarpalette id="BrowserToolbarPalette"> <toolbarbutton id="helloButton" label="&helloworld;" tooltiptext="111" oncommand="alert(1);"/> </toolbarpalette> </overlay> Вопрос. При каком событии выполниться это: И где этот файл сценария должен "лежать"? У меня его вообще не было Как понимаю это обычный js скрипт? скрытый текст будет еще много нубовских вопросов, не баньте))) Хочу познать как создаются расширения))) | |||||||||||||||
Infocatcher > 22-02-2016 19:09:47 | |||||||||||||||
Cesius | |||||||||||||||
Cesius > 23-02-2016 10:13:32 | |||||||||||||||
Infocatcher пишет
Ок. Спасибо. Еще вопросы. Как запустить js-скрипт при нажатии на кнопку-иконку моего расширения? И скрипт будет выполняться только в пределах браузера (например, я смогу создать текстовый файл на диске в выбранном месте? Ну или хотя бы подготовить файл для загрузки) ? Вообще задача моего будущего расширения такова:
Расширение парсит необходимую инфу Далее сохраняет инфу в текстовый файл | |||||||||||||||
Infocatcher > 25-02-2016 22:30:47 | |||||||||||||||
Cesius пишет
В указанном примере примерно так: Выделить код Код:function xxxDoSomething() { // Все глобальные переменные видны другим расширениям, нужно какое-нибудь уникальное имя alert(1); } в *.xul изменить для <toolbarbutton> Cesius пишет
Можно работать с файлами: По поводу доступа к данным страниц грядет мультипроцессный режим... | |||||||||||||||
Cesius > 28-02-2016 19:30:26 | |||||||||||||||
Почитал вот это: https://forum.mozilla-russia.org/viewtopic.php?id=44234 Но получил что-то что повергло меня! Скрин прилагаю: скрытый текст Что не так? Как отлаживать код? На данном этапе моей разработки, мне надо просто получить код страницы. UpDate... Выделить код Код:<script> function showHello(){ var d = document.load("http://dzeveloper.blogspot.ru/"); alert(d.innerHTML); } </script> | |||||||||||||||
Cesius > 09-03-2016 06:43:17 | |||||||||||||||
Прошу помощи, вопрос по прежнему открыт | |||||||||||||||
turbot > 09-03-2016 07:54:25 | |||||||||||||||
Cesius пишет
Это потому, что ваш код выполняется в контексте браузера, а не страницы. | |||||||||||||||
Cesius > 09-03-2016 18:50:22 | |||||||||||||||
turbot пишет
Ооо! Спасибо тебе! Это реально круто! Выручил! Теперь работает! | |||||||||||||||
CoolCmd > 20-05-2016 19:17:42 | |||||||||||||||
вставляю на обычном сайте ссылку с адресом chrome://blabla/content/page.html | |||||||||||||||
Infocatcher > 20-05-2016 19:55:02 | |||||||||||||||
CoolCmd | |||||||||||||||
sufakan > 20-05-2016 20:43:48 | |||||||||||||||
Я так понимаю старое API исчезнет? Сформировано ли новое API и можно ли его уже учить, чтобы потом не пришлось переучивать? | |||||||||||||||
CoolCmd > 21-05-2016 02:53:52 | |||||||||||||||
Infocatcher contentaccessible пробовал, не помогает. Infocatcher, ты пробовал в restartless расширении использовать модули из sdk (нужно content script загрузить)? здесь пишут что можно, то чета я сомневаюсь, что все это барахло само выгрузится после отключения расширения. sufakan у мозилы 100500 api и все недоделаны (как минимум для e10s) или недокументированы. ад. | |||||||||||||||
sufakan > 21-05-2016 09:13:48 | |||||||||||||||
CoolCmd | |||||||||||||||
CoolCmd > 21-05-2016 16:45:29 | |||||||||||||||
sufakan | |||||||||||||||
Infocatcher > 21-05-2016 19:19:27 | |||||||||||||||
CoolCmd пишет
Угу, нужен process script для регистрации. CoolCmd пишет
SDK не применял, совсем. А сейчас уже и боязно, удалят еще нафиг. | |||||||||||||||
CoolCmd > 22-05-2016 15:04:38 | |||||||||||||||
Infocatcher пишет
вроде есть планы грохнуть xpcom в конце 2017. так что еще не известно кто кого переживет. | |||||||||||||||
Careason > 15-08-2016 21:53:33 | |||||||||||||||
Я начинающий программист. Стоит задача разработать расширение, которое будет построчно сверять URL из адресной строки с URL из БД/файла. Если такой URL есть - происходит одно событие, иначе - другое. | |||||||||||||||
Dorian > 15-10-2016 22:39:56 | |||||||||||||||
Я уже достаточно почитал о WebExtensions. Но чтобы уж точно не ошибиться задам вопрос. Получается, что в WebExtensions скрипты content_scripts имеют те же ограничения, что и обычные скрипты на странице? То есть я не смогу отправить cross domain запрос в обход политики сайта? Другого способа кроме этой чехарды с сообщениями нет? | |||||||||||||||
Dorian > 27-10-2016 17:18:12 | |||||||||||||||
Такая проблема. В чем дело кто знает? |