我想问你如何使用插件向网页内容公开功能。 我已经安装了jpm工具(node.js上的新cfm)来创建包。
所以我必须使用Cu.exportFunction,确定它有效,但是当添加内容,unsafeWindow,窗口或任何内容作为上下文jpm运行时抛出错误未定义。 完整消息:ReferenceError:未定义unsafeWindow 很抱歉基本的问题,但有三种方法可以制作插件,几个类,sdk和非常可怕的文档数量,其中大多数已被弃用或无效。
我想从网站上保存文件访问权限,无需用户互动。
目标Firefox是38+平台窗口,仅限本地使用。我并不关心安全问题,它是我自己的计算机,我的脚本和脚本将由我的同事在本地使用。
有一段时间我一直在使用enablePrivileged代码,而不是变通办法,zipjs,php本地服务器等等。 来自mdn的worker解决方案对我来说不起作用(只是类似的错误,如果它可以工作,我宁愿使用没有开销的东西)。
来自Mozillas github的代码无效(很多错误)。
我一步一步做什么? 安装了node.js(两天前的最新版本),安装了jpm(也是两天前)。 jpm init 然后复制粘贴的片段以保存画布和导出功能。 jpm跑。 这就是一切。有两天我试图让它工作,用谷歌搜索答案,搜索MDN和SO。 什么都没有。
它应该如何运作? 基于给定的首选项和数据,我在画布上生成了200多个绘图(代码无关紧要),然后我希望所有画布都保存在目录中。我给每个画布命名,文件类型是png。 当生成canvas时,我想执行saveCanvas snipet,命名并进一步。
PHP,zip等工作区提供超过2GB的RAM开销和几分钟的处理时间。有时它会失去记忆。
我不想让XUL扩展进行交互,添加flash或其他技术。 只需使用插件保存画布。
我正在寻找解决方案如何使这个代码段工作。
提前致谢。
//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 :(得分: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);
};