Как вызвать функцию в расширении Firefox с помощью кнопки HTML - PullRequest
9 голосов
/ 07 января 2010

Как вызвать функцию Javascript, объявленную в моем расширении, используя кнопку html с моей веб-страницы?

У меня есть HTML-страница с кнопкой внутри. Когда пользователь нажимает кнопку, он вызывает функцию, которую я уже объявил внутри моего собственного расширения Firefox.

Ответы [ 3 ]

7 голосов
/ 08 января 2010

Поскольку вы управляете веб-страницей, самый простой и безопасный способ сделать то, что вы хотите, - это отправить пользовательское событие DOM на веб-странице и прослушать его в коде расширения:

https://developer.mozilla.org/En/Code_snippets/Interaction_between_privileged_and_non-privileged_pages

Вот пример расширения, которое я написал, которое делает именно это http://mozilla.doslash.org/cw/ (не обновлено до самой последней версии Firefox, но оно чистое и должно легко обновляться).

5 голосов
/ 07 января 2010

Ваше расширение 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, в свойстве wstring для всех имен (inSringIperIt), в свойстве wstring для всех имен (inSringIperIt), в любом случае, wstring propertyName, inStingIperIt для всех имен (inSringIperIt) в любом случае, возвращая свойство wstring в свойстве nN, в любом случае для разрешенных свойств и noAccess в противном случае.

Будьте осторожны с тем, что вы делаете с пользовательским вводом и тем, к чему вы разрешаете доступ - очень легко случайно создать в браузере дыру в безопасности.

1 голос
/ 29 июня 2010

Попробуйте поместить это в начало вашей функции JavaScript, которая пытается получить доступ к локальному файлу:

netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');

Это позволит пользователю выбрать, разрешить ли ваш код доступу к локальной файловой системе.

...