某些信息被传递给一个不重启的附加组件
function startup(data, reason) { }
data = {
id: "***********",
version: "1.0",
installPath: XPCWrappedNative_NoHelper, // nsIFile
resourceURI: XPCWrappedNative_NoHelper, // nsIURI
oldVersion: "1.0"
};
以上是唯一可用的数据吗?是否有可能获得插件名称而不访问AddonManager?
我使用AddonManager的经验。Jsm 已经证明它体积庞大且速度缓慢。[1]
如果上面是唯一可用的数据,那么为安装获取nsIURI的最佳方法是什么?rdf在不启动的插件(以XHR访问)?在overlay插件中,我添加了指向install.rdf的resource
链接。但是,resource
在不可重新启动的插件中不可用,并且不希望设置以下内容
content addon ./
[1] 更新:澄清/更正:
定时XHR获取不包括XML解析和数据提取。因此,整个操作(XHR、回调、responseXML、抓取数据)将花费更长的时间。
以上是唯一可用的数据吗?
是的,显然。文档,顺便说一句。
是否可以在不访问AddonManager的情况下获得插件名称?
。(好吧,你谈论自己解析install.rdf
,这是一种可能性,但我认为这是一个蹩脚的。AddonManager
为支持推荐方式;例如,考虑元数据的极端情况,例如元数据(包括名称可能是从在线源刷新的)。
我真的怀疑你的数字。我使用AddonManager的经验。JSM已经证明了它的笨重和缓慢。例如,异步解析安装。在通过AddonManager获取相同的数据时,使用XHR的rdf大约需要1ms。JSM耗时160-170ms。那就慢了160-170倍。
1ms
XHR ? !即使XHR设置花费的时间比这更长,即使XPI(或平面install.rdf
)已经在内部缓存或至少在操作系统磁盘缓存中,I/O也会花费更长的时间,即使您没有将其解析为XML并从文本内容中Regexp出所需的内容。
另外,请注意,AddonManager
在调用startup()
方法时不一定初始化元数据库。此时调用任何AddonManager
查询方法都将强制初始化一次,这意味着第一次调用可能有点慢。
一般来说,你不应该请求任何数据,例如附加组件的名称,直到你真正需要它,特别是在启动时。
如果上面是唯一可用的数据,那么获取nsIURI用于安装的最佳方法是什么?rdf在重新启动的插件(以XHR访问)?
使用__SCRIPT_URI_SPEC__
或data.resourceURI
:
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/Services.jsm");
// Using proper URI parsing
let selfURI = Services.io.newURI(__SCRIPT_URI_SPEC__, null, null);
let installRDF = Services.io.newURI("install.rdf", null, selfURI).spec;
Cu.reportError(installRDF);
// Or using string manipulation
let baseURISPEC = __SCRIPT_URI_SPEC__.substr(
0,
__SCRIPT_URI_SPEC__.length - "bootstrap.js".length
);
let installRDF2 = baseURISPEC + "install.rdf";
Cu.reportError(installRDF2);
Cu.reportError((installRDF == installRDF2).toString()); // true
let installRDF = Services.io.newURI("install.rdf", null, selfURI).spec;
Cu.reportError(installRDF);
function startup(data) {
// Or using bootstrap data
let installRDF3 =
Services.io.newURI("install.rdf", null, data.resourceURI).spec;
Cu.reportError(installRDF3);
Cu.reportError((installRDF == installRDF3).toString()); // true
}
__SCRIPT_URI_SPEC__
的优点是它可以立即使用,而不仅仅是在入口点方法中。
编辑我很好奇,还有时间之类的。
[LOG] AM: 177, 18, 1, 1, 0, 0, 0, 0, 0, 1
[LOG] AM: avg 0.4
[LOG] AM: 168, 18, 1, 0, 0, 1, 0, 0, 0, 0
[LOG] AM: avg 0.3
[LOG] AM: 169, 21, 1, 0, 1, 0, 0, 0, 0, 0
[LOG] AM: avg 0.3
[LOG] XX: 160, 25, 25, 4, 1, 2, 2, 3, 1, 1
[LOG] XX: avg 30.9
[LOG] XX: 137, 20, 19, 4, 1, 2, 3, 2, 0, 1
[LOG] XX: avg 26.0
[LOG] XX: 145, 22, 25, 3, 2, 2, 2, 2, 1, 1
[LOG] XX: avg 25.1
所以XHR并没有更快。在第一次访问时稍微差一点,在随后的一些运行中稍微差一点(可以解释,因为它有点昂贵,并且在启动期间运行,其中许多其他东西也消耗资源),之后差异可以忽略不计。但是对于XHR,您仍然需要从DOM中获取名称,而对于AM,它只是addon.name
。
这是我的微基准:
const {classes: Cc, interfaces: Ci, utils: Cu, Constructor: CC} = Components;
Cu.import("resource://gre/modules/Services.jsm");
// Using proper URI parsing
let selfURI = Services.io.newURI(__SCRIPT_URI_SPEC__, null, null);
let installRDF = Services.io.newURI("install.rdf", null, selfURI).spec;
Cu.reportError(installRDF);
const XMLHttpRequest =
CC("@mozilla.org/xmlextras/xmlhttprequest;1", "nsIXMLHttpRequest");
function log(s) {
dump("[LOG] " + s + "n");
}
function print(name, diffs) {
log(name + ": " + diffs.join(", "));
// Average, disregarding single best, and two worst
diffs.sort();
diffs.shift();
diffs.pop();
diffs.pop();
let avg = diffs.reduce((c,p) => c + p, 0) / diffs.length;
log(name + ": avg " + avg.toFixed(1));
}
function timeAM(id) {
Cu.import("resource://gre/modules/AddonManager.jsm");
let diffs = [];
var run = function(x) {
x = x || 0;
let start = Date.now();
AddonManager.getAddonByID(id, function(addon) {
let d = Date.now() - start;
diffs.push(d);
if (++x == 10) {
print("AM", diffs);
return;
}
run(x);
});
};
run();
}
function timeXHRXML() {
Cu.import("resource://gre/modules/AddonManager.jsm");
let diffs = [];
let run = function(x) {
x = x || 0;
let start = Date.now();
let r = new XMLHttpRequest();
r.overrideMimeType("text/xml");
r.open("GET", installRDF);
r.onloadend = function() {
let d = Date.now() - start;
diffs.push(d);
if (++x == 10) {
print("XX", diffs);
return;
}
run(x);
};
r.send();
};
run();
}
function startup(data) {
Cu.reportError("in");
//timeAM(data.id);
timeXHRXML(data.id);
}