在 Safari 扩展中使用 dispatchMessage 时出现 WebKitSubtleCrypto 错误

WebKitSubtleCrypto error when using dispatchMessage in Safari Extension

我正在尝试构建一个 Safari 扩展程序来共享网页的屏幕截图,但是当我尝试将图像传回 Swift 时,我收到一个错误,使 Safari 变得不稳定并在中途终止了我的任务。

这个想法是,当用户点击工具栏按钮时,任何选定的文本和网页的屏幕截图都会被保存。我试图通过 userInfo 字典传递这两个。如果我 运行 我的代码与 dispatchMessage 调用一样被注释掉,我看不到任何错误。如果我取消注释调度调用,我会看到以下错误:

 WebKitSubtleCrypto is deprecated. Please use SubtleCrypto instead.

这是我的js代码:

document.addEventListener("DOMContentLoaded", function(event) {
    safari.self.addEventListener("message", handleMessage);
});

function handleMessage(event) {
    var selectedText = window.getSelection().toString();
    var screenshot;

    if (window.top === window) {
  html2canvas(document.getElementsByTagName('html')).then(function(canvas) {
        screenshot = convertCanvasToImage(canvas);
        console.log("canvas image: " + screenshot)
        safari.extension.dispatchMessage("test", {"selectedText": selectedText, "screenshot" : canvas});
        });
    }
}

function convertCanvasToImage(canvas) {
   var image = new Image();
   image.src = canvas.toDataURL("image/png");
   return image;
}

html2canvas(最新 - 0.5.0-beta4)脚本位于另一个与扩展名打包在一起的文件中。

编辑 1

经过更多测试后,该错误似乎只与在 messageDipatch 调用中传递 'screenshot' 对象有关。如果我取出屏幕截图并仅传递 selectedText 数据,它将按预期工作。我还尝试将屏幕截图作为 canvas 而不是 运行 通过 'convertCanvasToImage()' 调用传递,但我遇到了同样的错误。

问题最终与我在将 canvas 转换为数据 url 之前初始化图像数据的方式有关。

来自:

function convertCanvasToImage(canvas) {
   var image = new Image();
   image.src = canvas.toDataURL("image/png");
   return image;
}

至:

function convertCanvasToImage(canvas) {
    var imageData = canvas.toDataURL("image/png")
    return imageData;
}

问题已解决。

在 Swift 方面,这就是我解码该数据的方式(小心其中的所有强制):

    let imageString = userInfo?["screenshot"] as! String
    let imageData = NSData.init(contentsOf: NSURL(string: imageString) as! URL)
    let image = NSImage(data: imageData as! Data)