Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PostMessageAPI发送javascript对象_Javascript_Encryption_Google Chrome Extension_Postmessage - Fatal编程技术网

如何使用PostMessageAPI发送javascript对象

如何使用PostMessageAPI发送javascript对象,javascript,encryption,google-chrome-extension,postmessage,Javascript,Encryption,Google Chrome Extension,Postmessage,我知道node.js有加密模块(使用openssl)来执行加密/解密(aes、ecc…)工作。但我不知道如何在浏览器中实现 所以我们使用了这个包,并将它打包在bundle.js中,它在web中运行良好 我们想让它成为一个chrome插件。但我不知道chrome插件如何为用户网页提供调用功能 我在content_脚本中使用postMessage向用户网页发送消息,但如果我使用javascript对象(我用许多enc函数打包的bundle.js对象)发送json数据,则只能发送json数据。它会抱怨

我知道node.js有加密模块(使用openssl)来执行加密/解密(aes、ecc…)工作。但我不知道如何在浏览器中实现

所以我们使用了这个包,并将它打包在bundle.js中,它在web中运行良好

我们想让它成为一个chrome插件。但我不知道chrome插件如何为用户网页提供调用功能

我在content_脚本中使用postMessage向用户网页发送消息,但如果我使用javascript对象(我用许多enc函数打包的bundle.js对象)发送json数据,则只能发送json数据。它会抱怨“无法克隆”错误


更好的方法是将加密函数保留在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,
    });
  }
});

我知道window.crypto API,但我认为这是部分支持,我们需要更多的功能,比如Ecc、SM(中国国家密码标准)。我们不希望它像web静态资源一样,所以我们可以在没有用户许可的情况下随时更改它的版本(这就是为什么我们希望它成为插件)要向页面上下文公开函数,唯一的方法是创建DOM脚本元素:。