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的示例之一。
"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_policy在manifest.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)
| 归档时间: |
|
| 查看次数: |
3458 次 |
| 最近记录: |