我想问你如何使用插件将函数公开到网页内容中。
我已经安装了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);
};

07-24 18:56