我们有一个Firefox / Chrome网络扩展程序,其中包含背景脚本和内容脚本。后台脚本维护内容脚本所需的共享键/值对的缓存。通过browser.runtime.SendMessage功能访问它们并不难。
但是,我们需要在页面加载时尽快访问这些键/值对,然后在原始页面上运行任何脚本。通常这是不可能的,因为SendMessage的异步特性意味着后台脚本不会足够快地响应内容脚本发出的请求。
我们一直在寻找以下方面的解决方案:
1。同步/阻止查找
似乎没有任何机制可以实现。
2。初始化内容脚本
我们可以使用browser.contentScripts.register注册内容脚本,并有可能通过javascript传递整个缓存的副本。但是,此操作仅被调用一次,所有后续选项卡/页面都将加载其中指定的内容。我们也许可以-非常困难地-为全局缓存更改创建一个侦听器,并每次都重新注册一个新的内容脚本。
有没有比这更好的方法了?
更新:通过将侦听器添加到browser.webNavigation.onBeforeNavigate,我现在可以注入一个全局变量,该变量显示在控制台输出中:
在background.js中:
browser.webNavigation.onBeforeNavigate.addListener(function(details) {
browser.tabs.executeScript(
details.tabId,
{
code: `window.scope.somevariable=true;
console.log("I executed in content script:", "somevariable", window.scope.somevariable);`
}
);
});
在我的通过寄存器注入的库中,我还可以将window.scope打印到控制台,然后在其中看到变量。
但是...当我尝试以编程方式访问变量时,它返回“ undefined”。
在内容脚本中:
// this displays "somevariable" among the window scope properties:
console.log("window.scope", window.scope);
// this displays "undefined":
console.log("somevariable", window.scope.somevariable);
为什么注册的js库可以将变量输出到控制台窗口,但实际上无法读取?