Компонент Firefox XPCOM — отказано в разрешении на вызов метода NameClass
Вопрос
Может ли компонент 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» вызывает плагинWindow и пытается вызвать метод плагина Write.
Я получаю сообщение об ошибке:
Permission denied to call method UnnamedClass.Write
Решение
Во-первых, действительно ли ваш код на C++ плагин или XPCOM-компонент, возможно установленный как часть расширение?Похоже, это будет позже.
Если да, то его нельзя использовать из ненадежного кода JS — любой веб-страницы или локального HTML-файла.Его полностью можно использовать из привилегированного кода, наиболее распространенным типом которого является расширение код.
Эту проблему можно обойти при создании компонента с помощью enablePrivilege('UniversalXPConnect')
вызов.На самом деле это не рекомендуется, если только это не будет распространяться среди пользователей (поскольку этот вызов вызывает сбивающее с толку окно и если вы установили предпочтение, чтобы всегда разрешать сценариям file:// использовать XPCOM, это может быть проблемой безопасности, поскольку не все локальные страницам доверяют – подумайте о сохраненных веб-страницах).
Твой Write
вызов завершается неудачно по той же причине - страницам file:// не разрешено использовать компоненты XPCOM.Вероятно, вы сможете заставить его работать, если добавите еще один enablePrivilege
вызов той же функции, что и сам вызов Write.
В зависимости от ситуации может быть лучшее решение.
Если ваши файлы должны рассматриваться как доверенные, вы можете упаковать их как расширение и получить к ним доступ через URL-адрес chrome://.Это дает коду на этих страницах разрешения на вызов любого компонента XPCOM, включая ваш.
Если методы компонента безопасно использовать с любой страницы или если среда контролируется и в браузере не загружаются ненадежные страницы, вы можете сделать свой компонент доступным для содержимого (найдите nsSidebar в код Мозиллы для примера, а также для nsISecurityCheckedComponent
).
Да, и если вы не получите здесь хороших ответов, вам обязательно стоит попробовать группы новостей/списки рассылки Mozilla.
[изменить в ответ на комментарий] Рассмотрите возможность размещения кода, который должен вызывать компонент, в скрипте chrome://.В качестве альтернативы вы сможете «благословить» свои страницы привилегиями Chrome, используя такой код: этот (обратите внимание, что он делает противоположное тому, что вам нужно — лишает привилегий Chrome).
Другие советы
Работает ли Main.html и другое окно с привилегиями Chrome?Если вы получаете доступ к Main.html «обычно», просто поместив его в адресную строку Firefox, тогда у него будут ограничения на то, что он может делать (в противном случае произвольная веб-страница могла бы делать то же самое).
Если вы создаете плагин Firefox, поместите свой код в оверлей XUL.
Если вы действительно хотите, чтобы любая веб-страница могла делать то, что делает ваш плагин, вы можете установить некоторый механизм, с помощью которого страница может попросить плагин выполнить операцию с его привилегиями Chrome и впоследствии отправить результат на страницу.
Если вы НЕ делаете расширение для Firefox... то, боюсь, я что-то неправильно понял. Не могли бы вы объяснить это подробнее?