あらゆる種類のチュートリアル、MDN エントリ、およびSO 投稿を数日間読んだ結果、明らかな何かが欠けているのではないかと疑うようになりましたが、XPCOM の経験が浅すぎてそれを見つけることができませんでした。カスタム コンポーネント (components/fooLogin.js) のどこかにエラーがあると約 80% 確信しています。
問題:アドオンが初期化されるとき (chrome/content/foologin.js から loadData() を呼び出すとき)、次のようなエラーが表示されます。
TypeError: Components.classes['@foo.com/foologinautocomplete;1'] は定義されていません
クラスが登録される前にコンポーネントを作成しようとしている可能性がありますか? それを登録するために他に何かする必要がありますか?ヒントをいただければ幸いです。
関連するコード: (必要に応じて、追加のコードを提供してください)
コンポーネント/fooLogin.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]);
クロム/コンテンツ/foologin.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