如何从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()函数。
祝你好运 :)