问题描述
我正在尝试将CryptoKey
对象(由SubtleCrypto.generateKey()
生成)从内容脚本发送到网络扩展程序的背景页面。
使用chrome.runtime.sendMessage
发送对象时,对象将丢失,因为CryptoKey
无法字符串化(另请参见this question)。使用window.postMessage
将密钥转移到另一个窗口确实可行,因为此方法使用结构化克隆。
是否有类似于postMessage
的东西来发送无法字符串化的数据到网络扩展的背景页面?
解决方法
感谢@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);
});