如何从Firefox扩展中执行页面定义的JavaScript函数?

时间:2020-03-06 14:54:17  来源:igfitidea点击:

我正在创建一个用于演示目的的Firefox扩展。
我从扩展名中调用文档中的特定JavaScript函数。
我在HTML文档(不是在扩展名内部,而是在Firefox加载的页面中)中编写了以下代码:

document.funcToBeCalled = function() {
   // function body
};

然后,扩展程序将在某些事件上运行此命令:

var document = Application.activeWindow.activeTab.document;
document.funcToBeCalled();

然而,这引起了一个错误,即未定义funcToBeCalled

注意:我可以通过调用document.getElementById(id);在文档上获取一个元素。

解决方案

我们可以执行此操作,但是我们需要控制页面并能够提高脚本的特权级别。 Mozilla文档在页面上提供了搜索"特权"的示例。

出于安全原因,我们只能从扩展名访问内容页面。请参阅XPCNativeWrapper,并从Chrome安全访问内容DOM,

如果控制页面,则最好的方法是在页面中设置事件侦听器,然后从扩展中分派事件(页面中的addEventListener,扩展中的dispatchEvent)。

否则,请参见http://groups.google.com/group/mozilla.dev.extensions/msg/bdf1de5fb305d365

document.wrappedJSObject.funcToBeCalled();

这是不安全的,并且允许恶意页面将其权限提升为扩展程序的权限...但是,它确实可以执行我们所要求的操作。阅读有关早期的Oilsmonkey漏洞的信息,以了解为什么这不是一个好主意。

我有一个非常简单的方法来做到这一点。
假设我们必须调用写在页面上的xyz()函数。而且我们必须从插件中调用它。

创建一个按钮("使其不可见。因此不会打扰页面")。在该按钮的onclick上调用此xyz()函数。

<input type="button" id="testbutton" onclick="xyz()" />

现在在pluggin中,我们具有该页面的文档对象。假设其mainDoc

我们要在其中调用xyz()的地方,只需执行此行

mainDoc.getElementById('testbutton').click();

它将调用xyz()函数。

祝你好运 :)