在 Firefox 扩展弹出窗口中执行 javascript

Dis*_*rer 3 javascript firefox firefox-addon-webextensions

我目前正在迈出扩展开发的第一步。目前我只是想在我点击按钮时出现的弹出窗口中显示一些信息。问题是它是动态信息,我从互联网上的 JSON 文件中收集。然而,我无法让数据显示在弹出窗口中,我已经将问题缩小到它似乎根本没有运行任何 Javascript 的地步......

我留下了一个非常简单的代码:

清单.json:

    {

  "manifest_version": 2,
  "name": "Test Extention",
  "version": "1.0",

  "description": "",

  "icons": {
    "256": "icon/button.png"
  },
  "permissions": [
    "activeTab",
    "storage"
  ],
  "browser_action": {
    "default_icon": {
      "200": "icon/button.png"
    },
    "default_title": "Test Extention",
    "default_popup": "popup/popup.html"
  }
}
Run Code Online (Sandbox Code Playgroud)

弹出窗口/popup.html:

<html>
    <head>
        <meta charset="utf-8">
        <style>
        html,body{width:300px}
        </style>
    </head>
    <body>
        <div id="container"></div>
        <script>
        document.getElementById('container').innerHTML = 'testing';
        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

当我直接在 Firefox 中运行 html 文件时,它按预期显示“测试”。但是,当我运行扩展程序时,单击新按钮时会出现一个空的弹出窗口。

我还尝试将 js-code 放在一个函数中,并用一个按钮调用它,看看它是否需要一些时间才能运行 js-code ,但这也不起作用。

我确定这是我遗漏的非常简单的东西,但我找不到任何关于这个的东西......

pea*_*nut 5

默认情况下,WebExtension API 具有应用到它们的内容安全策略。所以它不能在弹出的 HTML 文件中执行内联 javascript 代码。

不仅:

<script>
    document.getElementById('container').innerHTML = 'testing';
</script>
Run Code Online (Sandbox Code Playgroud)

但是也:

<button onclick="alert('hello')">Hello</button>
Run Code Online (Sandbox Code Playgroud)

如果您触及此规则,您可能会在Browser ToolboxAdd-on Debugger 中收到一些错误消息。

因此,要解决此问题,请使用<script src="..."></script>而不是<script>...</script>.

或者,也许将Unsafe 内联脚本设置为manifest.json 中的content_security_policy键也可以解决这个问题。但是 MDN 告诉我:

注意:有效示例显示了 CSP 中密钥的正确使用。但是,由于重大安全问题,addons.mozilla.org 上列出的扩展不允许在其 CSP 中使用带有“unsafe-eval”、“unsafe-inline”、远程脚本、blob 或远程源的扩展。

这个页面。看来这不是什么好办法。