gpt4 book ai didi

firefox-addon - 如何让 firefox 附加内容脚本在其他页面脚本之前注入(inject)和运行脚本?

转载 作者:行者123 更新时间:2023-12-05 00:55:12 29 4
gpt4 key购买 nike

我正在开发浏览器扩展/附加组件。我们让它在 Chrome 中运行,所以我试图让它在 Firefox 中运行。

我已经在 Firefox Developer Edition 49.0a2 (2016-07-25) 中加载了我的插件。

我的扩展涉及设置为 run_at: document_start 的 content_script ,因此它可以在其他页面脚本运行之前注入(inject)一个脚本标签,因此它可以使一个对象对网站全局可用。

这似乎在 Chrome 中运行良好,但在 Firefox 中,它已被证明有点竞争条件,大多数时间其他页面资源首先加载。

是否有一种策略可以在任何其他页面脚本运行之前以一种可以注入(inject)和加载脚本的方式加载内容脚本?

当我添加日志时,我可以很好地隔离正在发生的事情。在此示例内容脚本中:

// inject in-page script
console.log('STEP 1, this always happens first')
var scriptTag = document.createElement('script')
scriptTag.src = chrome.extension.getURL('scripts/inpage.js')
scriptTag.onload = function () { this.parentNode.removeChild(this) }
var container = document.head || document.documentElement
// append as first child
container.insertBefore(scriptTag, container.children[0])

现在如果文件 scripts/inpage.js只需运行一个日志,例如
console.log('STEP 2, this should always run second')

我访问了一个带有这样脚本的页面:
console.log('Step 3, the page itself, should run last')

在实践中,步骤 2 和步骤 3 以不确定的顺序运行。

非常感谢!

如果你敢自己尝试的话,我在一个特殊分支的公共(public)存储库中有 Firefox 兼容版本的脚本: https://github.com/MetaMask/metamask-plugin/tree/FirefoxCompatibility

最佳答案

具有外部源 (<script src>) 的动态插入脚本不会阻止脚本的执行,因此无法保证您的脚本会加载。如果您的扩展程序在 Chrome 中运行,那只是运气好。

如果你真的想在其他脚本之前运行一些脚本,你必须内联运行它:

var actualCode = `
// Content of scripts/inpage.js here
`;

var s = document.createElement('script');
s.textContent = actualCode;
(document.head || document.documentElement).appendChild(s);
s.remove();

理想情况下,您的构建脚本应为 scripts/inpage.js ,将其序列化为字符串并放入 actualCode多变的。但是如果 inpage.js只是几行代码,那么上面的就可以使用了。

请注意,您 不应该 除非绝对必要,否则在网页中注入(inject)代码。原因是页面的执行环境不受信任。如果您在 document_start 注入(inject),然后您可以保存以后使用的函数和(原型(prototype))方法(在闭包中),但需要非常仔细的编码。

如果您的内容脚本不是由构建脚本生成的,并且您仍希望将脚本分开,那么您也可以使用同步 XMLHttpRequest获取脚本。出于性能原因,不推荐使用同步 XHR,因此使用它需要您自担风险。扩展代码通常与您的扩展捆绑在一起,因此使用 sync xhr 应该是低风险的:

// Note: do not use synchronous XHR in production!
var x = new XMLHttpRequest();
x.open('GET', chrome.runtime.getURL('scripts/inpage.js'), false);
x.send();
var actualCode = x.responseText;

var s = document.createElement('script');
s.textContent = actualCode;
(document.head || document.documentElement).appendChild(s);
s.remove();

关于firefox-addon - 如何让 firefox 附加内容脚本在其他页面脚本之前注入(inject)和运行脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38577656/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com