Autocomplete 使用javascript XPCOM组件在FireFox插件中创建自定义自动完成框

Autocomplete 使用javascript XPCOM组件在FireFox插件中创建自定义自动完成框,autocomplete,firefox-addon,custom-component,xpcom,Autocomplete,Firefox Addon,Custom Component,Xpcom,我花了几天时间阅读了各种各样的、和,我开始怀疑我遗漏了一些明显的东西,但我对XPCOM太缺乏经验,无法发现它。我大约80%确定我的自定义组件(components/dougogin.js)中有错误 问题:当加载项初始化时(当我从chrome/content/dougogin.js调用loadData()时),我会收到一个错误消息: TypeError:Components.classes['@foo.com/fouloginautomplete;1']未定义 我是否正在尝试在类注册之前创建组件?

我花了几天时间阅读了各种各样的、和,我开始怀疑我遗漏了一些明显的东西,但我对XPCOM太缺乏经验,无法发现它。我大约80%确定我的自定义组件(components/dougogin.js)中有错误

问题:当加载项初始化时(当我从chrome/content/dougogin.js调用loadData()时),我会收到一个错误消息:

TypeError:Components.classes['@foo.com/fouloginautomplete;1']未定义

我是否正在尝试在类注册之前创建组件?我还需要做些什么来注册它吗?任何提示都将不胜感激

相关代码:(如有需要,乐意提供任何附加代码)

components/dougogin.js:

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
function fooLoginAutoComplete(){
        this.wrappedJSObject = this;
}
fooLoginAutoComplete.prototype = {
        classID: Components.ID("loginac@foo.com"),
        contractID: "@foo.com/foologinautocomplete;1",
        classDescription: "Auto complete for foo",
        QueryInterface: XPCOMUtils.generateQI([]),
        complete: function(str){  // Autocomplete functionality will in this function
                return null;
        }
};
var NSGetFactory = XPCOMUtils.generateNSGetFactory([fooLoginAutoComplete]);
chrome/content/dougogin.js:

let fooLogin = {
    dataLoaded : false,
    searchFilter = null,
    ...
    loadData : function(){
        ...
        try{
            alert(1);  // This alert fires
            this.searchFilter = Components.classes['@foo.com/foologinautocomplete;1']
                .getService().wrappedJSObject;
            alert(2);  // I get the error before this alert
        }catch(e){alert(e);}
        this.dataLoaded = true;
    }
}
window.addEventListener("load", function(){
    if(!fooLogin.dataLoaded) fooLogin.loadData();
}
chrome.manifest:

content foologin         chrome/content/
content foologin         chrome/content/ contentaccessible=yes
skin    foologin classic chrome/skin/
locale  foologin en-US   chrome/locale/en-US/

component loginac@foo.com                 components/fooLogin.js
contract  @foo.com/foologinautocomplete;1 loginac@foo.com

overlay chrome://browser/content/browser.xul chrome://foologin/content/foologin.xul

在chrome.manifest中,您有以下内容:

组成部分loginac@foo.com组件/dougogin.js contract@foo.com/fouloginautomplete;1.loginac@foo.com

在dougogin.js中,您有:

classID:Components.ID(“loginac@foo.com",

loginac@foo.com不是组件的有效类ID

它们必须采用以下形式:

{00000000-0000-0000-0000-000000000000}


只有附加组件才能具有foo@bar.com格式。

现场直播!那正是我的问题。文件在这一点上有点不清楚。他们应该明确地说,只有附加组件可以使用松散格式(或者他们可以使用,但我错过了)。无论如何,谢谢你的提示!对于其他可能需要它的人,这里有一个方便的。干杯