Google chrome extension 如何在Firefox/Chrome web扩展中动态初始化内容脚本?

Google chrome extension 如何在Firefox/Chrome web扩展中动态初始化内容脚本?,google-chrome-extension,firefox-addon,Google Chrome Extension,Firefox Addon,我们有一个Firefox/Chrome web扩展,它包含背景脚本和内容脚本。后台脚本维护内容脚本所需的共享密钥/值对的缓存。通过browser.runtime.SendMessage功能访问它们并不困难 但是,在原始页面上运行任何脚本之前,我们需要在页面加载时尽快访问这些键/值对。这通常是不可能的,因为SendMessage的异步特性意味着后台脚本不会足够快地响应内容脚本发出的请求 我们一直在寻找以下方面的解决方案: 1。同步/阻止查找 这似乎没有任何机制 2。初始化内容脚本 我们可以使用br

我们有一个Firefox/Chrome web扩展,它包含背景脚本和内容脚本。后台脚本维护内容脚本所需的共享密钥/值对的缓存。通过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);`
        }
    );
});
在我的由register注入的库中,我还能够将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库可以将变量输出到控制台窗口,但实际上无法读取它?

重新注册是正确的方法。另一个是,它会在超高速加载序列(如缓存历史导航)上失败。我真的不认为这是可行的,因为它可能会在每个选项卡中注入一个大数组。请参见更新。1)数组是一个易于处理的对象,注入它不应导致明显的性能损失。2) 如果不需要,主内容脚本可以将数组设置为null,这样它就会被垃圾回收。3) 无论如何,没有其他解决方案。onBeforeNavigate将在上一个选项卡(导航之前)以及executeScript上运行。“注入它不应导致明显的性能损失。”这是一个很大的假设,当一个人可能要处理几十个打开的选项卡和几个不同的浏览器时,重新注册是正确的方法。另一个是,它会在超高速加载序列(如缓存历史导航)上失败。我真的不认为这是可行的,因为它可能会在每个选项卡中注入一个大数组。请参见更新。1)数组是一个易于处理的对象,注入它不应导致明显的性能损失。2) 如果不需要,主内容脚本可以将数组设置为null,这样它就会被垃圾回收。3) 无论如何,没有其他解决方案。onBeforeNavigate将在上一个选项卡(导航之前)以及executeScript上运行。“注入它不应该引起明显的性能损失。”这是一个相当大的假设,可能需要处理几十个打开的选项卡和几个不同的浏览器。