2008-09-24 2 views
2

Может ли компонент firefox XPCOM считывать и записывать содержимое страницы на нескольких страницах?Компонент Firefox XPCOM - запрещен метод вызова UnnamedClass

Сценарий: Куча локальных файлов HTML и javascript. файл А «main.html» открывает окно «pluginWindow», и создает плагин с помощью:

netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var obj = Components.classes[cid].createInstance();
plugin = obj.QueryInterface(Components.interfaces.IPlugin);
plugin.addObserver(handleEvent);

Плагин, который имеет 3 метода.

IPlugin.Read - Чтение данных из плагина
IPlugin.Write - Запись данных в плагин
IPlugin.addObserver - добавить обработчик обратного вызова для чтения.

Затем «Main.html» вызывает в pluginWindow и пытается вызвать метод плагина Write.

Я получаю сообщение об ошибке:

Permission denied to call method UnnamedClass.Write

+0

Вы действительно хотите отметить этот «C++»? Возможно, «Javascript» будет лучше подходит ... Что касается актуального вопроса, извините, я понятия не имею :( – 2008-09-25 11:18:34

+0

Я отмечен как C++, потому что это плагин C++, и, надеюсь, ответы будут ориентированы на C++. – 2008-09-26 14:22:11

ответ

1

Во-первых, ваш код на C++ действительно plugin или XPCOM component, возможно, установлен как часть extension? Похоже, что это позже.

Если это так, его нельзя использовать из ненадежного JS-кода - любой веб-страницы или локального файла HTML. Он полностью используется из привилегированного кода, наиболее распространенным типом которого является код extension.

Вы работаете над этой проблемой при создании компонента с помощью вызова enablePrivilege('UniversalXPConnect'). Это не рекомендуется, если это не будет распространено среди пользователей (так как этот вызов вызывает путаницу и если вы предпочитаете всегда разрешать файлу: // скрипты использовать XPCOM, это может быть проблема безопасности, поскольку не все локальные страниц доверяют - считайте сохраненные веб-страницы).

Ваш отказ Write по той же причине - файл: // страницам не доверяют использовать компоненты XPCOM. Вероятно, вы можете заставить его работать, если добавить еще один вызов enablePrivilege в ту же функцию, что и сам вызов Write.

В зависимости от ситуации может быть лучшее решение.

Если ваши файлы должны считаться доверенными, вы можете упаковать их как расширение и получить к ним доступ через URL-адрес chrome: //. Это дает код в этих разрешениях страниц для вызова любого компонента XPCOM, включая ваши.

Если методы компонента безопасны для использования с любой страницы или если среда контролируется, а в браузере не загружены ненадежные страницы, вы можете сделать свой компонент доступным для контента (для поиска nsSidebar можно найти в файле mozilla code, а также для nsISecurityCheckedComponent).

О, и если у вас нет хороших ответов здесь, вы обязательно должны попробовать группы новостей mozilla/списки рассылки.

[изменить ответ в ответ] Рассмотрите возможность ввода кода, который должен вызвать компонент в сценарии chrome: //. В качестве альтернативы вы должны «благословить» свои страницы привилегиями chrome, используя код, например this (обратите внимание, что он делает все, что вам нужно, - отменяя привилегии chrome).

1

Does main.html и что другое окно запуска с хромированными привилегиями? Если вы заходите в Main.html «нормально», просто помещаете его в панель местоположений Firefox, тогда у него будут ограничения на то, что он может сделать (в противном случае произвольная веб-страница могла бы сделать то же самое).

Если вы создаете плагин firefox, поместите свой код в наложение XUL.

Если вы действительно хотите разрешить любой веб-странице делать то, что делает ваш плагин, вы можете установить какой-либо механизм, через который страница может попросить плагин выполнить операцию с ее привилегиями chrome и отправить результат на страницу после этого.

Если вы НЕ делаете расширение Firefox, тогда я боюсь, что я что-то не понял, не могли бы вы объяснить это больше?

+0

Делает main.html с chrome priviledges: no Я не уверен, что вы имеете в виду о размещении моего кода в наложении XUL. Код является родным C++. Скомпилированная dll помещается в firefox/каталог компонентов и загружается, когда javascript в main.html создает его. Исследование наложения XUL сейчас. Спасибо! – 2008-09-26 14:27:44

Смежные вопросы