使用postMessage扩展后台页面

Using postMessage to extension background page

我正在尝试将 CryptoKey(由 SubtleCrypto.generateKey() 生成)对象从内容脚本发送到 Web 扩展程序的后台页面。

当使用 chrome.runtime.sendMessage 发送对象时,它会丢失,因为 CryptoKey 不可字符串化(另请参阅 )。使用 window.postMessage 将密钥传输到另一个 window 确实有效,因为此方法使用结构化克隆..

是否有类似于 postMessage 的方法将不可字符串化的数据发送到 Web 扩展程序的后台页面?

感谢@wOxxOm 的评论,我通过使用以下代码创建可访问的网络资源解决了这个问题:

window.addEventListener("message", receiveMessage, false);

function receiveMessage(event) {
  chrome.extension.getBackgroundPage().postMessage(event.data, "*");
}

这是由这样的内容脚本触发的:

let iframe = document.createElement('iframe');
iframe.setAttribute('src', chrome.extension.getURL('webaccessible/index.html'));
iframe.addEventListener("load", () => {
  iframe.contentWindow.postMessage(data);
})

虽然数据是包含 CryptoKey 的对象。

这些数据是在后台脚本中接收的,就像您通常会收到此类消息一样:

window.addEventListener('message',(event) => {
  console.log(event);
});