【问题标题】:Firefox addon expose chrome function to websiteFirefox 插件向网站公开 chrome 功能
【发布时间】:2015-07-19 14:26:14
【问题描述】:

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

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

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

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

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

来自 Mozillas github 的代码不起作用(很多错误)。

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

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

PHP、zip 或其他解决方法会产生超过 2GB 的 RAM 开销和几分钟的处理时间。有时它会耗尽内存。

我不想让 XUL 扩展来交互、添加 flash 或其他技术。 只需使用插件保存画布。

我只是在寻找如何使这个 sn-p 工作的解决方案。

提前致谢。

//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"});

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

【问题讨论】:

标签: javascript save firefox-addon


【解决方案1】:

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

【讨论】:

  • 感谢分享一个很棒的解决方案!如果有改进的余地,我希望有这方面经验的人可以验证/让我们知道。去开源! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多