Firefox 插件向网站公开 chrome 功能

Firefox addon expose chrome function to website

我想问一下如何使用插件向网页内容公开功能。 我已经安装了 jpm 工具(node.js 上的新 cfm)来制作包。

所以我必须使用 Cu.exportFunction,好的,它可以工作,但是当添加内容时,unsafeWindow,window 或任何作为上下文的 jpm 运行 抛出错误未定义。 完整信息:ReferenceError: unsafeWindow is not defined 很抱歉这个基本问题,但是有三种制作插件的方法,几种 类,sdk 和非常多的文档,其中大部分已被弃用或无法使用。

我想提供从网站访问文件的保存权限,无需用户交互。

目标 Firefox 为 38+,平台 windows,仅限本地使用。我不太关心安全问题,是我自己的电脑,我的脚本和脚本我的同事会在本地使用。

一段时间以来,我一直在使用 enablePrivileged 代码,而不是解决方法、zipjs、php 本地服务器等。 来自 mdn 的 Workers 解决方案对我不起作用(只是类似的错误,如果它可以工作,我宁愿使用没有开销的东西)。

来自 Mozillas github 的代码无法正常工作(很多错误)。

我在一步步做什么? 安装了node.js(前两天最新版本),安装了jpm(也是前两天)。 初始化 然后复制粘贴的片段以保存 canvas 并导出函数。 jpm 运行。 这就是一切。两天来,我一直在努力让它发挥作用,用谷歌搜索答案,搜索 MDN 和 SO。 没有。

它应该如何运作? 我根据给定的偏好和数据在 canvas(代码无关)上生成了 200 多个图,然后我希望所有 canvas 都保存在目录中。我给每个 canvas 命名,文件类型是 png。 当生成 canvas 时,我想执行 saveCanvas snipet,给它命名并继续。

PHP、zip 等解决方法,否则会产生超过 2GB 的 RAM 开销和几分钟的处理时间。有时会内存不足。

我不想让 XUL 扩展来交互、添加 flash 或其他技术。 只需使用插件保存 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 link,它帮助注入了函数。

如果有人知道更好的解决方案,请分享,但目前此代码有效。

它保存来自给定 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);
};