Компонент Firefox XPCOM - отказано в вызове метода Безымянный класс - PullRequest
2 голосов
/ 24 сентября 2008

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

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

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

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

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

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

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

Permission denied to call method UnnamedClass.Write

Ответы [ 2 ]

1 голос
/ 29 сентября 2008

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

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

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

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

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

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

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

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

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

1 голос
/ 25 сентября 2008

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

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

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

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

...