为 Firefox 扩展实现一个 Javascript 插件系统
Implementing a Javascript plugin system for Firefox extensions
我们正在尝试构建一个Firefox扩展,其中我们的扩展将包含许多Javascript插件。这里的插件被定义为一组具有主入口点的函数,它们通常提供响应。在OOP中,它们将共享相同的公共抽象类,并且预见到$obj->init()->run()->get()链。
它们将是一个插件池,每个插件都应该有一个等级,插件的执行应该根据它们的等级来执行。
主要问题是:
- 如何在裸露的Javascript
中创建插件系统- 它们是JS中可用于启动
的任何开源插件系统- 您将如何存储插件池系统及其排名,以及
- 您将如何确保插件按其排名顺序执行
你的问题真的很模糊,所以我将根据一堆猜测来回答它。您可能希望执行类似于附加 SDK 在内部执行的操作 - 将插件加载到沙箱中,为它们提供一些 API 并根据需要调用它们的方法。另外,我猜您想使用空主体来确保沙箱没有其他权限。像这样的事情应该做:
Components.utils.import("resource://gre/modules/Services.jsm");
var sandboxProto = {
rank: -1,
foo: function()
{
throw new Error("Please implement");
},
myAPIMethod: function()
{
return 5;
}
};
var sandboxPrincipal = Components.classes["@mozilla.org/nullprincipal;1"]
.getService(Components.interfaces.nsIPrincipal);
var plugins = [];
function loadPlugin(url)
{
try
{
var sandbox = Components.utils.Sandbox(sandboxPrincipal, {
sandboxName: url,
sandboxPrototype: sandboxProto
});
Services.scriptloader.loadSubScript(url, sandbox);
plugins.push(sandbox);
}
catch (e)
{
Components.utils.reportError(e);
}
}
function callPluginMethod(methodName)
{
var args = Array.prototype.slice.call(arguments, 1);
// Always resort plugins in case their rank changes
plugins.sort(function(a, b)
{
// Make sure that we work with numbers
var r1 = parseInt(a.rank, 10) || -1;
var r2 = parseInt(a.rank, 10) || -1;
return r2 - r1;
});
var results = [];
for (var i = 0; i < plugins.length; i++)
{
if (methodName in plugins[i])
{
try
{
results.push(plugins[i][methodName].apply(plugins[i], args));
}
catch (e)
{
Components.utils.reportError(e);
}
}
}
return results;
}
插件看起来像这样:
var rank = 1000;
function foo()
{
return 2 * myAPIMethod();
}
因此,以下代码应向您显示[10]
:
loadPlugin("chrome://.../content/plugin.js");
var results = callPluginMethod("foo");
alert(results.toSource());
至于你的扩展如何知道在哪里可以找到它的插件 - 这是一个完全不同的问题,很大程度上取决于需求(这个问题缺少的东西)。但请注意,下标加载器仅适用于本地 URL - 只有属于扩展的一部分或位于用户磁盘上的插件才能工作。如果插件列表是动态的,那么您可能希望在用户的配置文件中为它们创建一个目录,并根据需要将它们下载到该目录(您应该非常小心,不要给这些插件太多权限,以避免安全问题)。
相关文章:
- 我应该如何从xml文件构建一个javascript页面
- 有没有一个javascript图形绘制库可以进行气球树布局
- 如何将一个JavaScript函数回调为多个函数
- 代码背后调用一个JavaScript函数的按钮点击-C#
- 多次调用另一个javascript函数中的javascript函数
- HTML外部javascript加载另一个javascript
- 在一个javascript文件中为整个网站创建标签
- 在任何AJAX调用之前触发一个javascript函数
- 如何用另一个Javascript更改Javascript函数值
- 动态创建一个javascript/jquery多级数组
- 将变量值从一个javascript传递到另一个javascript
- 获取一个javascript对象attr's
- 是一个javascript bookmarklet,可以设置破坏跨域安全的域cookie
- PNG图像被覆盖,但每个图像都有一个链接可以更改,每次一个-Javascript/jQuery/CSS
- 添加一个javascript函数来下载elfinder上的事件
- 有没有一个Javascript代码可以看到你的缓存有多满
- 使用jenkins从不同文件夹中的文件构建一个javascript文件
- 是否有一个javascript库来解析简单的查询
- 一个javascript实现base64图像编码并将结果写入文本文件
- 使用一个Javascript函数提交多个表单可以在FF中工作,而不需要其他浏览器