在浏览器扩展中使用 libsodium.js

Using libsodium.js in a browser extension

我正在尝试在扩展中使用 libsodium.js 库,到目前为止只在 Chrome(当前版本 71)中进行了测试。

到目前为止,它在标准网页上下文中运行良好,但是当我尝试在扩展程序中加载它时,出现错误。无论是作为脚本加载,还是我在清单中将一个页面定义为唯一的脚本并使脚本异步(字面上与浏览器页面中的完全相同):

<script src="dist/browsers/sodium.js" async></script>

我只在扩展程序而不是网页中遇到同样的错误。错误是:

Uncaught (in promise) TypeError: s is not a function

据我所知,当页面为扩展加载时,似乎有一个尚未解决的承诺包含 function s,但网页正确解决了它。也许我错了,因为它是由 Emscripten 生成的 8200 多行代码,所以通读起来有点迟钝。我似乎无法在扩展文档或我所做的大量谷歌搜索中找到任何答案。

任何人都可以指出正确的方向来解决这个问题吗?

这个问题的答案是扩展有更严格的内容安全策略。他们不允许执行 eval 或类似 eval 的函数。显然,在这个库的 webassembly 中,至少有一个这样的函数阻碍了 promise 的成功。

可以在这里找到解决方案:https://developer.chrome.com/extensions/sandboxingEval

它确实可以来回发送消息,并且 iframe 确实可以访问 promise 中的 library/resulting 代码。

我希望这对其他人也有帮助,如果需要编辑或澄清,请告诉我。