我正在编写一个扩展来覆盖网页的JS功能,并从this question开始,但答案似乎不适用于Linux上的Firefox 42。
接下来,我尝试使用documentation中描述的exportFunction
,但也默默地失败了。
在package.json
内,我添加了以下内容。
"permissions": {
"unsafe-content-script": true
}
这是我的index.js
文件。
var self = require('sdk/self');
require("sdk/tabs").on("ready", fixGoogle);
function fixGoogle(tab) {
if (tab.url.indexOf("google.com") > -1) {
tab.attach({
contentScriptFile: self.data.url("google-script.js")
});
}
}
这是我当前的data/google-script.js
。
unsafeWindow.rwt=function(){};
请注意,在浏览器控制台中手动输入rwt=function(){};
可以达到预期的效果,就像使用书签(需要点击)一样,但我每次使用Google时都会自动编写插件。
是否可以使用Firefox扩展覆盖rwt
页面功能?如果是这样,使用的API是什么?
答案 0 :(得分:1)
阅读您链接到的文档,特别是标题为Expose functions to page scripts的章节 - 链接到exportFunction
function blah() {}
exportFunction(blah, unsafeWindow, {defineAs: 'rwt'});
答案 1 :(得分:1)
事实证明,问题是重新定义函数rwt
正在与原始定义竞争并获胜。原始版本在我定义的函数之后运行并覆盖它,从而使我的重新定义看起来像是默默无效。
一旦我意识到这就是问题,最简单的方法是在data/google-script.js
内为重新定义添加超时。
setTimeout(function() {
unsafeWindow.rwt=function(){};
}, 1000);
因此,orignal answer仍然是正确的,但根本无法解决竞争条件。
答案 2 :(得分:0)
即使内容脚本共享DOM,它们也会与页面脚本隔离。正如您所推测的那样,可以在Firefox中使用unsafeWindow
来绕过此隔离。
就我个人而言,由于某种原因,我不喜欢unsafeWindow
的名字;)
因此我建议采用另一种方法:利用这些范围之间共享的东西,即:即DOM。
您可以从内容脚本创建页面脚本:
var script = 'rwt=function()();';
document.addEventListener('DOMContentLoaded', function() {
var scriptEl = document.createElement('script');
scriptEl.textContent = script;
document.head.appendChild(scriptEl);
});
这种方法的好处是你可以在没有unsafeWindow
的环境中使用它。 G。镀铬扩展。