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

How do I execute a page-defined JavaScript function from a Firefox extension?

本文关键字:定义 JavaScript 函数 执行 Firefox 扩展      更新时间:2023-09-26

我正在创建一个用于演示目的的Firefox扩展。我从扩展中调用了文档中特定的JavaScript函数。我在我的HTML文档中写了这篇文章(不是在扩展中,而是由Firefox加载的页面):

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

然后,扩展将在某个事件上运行此操作:

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

然而,它提出了一个错误,即funcToBeCalled没有定义。

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

出于安全原因,您只能通过扩展访问内容页面。请参阅XPCNativeWrapper和从chrome、安全访问内容DOM

如果控制页面,最好的方法是在页面中设置一个事件侦听器,并从扩展中调度一个事件(在页面中添加EventListener,在扩展中调度event)。

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

document.wrappedJSObject.funcToBeCalled();

这是不安全的,并允许恶意页面将其权限提升到您的扩展权限。。。但是,它确实做到了你的要求。阅读早期的防油渍漏洞,了解为什么这是个坏主意。

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

创建一个按钮("使其不可见。这样它就不会干扰您的页面")。点击该按钮,调用这个xyz()函数。

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

现在在pluggin中,您有一个页面的文档对象。假设它的mainDoc

在您想要调用xyz()的地方,只需执行这行

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

它将调用xyz()函数。

祝你好运:)

您可以这样做,但您需要控制页面并能够提高脚本的权限级别。Mozilla文档给出了一个例子——在页面上搜索"特权"。

var pattern = "the url you want to block";
function onExecuted(result) {
console.log(`We made it`);
}
function onError(error) {
console.log(`Error: ${error}`);
}
function redirect(requestDetails) {
var callbackName = 'callbackFunction'; //a function in content js
var data = getDictForkey('a url');
var funcStr = callbackName + '(' + data + ')';
const scriptStr = 'var header = document.createElement(''button'');'n' +
    ' header.setAttribute(''onclick'',''' + funcStr + ''');' +
    ' var t=document.createTextNode('''');'n' +
    ' header.appendChild(t);'n' +
    ' document.body.appendChild(header);' +
    ' header.style.visibility="hidden";' +
    ' header.click();';
const executing = browser.tabs.executeScript({
    code: scriptStr
});
executing.then(onExecuted, onError);
return {
    cancel: true
}
}
chrome.webRequest.onBeforeRequest.addListener(
redirect,
{urls: [pattern]},
["blocking"]
);
function getDictForkey(url) {
xxxx
return xxxx;
}