Компонент Firefox XPCOM - отказано в вызове метода Безымянный класс

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

Сценарий: куча локальных файлов 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

2 ответа

Решение

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

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

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

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

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

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

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

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

[править в ответ на комментарий] Подумайте над тем, чтобы поместить код, который должен вызывать компонент, в скрипт chrome://. Кроме того, вы должны иметь возможность "благословлять" свои страницы привилегиями Chrome, используя такой код (обратите внимание, что он делает противоположное тому, что вам нужно - отбрасывая привилегии Chrome).

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

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

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

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

Другие вопросы по тегам