在 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)
我正在尝试构建一个 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)