Какие стоят настройки и что конкретно надо сделать, чтобы воспроизвести? И какая операционная система?
Если нужно только для адресной строки - есть штуки вроде UrlCorrector и URL Fixer Plus RU and UA
Честно говоря мне так сильно его не хватает, а ведь альтернатив с таким же функционалом и нет.
А в чем проблема-то?
Исходное назначение модулей - писать туда функции, которые используются в разных местах, чтобы не дублировать их. Побочным эффектом является то, что модули загружаются только один раз и являются общими для всего приложения, и поэтому переменные, объявленные внутри модулей, тоже общие (в частности, общие для всех окон). Поэтому, модули можно использовать для взаимодействия МЕЖДУ окнами (простейший пример - расширение, подсчитывающее общее количество когда-либо открытых за сессию вкладок). Однако если в вашем случае достаточно, чтобы каждое окно обрабатывало только СВОИ вкладки, модули конечно не нужны.
Видимо этот код выполняется в оверлее для browser.xul. Т.е. в КАЖДОМ окне выполняется код "зарегистрировать обработчик события для всех окон", поэтому количество alert-ов равно количеству открытых окон Фокса.
Если возможно, то лучше устанавливать обработчик в каждом окне только для ЭТОГО окна.
Но если требуется централизованная обработка событий, то надо что-то из этого (скорее всего JS Modules): https://developer.mozilla.org/en/Workin … ta_sharing
Тем не менее, лишний раз лучше так не делать
Так в Fx 3.0+ вроде же XPCSafeJSObjectWrapper. Он должен быть безопасным.
Экспериментальные расширения с addons.mozilla.org не обновляются в принципе. Номинируйтесь и ждите.
Надо же еще получить сам объект:
Components.classes["@mozilla.org/browser/sessionstore;1"].getService(Components.interfaces.nsIClassInfo).getInterfaces({})
Причем для некоторых компонентов надо вызывать createInstance, а не getService. И похоже, большинство компонентов, написанных на С++, не поддерживают nsIClassInfo.
void getInterfaces(out PRUint32 count, [array, size_is(count), retval] out nsIIDPtr array);
Второй параметр out+retval, т.е. из JavaScript он будет виден не как второй параметр функции, а как её возвращаемое значение.
Чтобы получить первый out-параметр, надо передать этой функции объект, и она заполнит в нем поле value в данном случае размером массива (иммитация передачи по ссылке, используемая XPConnect при вызове методов XPCOM-интерфейса из JavaScript). Но в JavaScript не нужно отдельно знать размер массива - он будет в CiR.length автоматически (XPConnect всё сделает сам), поэтому передаем пустой анонимный объект.
var CInf = Components.classes['@mozilla.org/timer;1'].QueryInterface(Components.interfaces.nsIClassInfo); var CiR = CInf.getInterfaces({}); document.writeln("+++ "+ CiC +"<br>");
Можно открыть пустую вкладку (руками) и дописывать в нее:
А вообще в Extension Developer есть JavaScript shell - очень удобно в таких случаях.
Автор расширения может сделать так, чтобы вебстраница знала о наличии расширения и могла использовать его. Это используется в расширениях, написанных специально для конкретных вебсайтов.
По умолчанию же страницы не имеют доступа к расширениям. Это принципиально для таких расширений, как AdBlock и Greasemonkey.
Возможно. Может кто-нибудь подскажет где это посмотреть и точно убедится статическая или динамическая линковка и потом выставить статически если нужно ? Я использую Visual Studio 2005.
http://forums.mozillazine.org/viewtopic … 5#p3721065
На английском, но, думаю, понятно. В хелпе по этим настройкам, кажется, все более детально написано.
Может используется C++ Runtime (msvcrt или как там её) с динамической линковкой? Тогда в XP, где стоит Visual Studio, все работает, т.к. есть нужные динамические библиотеки, а в висте их нет.
Версии Firefox одинаковые?
Можно попробовать что-нибудь отсюда: https://developer.mozilla.org/En/Troubl … gistration
"Ошибка: Permission denied for <file://> to create wrapper for object of class UnnamedClass Источник: chrome://global/content/bindings/browser.xml"
Видимо, если из файла открывать, у xul-а content-права, и ему, соответственно, нет доступа к веб-странице, которая загружена в browser (формально она с другого домена). Видимо, xul explorer открывает с chrome-привилегиями. Если xul использовать в расширении, все будет работать.
У меня получается.
Страница foo.html
<html><head> <script> function bar(x) { alert(x); } </script> </head><body>ащщ</body></html>
Открываю страницу в ФФ. В JS-консоли из Extension Developer:
> enumerateWindows() ... > scope(...) Scope is now [object ChromeWindow]. If a variable is not found in this scope, window will also be searched. New variables will still go on window. > content.bar function bar(x) { alert(x); } > content.bar(1) // фокусится на главном окне ФФ и показывает алерт
Вообще для всего этого нужен XPCSafeJSObjectWrapper. Есть только в FF3.0 и позже и должен создаваться по умолчанию. Думаю, можно сделать его принудительно. Видимо, что-то вроде content.XPCSafeJSObjectWrapper(...), но какие параметры писать, я не знаю.
…dima9111, можно попробовать http://arantius.com/misc/greasemonkey/script-compiler
firebug/browserOverlay.xul#134 (fbPanelBox и fbCommandBox лежат в firebugOverlay.xul)
Аналогично делается в ABP:
adblockplus/chrome/content/ui/overlay.xul#l86
adblockplus/chrome/content/ui/overlayGeneral.xul#l104 (продолжение)
Короче говоря, они добавляют самодельную панель в конец appcontent. Firebug добавляет всё сразу, ABP использует iframe.
Вообще странно. NS_IMPL_ISUPPORTS1 как раз включает в себя стандартную реализацию QueryInterface, поэтому всё должно работать нормально.
А Components.interfaces.nsIQRENotificationService вообще определен? Проще всего зайти в консоль JS-ошибок, нажать при необходимости "очистить", потом в строке выполнить команды
Components.interfaces.nsIQRENotificationService Components.interfaces.nsIQRENotificationService == undefined
Должно выдать соответственно nsIQRENotificationService и false.
А
Components.classes["@component.com/notificationservice;1"].createInstance(Components.interfaces.nsIQRENotificationService)
работает? (Скорее всего будет та же ошибка). А
?
…Обычно понятно, какой компонент что умеет. Это обычно написано или в коде, или в доках.
Насколько я себе всё представляю, список поддерживаемых интрфейсов "хранится" в реализации функции QueryInterface, но она может только сказать, есть интерфейс или нет. Теоретически можно попробовать пройтись по ВСЕМ интерфейсам (из Components.interfaces) и попытаться сделать для каждого QueryInterface.
Может просто obj - это просто не тот объект. Или еще может быть ошибка в реализации QueryInterface (например, если компонент написан на JS, надо обычно писать QueryInterface самому)
Проблема не в том, что интерфейса нет вообще (idl тут ни при чем). Просто данный конкретный объект obj не поддерживает этот интерфейс.
Может надо было заново сгенерировать IMyComponent.h из IMyComponent.idl. У меня недавно было что-то похожее, когда файл из архива был сделан в одной версси Gecko SDK (1.8), а компилировался с другой (1.9)
Для свежескачанного файла (я так понял он кое-где изменился):
firefoxOverlay.xul, строка 3 - <!DOCTYPE overlay SYSTEM "chrome://showmypassword/locale/showmypassword.dtd"> + <!DOCTYPE overlay SYSTEM "chrome://showmypassword/locale/firefoxOverlay.dtd"> options.xul, строка 3 - <!DOCTYPE prefwindow SYSTEM "chrome://showmypassword/locale/prefwindow.dtd"> + <!DOCTYPE prefwindow SYSTEM "chrome://showmypassword/locale/options.dtd">
После этого видимых ошибок я не наблюдаю (по крайней мере в JS-консоли)
Я же сказал, что были указаны адреса несуществующих dtd-файлов. Когда я поменял (точно не помню) preferences.dtd на OptionsDialog.dtd, все заработало