2015-07-19 44 views
2

我想問你如何使用插件將功能暴露給網頁內容。 我已經安裝了jpm工具(node.js上的新cfm)來打包。Firefox插件將鉻功能暴露給網站

所以我必須使用Cu.exportFunction,它可以工作,但是當添加內容,unsafeWindow,窗口或任何上下文時,jpm run throw error undefined。 完整信息:ReferenceError:unsafeWindow未定義 對不起基本問題,但有三種方法可以創建插件,幾個類,sdk和真正可怕的文檔量,其中大多數不推薦使用或不使用。

我想保存從網站的文件訪問,沒有用戶交互。

目標Firefox是38+,平臺窗口,只用於本地。我並不關心安全問題,它是我自己的電腦,我的腳本和腳本將由我的同事在本地使用。

一段時間以來,我一直在使用enablePrivileged代碼,比變通辦法,zipjs,php本地服務器等。 mdn的工作人員解決方案對我不起作用(簡單地類似的錯誤,如果它能工作,我寧願使用沒有開銷的東西)。

來自Mozillas github的代碼不起作用(很多錯誤)。

我在做什麼一步一步來? 安裝了node.js(兩天前的最新版本),安裝了jpm(也是兩天前)。 jpm init 然後複製粘貼的代碼片段來保存畫布和導出功能。 jpm運行。 這就是一切。兩天來,我試圖讓它工作,搜索答案,搜索MDN和SO。 什麼都沒有。

它應該如何工作? 根據給定的偏好和數據,我在畫布上生成了200多個圖(代碼無關緊要),然後我希望將所有畫布保存在目錄中。我給每個畫布命名,filetype是png。 當canvas生成時,我想執行saveCanvas snipet,給它命名並繼續。

變通方法如PHP,zip或其他方式會導致超過2GB的內存開銷和幾分鐘的處理時間。有時它會消失。

我不想讓XUL擴展來交互,添加閃存或其他技術。 只需使用插件保存畫布。

我只看解決方案如何使這個片段的工作。

在此先感謝。

//https://developer.mozilla.org/en-US/Add-ons/Code_snippets/Canvas 
function saveCanvas(canvas, path, type, options) { 
    return Task.spawn(function *() { 
     var reader = new FileReader; 
     var blob = yield new Promise(accept => canvas.toBlob(accept, type, options)); 
     reader.readAsArrayBuffer(blob); 

     yield new Promise(accept => { reader.onloadend = accept }); 

     return yield OS.File.writeAtomic(path, new Uint8Array(reader.result), { tmpPath: path + '.tmp' }); 
    }); 
} 
let { Cu } = require('chrome'); 
    Cu.exportFunction(saveCanvas, unsafeWindow, {defineAs: "saveCanvas"}); 

也許有更好的方法來應用它?

+0

簡單,使用'Cu.exportFunction' :) https://developer.mozilla.org/en-US/docs/Components.utils.exportFunction真棒工作btw! – Noitidart

+1

我正在使用這部分,上下文給定不工作 - unsafeWindow是未定義的。這些代碼也來自MDN,不是我的。 – Evil

+0

exportFunction在這裏使用檢查出來:https://github.com/IntelLabs/RiverTrail/blob/master/extension/lib/main.js#L47 – Noitidart

回答

3

謝謝Noitidart的良好鏈接,它有助於注入功能。

如果有人知道更好的解決方案,請分享,但現在這個代碼的作品。

它保存來自指定畫布和文件名的PNG文件在沒有tmp文件的桌面目錄中。

const { Cc, Ci, Cu } = require('chrome'); 
const { OS } = Cu.import("resource://gre/modules/osfile.jsm"); 
const { Task } = Cu.import("resource://gre/modules/Task.jsm"); 

function saveCanvas(canvas, name) { 
    var path = OS.Path.join(OS.Constants.Path.desktopDir, name); 
    return Task.spawn(function *() { 
     var reader = Cc['@mozilla.org/files/filereader;1'].createInstance(Ci.nsIDOMFileReader); 
     var blob = yield new Promise(accept => canvas.toBlob(accept)); 
     reader.readAsArrayBuffer(blob); 
     yield new Promise(accept => { reader.onloadend = accept }); 
     return yield OS.File.writeAtomic(path, new Uint8Array(reader.result)); 
    }); 
} 

function expose(event) { 
    Cu.exportFunction(saveCanvas, event.subject, {defineAs: "saveCanvas"}); 
} 

exports.main = function(options, callbacks) { 
    var events = require("sdk/system/events"); 
    events.on("content-document-global-created", expose); 
}; 
+0

感謝您分享一個真棒解決方案!如果還有改進的空間,我希望有經驗的人可以驗證/告訴我們。開源! :) – Noitidart