Компонент Firefox XPCOM — отказано в разрешении на вызов метода NameClass

StackOverflow https://stackoverflow.com/questions/127693

  •  02-07-2019
  •  | 
  •  

Вопрос

Может ли компонент 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... то, боюсь, я что-то неправильно понял. Не могли бы вы объяснить это подробнее?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top