2017-03-01 27 views
0

我正在嘗試構建Safari擴展以共享網頁截圖,但是當我嘗試將圖像傳回Swift時,出現一個錯誤,導致Safari不穩定並殺死了我的任務。在Safari擴展中使用dispatchMessage時出現WebKitSubtleCrypto錯誤

這個想法是,當用戶點擊工具欄按鈕時,任何選定的文本和網頁的屏幕截圖都將被保存。我試圖通過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調用來完成。如果我取出屏幕截圖並只傳遞selectedText數據,則按預期工作。我也試圖通過作爲畫布傳遞屏幕截圖,而不是通過'convertCanvasToImage()'調用運行它,但是我得到了與此相同的錯誤。

回答

0

該問題最終與我在將畫布轉換爲數據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; 
} 

解決了這個問題。

在雨燕側這是怎麼了解碼的數據(謹慎在此的所有強制的):

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