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