Javascript无法在本地页面上运行

s3r*_*ius 3 javascript firefox firefox-addon firefox-addon-webextensions

我有一个非常简单的webextension,当单击按钮时,它应该在新窗口中打开本地页面:

function openMyPage() {
    var popupURL = chrome.extension.getURL("my-page.html");

    chrome.windows.create({
      url: popupURL,
      type: "popup",
      height: 200,
      width: 200
    });
}

chrome.browserAction.onClicked.addListener(openMyPage);
Run Code Online (Sandbox Code Playgroud)

在my-page.html中,我想运行一些javascript,但无法正常运行。即使是简单的脚本也不会执行:

<html>
   <body>
     <script type="text/javascript">
        document.write("JS executed")
     </script>
   </body>
</html>
Run Code Online (Sandbox Code Playgroud)

所打开页面的URL与相似moz-extension://8974747a-3aa7-4654-93e5-ad60d3de0cc5/my-page.html。我曾尝试禁用NoScript等插件,但无济于事。

如何在此页面上执行JS?我究竟做错了什么?谢谢你的帮助。

根据请求编辑:manifest.json:

{

  "description": "Adds browser action icon to toolbar to open packaged web page. See https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Examples#open-my-page-button",
  "manifest_version": 2,
  "name": "open-my-page",
  "version": "1.0",
  "homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/open-my-page-button",
  "icons": {
    "48": "icons/page-48.png"
  },

  "applications": {
    "gecko": {
      "id": "open-my-page-button@mozilla.org",
      "strict_min_version": "45.0"
    }
  },

  "background": {
    "scripts": ["background.js"]
  },

  "browser_action": {
    "default_icon": "icons/page-32.png"
  }

}
Run Code Online (Sandbox Code Playgroud)

它直接取自Mozilla的示例之一。

Mak*_*yen 6

内联脚本不适用于默认内容安全策略

您可能正在运行默认内容安全策略,该策略是:

"script-src 'self'; object-src 'self';"
Run Code Online (Sandbox Code Playgroud)

这意味着内联JavaScript将无法运行。换句话说,您的HTML中不允许进行以下操作:

<script type="text/javascript"> document.write("JS executed")</script>
Run Code Online (Sandbox Code Playgroud)

要么

<script>console.log("foo");</script>
Run Code Online (Sandbox Code Playgroud)

要么

<div onclick="console.log('click')">Click me!</div>
Run Code Online (Sandbox Code Playgroud)


常规解决方案:常规解决方案是将所有JavaScript移至一个或多个单独的文件中,并在文件中包含以下内容:

<script type="text/javascript" src="my-page.js"></script>
Run Code Online (Sandbox Code Playgroud)

使用内联脚本:
如果希望使用内联脚本,则可以content_security_policymanifest.json文件中使用密钥。但是,您将需要在“ script-src”指令中提供脚本的哈希值。

除非出于某种原因,除非您确实需要使用内联脚本,否则您可能会发现将所有脚本内容移动到外部文件容易得多,而不是在HTML中内联脚本(这将需要您重新计算哈希值)对脚本的任何更改)。

在Firefox 48中实现:
此内容安全策略在Firefox 48实现。关于Firefox 48的博客文章一定要提及:

请注意:对于任何不遵守此CSP的Firefox WebExtensions,这都是向后不兼容的更改。不符合CSP的现有WebExtensions将需要更新。

您的具体情况:

如果将脚本更改为(创建哈希时,空格计数),它将起作用:

<script type="text/javascript">document.write("JS executed");</script>
Run Code Online (Sandbox Code Playgroud)

并且,将以下行添加到manifest.json

"content_security_policy": "script-src 'self' 'sha256-Z4nYjltJ/RciFs77n2n91dzwoz1Qg/1JFwU5ODwWPC8='; object-src 'self';"
Run Code Online (Sandbox Code Playgroud)