2015-07-19 40 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