0

あらゆる種類のチュートリアル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
4

1 に答える 1

2

chrome.manifest には、次のものがあります。

コンポーネント loginac@foo.com components/fooLogin.js コントラクト @foo.com/foologinautocomplete;1 loginac@foo.com

そして fooLogin.js には次のものがあります。

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

loginac@foo.com は、コンポーネントの有効なクラス ID ではありません。

それらは次の形式である必要があります。

{00000000-0000-0000-0000-000000000000}

アドオンのみが foo@bar.com 形式を持つことができます。

于 2012-07-02T16:02:49.470 に答える