javascript - Firefox 插件向网站公开 chrome 功能

标签 javascript save firefox-addon

我想问你如何使用插件向网页内容公开功能。 我已经安装了 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/

相关文章:

javascript - 用javascript计算点返回一半

memory - 如何保存 C 程序的内存状态以便稍后启动

c# - ConfigurationManager.save() 失败

Firefox Add-on SDK 及其兼容性?

firefox-addon - 开始使用 firefox 附加组件...... SDK 是正确的选择吗?

javascript - 链接多个异步函数

javascript else if JSX 中的情况

javascript - 使用 mmenu 修复 Bootstrap Modal

javascript - 关于这个 React 自定义钩子(Hook)用法的困惑

azure - 将 'Set Variable' 事件的输出保存到 csv 文件中 [Azure 数据工厂]