[英]Firefox Restartless Addon: What information are available to the addon from AddonManager?
某些信息將傳遞給無重啟附件
function startup(data, reason) { }
data = {
id: "***********",
version: "1.0",
installPath: XPCWrappedNative_NoHelper, // nsIFile
resourceURI: XPCWrappedNative_NoHelper, // nsIURI
oldVersion: "1.0"
};
以上是唯一可用的數據嗎? 是否可以在不訪問AddonManager的情況下獲取Addon 名稱 ?
我對AddonManager.jsm的經驗證明,它笨重且緩慢。[1]
在上述情況下是唯一可用的數據,什么是獲得nsIURI在無需重啟插件的install.rdf(與XHR訪問)的最好方法?
在疊加插件中,我添加了一個指向install.rdf的resource
鏈接。 但是, resource
在無重啟插件中不可用,因此不希望設置以下內容
content addon ./
[1] 更新:澄清/更正:
定時的XHR提取不包括XML解析和數據提取。 因此,整個操作(XHR,回調,responseXML,抓取數據)將花費更長的時間。
以上是唯一可用的數據嗎?
是的,顯然。 文檔 ,順便說一句。
是否可以在不訪問AddonManager的情況下獲取Addon名稱?
不。(嗯,您談論自己解析install.rdf
的可能性,但是恕我直言,這是一個糟糕的方法AddonManager
是受支持和推薦的方式;例如,考慮AddonManager
情況下的元數據,例如包括元數據在內)。 。該名稱可能已經從在線來源刷新了)。
我對AddonManager.jsm的經驗證明它笨重且緩慢。 例如,使用XHR異步解析install.rdf大約需要1毫秒,而通過AddonManager.jsm獲得相同的數據則需要160-170毫秒。 慢了160-170倍。
老實說,我懷疑你的數字。 1ms
XHR ?! 即使XHR設置花費的時間更長,即使XPI(或flat install.rdf
)已經在內部緩存或至少在OS磁盤緩存中,I / O也會花費更長的時間,即使您沒有解析它XML和Regexp作為文本內容中所需的內容。
另外,請注意,在調用您的startup()
方法時, AddonManager
不一定會初始化元數據數據庫。 此時調用任何AddonManager
查詢方法將強制初始化一次 ,這意味着第一次調用可能會有點慢。
通常,在實際需要之前,尤其是在啟動過程中,您不應該請求任何數據(例如,加載項名稱)。
如果上面是唯一可用的數據,那么在無重啟插件(將通過XHR訪問)中獲取install.rdf的nsIURI的最佳方法是什么?
使用__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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.