Как вызвать функцию в расширении Firefox с помощью кнопки HTML
Как вызвать функцию Javascript, объявленную в моем расширении, используя кнопку HTML с моей веб-страницы?
У меня есть HTML-страница с кнопкой внутри. Когда пользователь нажимает кнопку, он вызывает функцию, которую я уже объявил внутри собственного расширения Firefox.
3 ответа
Поскольку вы управляете веб-страницей, самый простой и безопасный способ сделать то, что вы хотите, - это отправить пользовательское событие 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(в is nsIIDPtr), canCallMethod(в iid nsIIDPtr, в методе wstring methodName), canGetProperty(в nsIIDPtr iid, в свойстве wstring, свойстве nameName, в любом случае, в свойстве wstring, свойстве inNestIperServer), в другом свойстве wstring, в любом случае, в свойстве wstring, свойстве inNest для всех типов (inSringIperIt), в свойстве wstring для всех имен (inSringIperIt), в свойстве wstring для всех имен (inStingIperIt), в любом случае, в свойстве wstring, свойстве inNest, в любом случае, в свойстве wstring, свойстве inNest, в любом случае, в свойстве wstring, свойстве inNest, в любом случае, в свойстве wstring, свойстве inNest, в любом случае можно возвращать в свойстве wNN. для разрешенных свойств и noAccess в противном случае.
Будьте осторожны с тем, что вы делаете с пользовательским вводом и тем, к чему вы разрешаете доступ - это очень легко случайно создать в браузере дыру в безопасности.
Попробуйте поместить это в начало вашей функции JavaScript, которая пытается получить доступ к локальному файлу:
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
Это даст пользователю возможность выбрать, разрешить ли он вашему коду доступ к локальной файловой системе.