在较新版本的 Firefox 中,是否仍然可以覆盖网页的 JS 函数?
In newer versions of Firefox, is it still possible to override a web page's JS function?
我正在编写一个扩展来覆盖网页的 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 用法是什么?
阅读您链接到的文档,特别是标题为 Expose functions to page scripts - which links to exportFunction
的章节
function blah() {}
exportFunction(blah, unsafeWindow, {defineAs: 'rwt'});
事实证明,问题是函数 rwt
的重新定义正在与原始定义赛跑并获胜。原始版本在我定义的函数之后运行并覆盖了我定义的函数,因此看起来我的重新定义已经悄无声息地失败了。
一旦我意识到这是问题所在,最简单的破解方法就是在 data/google-script.js
.
中的重新定义中添加超时
setTimeout(function() {
unsafeWindow.rwt=function(){};
}, 1000);
因此,orignal answer 仍然是正确的,只是未能解决竞争条件。
尽管内容脚本共享 DOM,但它们在其他方面与页面脚本是隔离的。正如您正确推测的那样,可以在 Firefox 中使用 unsafeWindow
来绕过这种隔离。
出于某种原因,就个人而言,我不喜欢 unsafeWindow
的名字 ;)
因此我提出了另一种方法来做到这一点:利用这些范围之间共享的东西,我。 e. DOM。
您可以从内容脚本创建页面脚本:
var script = 'rwt=function()();';
document.addEventListener('DOMContentLoaded', function() {
var scriptEl = document.createElement('script');
scriptEl.textContent = script;
document.head.appendChild(scriptEl);
});
这种方法的好处是您可以在没有 unsafeWindow
的环境中使用它,例如。 G。 chrome 个扩展名。
我正在编写一个扩展来覆盖网页的 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 用法是什么?
阅读您链接到的文档,特别是标题为 Expose functions to page scripts - which links to exportFunction
的章节function blah() {}
exportFunction(blah, unsafeWindow, {defineAs: 'rwt'});
事实证明,问题是函数 rwt
的重新定义正在与原始定义赛跑并获胜。原始版本在我定义的函数之后运行并覆盖了我定义的函数,因此看起来我的重新定义已经悄无声息地失败了。
一旦我意识到这是问题所在,最简单的破解方法就是在 data/google-script.js
.
setTimeout(function() {
unsafeWindow.rwt=function(){};
}, 1000);
因此,orignal answer 仍然是正确的,只是未能解决竞争条件。
尽管内容脚本共享 DOM,但它们在其他方面与页面脚本是隔离的。正如您正确推测的那样,可以在 Firefox 中使用 unsafeWindow
来绕过这种隔离。
出于某种原因,就个人而言,我不喜欢 unsafeWindow
的名字 ;)
因此我提出了另一种方法来做到这一点:利用这些范围之间共享的东西,我。 e. DOM。
您可以从内容脚本创建页面脚本:
var script = 'rwt=function()();';
document.addEventListener('DOMContentLoaded', function() {
var scriptEl = document.createElement('script');
scriptEl.textContent = script;
document.head.appendChild(scriptEl);
});
这种方法的好处是您可以在没有 unsafeWindow
的环境中使用它,例如。 G。 chrome 个扩展名。