使用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);
});
我正在尝试将 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);
});