Как вызвать функцию JavaScript, объявленную в моем расширении, с помощью кнопки HTML от моей веб-страницы?
У меня есть страница HTML с кнопкой внутри. Когда пользователь нажмет кнопку, она вызовет функцию, которую я уже объявил в своем собственном расширении Firefox.
Поскольку вы управляете веб-страницей, самым простым и безопасным способом сделать то, что вы хотите, было бы отправить настраиваемое событие DOM в веб-страницу и прослушайте ее в коде расширения:
Вот пример расширения, которое я написал, которое делает именно это http: / /mozilla.doslash.org/cw/ (не обновлен до последней версии Firefox, но он чистый и его должно быть легко обновить).
Ваше расширение Firefox работает в другом Javascript-контексте по сравнению с вашей HTML-страницей, поэтому это расширение не может быть вызвано непосредственно из Javascript на вашей HTML-странице.
Тем не менее, вы можете создать расширение, чтобы разрешить доступ из HTML. HTML Javascript обычно не разрешает доступ к объекту Component, поэтому вам нужно разрешить HTML-код, чтобы получить доступ к объекту в вашем расширении. Для этого создайте XPCOM компонент в вашем расширении и установите объект в категории "Глобальное свойство JavaScript" через объект nsICategoryManager. Имя записи - это строка, используемая из непривилегированного Javascript, значение - это идентификатор контракта для вашего класса XPCOM.
Однако, вам также необходимо разрешить непривилегированный Javascript доступ к вашему объекту, иначе менеджер безопасности скрипта заблокирует доступ. Чтобы разрешить это, реализуйте nsISecurityCheckedComponent - предоставляя canCreateWrapper(в nsIIDPtr iid), canCallMethod(в nsIIDPtr iid, в wstring methodName), canGetProperty(в nsIIDPtr iid, в wstring propertyName) и canSetProperty(в nsIIDPtr iid, в wstring propertyName), чтобы вернуть allAccess для разрешенных свойств, и noAccess в обратном случае.
Будьте осторожны в том, что вы делаете с пользовательским вводом, и к чему вы разрешаете доступ - это очень просто случайно создать дыру в безопасности в браузере, делая это.
Попытайтесь поместить это в начало вашей функции javascript, которая пытается получить доступ к локальному файлу:
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
Это даст пользователю выбор, хотят ли они чтобы позволить вашему коду получить доступ к локальной файловой системе.