我想问你如何使用插件向网页内容公开功能。 我已经安装了 jpm 工具(node.js 上的新 cfm)来制作包。
所以我必须使用 Cu.exportFunction,好吧,它可以工作,但是当添加内容、unsafeWindow、窗口或任何内容作为上下文时,jpm run 会抛出错误未定义。 完整消息:ReferenceError:unsafeWindow 未定义 抱歉,我问了一个基本问题,但是有三种方法可以制作插件、几个类、sdk 和大量的文档,其中大部分已被弃用或无法工作。
我想从网站提供保存到文件的访问权限,无需用户交互。
目标 Firefox 38+,平台 Windows,仅在本地使用。我不太关心安全问题,这是我自己的计算机,我的脚本和脚本将由我的同事在本地使用。
有一段时间我一直在使用enablePrivileged代码,而不是解决方法,zipjs,php本地服务器等等。 来自 mdn 的 Workers 解决方案对我不起作用(只是类似的错误,如果它有效,我宁愿使用没有开销的东西)。
来自 Mozillas github 的代码无法运行(有很多错误)。
我一步一步在做什么? 安装了node.js(两天前的最新版本),安装了jpm(也是两天前)。 jpm初始化 然后复制粘贴的片段以保存 Canvas 和导出功能。 摩根运行。 这就是一切。两天来我一直在努力让它工作,用谷歌搜索答案,搜索 MDN 和 SO。 没什么。
它应该如何运作? 我根据给定的首选项和数据在 Canvas 上生成 200 多个绘图(代码不相关),然后我希望将所有 Canvas 保存在目录中。我给每个 Canvas 起了名字,文件类型是png。 当 Canvas 生成时,我想执行 saveCanvas snipet,为其命名并进一步执行。
像 PHP、zip 或其他这样的解决方法会带来超过 2GB 的 RAM 开销和几分钟的处理时间。有时它会超出内存。
我不想让 XUL 扩展来交互、添加闪存或其他技术。 只需使用插件保存 Canvas 即可。
我只是在寻找如何使此代码片段发挥作用的解决方案。
提前致谢。
//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 提供的良好链接,它有助于注入(inject)函数。
如果有人知道更好的解决方案,请分享,但目前此代码有效。
它将给定 Canvas 中的 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);
};
关于javascript - Firefox 插件向网站公开 chrome 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31502231/