如何在Firefox / Chrome Web扩展程序中动态初始化内容脚本?

时间:2019-02-06 22:29:43

标签: google-chrome-extension firefox-addon

我们有一个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库可以将变量输出到控制台窗口,但实际上无法读取?

0 个答案:

没有答案