我想问你如何使用插件将函数公开到网页内容中。
我已经安装了jpm工具(node.js上的新cfm)来制作软件包。
因此,我必须使用Cu.exportFunction,好了,但是添加内容,unsafeWindow,window或上下文jpm运行时抛出的任何错误均未定义。
完整消息:ReferenceError:未定义unsafeWindow
抱歉,有一个基本问题,但是有三种制作插件的方法,几个类,sdk和数量惊人的文档,其中大多数已被弃用或不起作用。
我想在没有用户交互的情况下提供对网站文件的保存访问。
目标Firefox为38+,平台窗口,仅本地使用。我并不真正关心安全问题,它是我自己的计算机,我的脚本和脚本将在我的同事本地使用。
一段时间以来,我一直在使用enablePrivileged代码,而不是变通方法,zipjs,php本地服务器等。
来自mdn的Workers解决方案对我不起作用(简单的类似错误,如果可行,我宁愿使用没有开销的东西)。
来自Mozillas github的代码不起作用(有很多错误)。
我正在逐步做什么?
安装了node.js(两天前的最新版本),安装了jpm(也是两天前)。
jpm初始化
然后复制粘贴的片段以保存画布和导出功能。
jpm运行。
那就是一切。有两天时间,我一直在努力使其工作,用谷歌搜索答案,搜索MDN和SO。
没有。
应该如何运作?
我根据给定的首选项和数据在画布上生成了200多个图(与代码无关),然后我希望所有画布都保存在目录中。我给每个画布命名,文件类型是png。
当生成画布时,我想执行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"});
也许有更好的方法来应用它?
最佳答案
谢谢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);
};