繁体   English   中英

Firefox Restartless Addon:AddonManager可以为插件提供哪些信息?

[英]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.rdfresource链接。 但是, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM