Autocomplete 使用javascript XPCOM组件在FireFox插件中创建自定义自动完成框
我花了几天时间阅读了各种各样的、和,我开始怀疑我遗漏了一些明显的东西,但我对XPCOM太缺乏经验,无法发现它。我大约80%确定我的自定义组件(components/dougogin.js)中有错误 问题:当加载项初始化时(当我从chrome/content/dougogin.js调用loadData()时),我会收到一个错误消息: TypeError:Components.classes['@foo.com/fouloginautomplete;1']未定义 我是否正在尝试在类注册之前创建组件?我还需要做些什么来注册它吗?任何提示都将不胜感激 相关代码:(如有需要,乐意提供任何附加代码) components/dougogin.js: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']未定义 我是否正在尝试在类注册之前创建组件?
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格式。现场直播!那正是我的问题。文件在这一点上有点不清楚。他们应该明确地说,只有附加组件可以使用松散格式(或者他们可以使用,但我错过了)。无论如何,谢谢你的提示!对于其他可能需要它的人,这里有一个方便的。干杯