Firefox插件将chrome功能暴露给网站

时间:2015-07-19 14:26:15

标签: javascript save firefox-addon

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

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

我想从网站上保存文件访问权限,无需用户互动。

目标Firefox是38+平台窗口,仅限本地使用。我并不关心安全问题,它是我自己的计算机,我的脚本和脚本将由我的同事在本地使用。

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

来自Mozillas github的代码无效(很多错误)。

我一步一步做什么? 安装了node.js(两天前的最新版本),安装了jpm(也是两天前)。 jpm init 然后复制粘贴的片段以保存画布和导出功能。 jpm跑。 这就是一切。有两天我试图让它工作,用谷歌搜索答案,搜索MDN和SO。 什么都没有。

它应该如何运作? 基于给定的首选项和数据,我在画布上生成了200多个绘图(代码无关紧要),然后我希望所有画布都保存在目录中。我给每个画布命名,文件类型是png。 当生成canvas时,我想执行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"});

也许有更好的方法来应用它?

1 个答案:

答案 0 :(得分:3)

感谢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);
};