如何使用 postMessage API 发送 javascript 对象
how to send javascript object with postMessage API
我知道 node.js 有加密模块(使用 openssl)来完成 enc/decrypt(aes,ecc...) 工作。但不知道如何在浏览器中进行。
所以我们使用 elliptic 包,并将其打包在 bundle.js 中,它在网络上运行良好。
我们想把它做成一个chrome插件。但是我不知道chrome插件是如何提供功能给用户网页调用的。
我在 content_script 中使用 postMessage 向用户网页发送消息,但只能发送 json 数据,如果我用 javascript 对象发送它(bundle.js object I pack with many enc functions). 它会抱怨 'could not be cloned' error。
更好的方法是将加密函数保留在 background.js 中,并通过消息将您想要处理的数据传递到后台,并让它将结果发送回页面。
例如,如果您想加密选定的文本,请在您的内容脚本中:
const encryptText = function (text) {
return new Promise(function (resolve,reject) {
chrome.extension.sendMessage({
method : 'cryptoFunc',
data : text,
});
let tempListener = function (response,sender) {
if (response.method === 'cryptoFunc_response') {
resolve(response.data);
chrome.extension.onMessage.removeListener(tempListener);
}
};
chrome.extension.onMessage.addListener(tempListener);
});
};
let selectedText = window.getSelection().toString();
encryptText(selectedText).then(function (encrpted) {
console.log(encrypted);
});
在您的后台脚本中:
chrome.extension.onMessage.addListener(function (request,sender) {
if (request.method === 'cryptoFunc') {
let result = cryptoFunc(request.data);
chrome.tabs.sendMessage(sender.tab.id, {
method : 'cryptoFunc_response',
data : result,
});
}
});
我知道 node.js 有加密模块(使用 openssl)来完成 enc/decrypt(aes,ecc...) 工作。但不知道如何在浏览器中进行。
所以我们使用 elliptic 包,并将其打包在 bundle.js 中,它在网络上运行良好。
我们想把它做成一个chrome插件。但是我不知道chrome插件是如何提供功能给用户网页调用的。
我在 content_script 中使用 postMessage 向用户网页发送消息,但只能发送 json 数据,如果我用 javascript 对象发送它(bundle.js object I pack with many enc functions). 它会抱怨 'could not be cloned' error。
更好的方法是将加密函数保留在 background.js 中,并通过消息将您想要处理的数据传递到后台,并让它将结果发送回页面。
例如,如果您想加密选定的文本,请在您的内容脚本中:
const encryptText = function (text) {
return new Promise(function (resolve,reject) {
chrome.extension.sendMessage({
method : 'cryptoFunc',
data : text,
});
let tempListener = function (response,sender) {
if (response.method === 'cryptoFunc_response') {
resolve(response.data);
chrome.extension.onMessage.removeListener(tempListener);
}
};
chrome.extension.onMessage.addListener(tempListener);
});
};
let selectedText = window.getSelection().toString();
encryptText(selectedText).then(function (encrpted) {
console.log(encrypted);
});
在您的后台脚本中:
chrome.extension.onMessage.addListener(function (request,sender) {
if (request.method === 'cryptoFunc') {
let result = cryptoFunc(request.data);
chrome.tabs.sendMessage(sender.tab.id, {
method : 'cryptoFunc_response',
data : result,
});
}
});