(FireFox拡張機能で)同時に定義されたJavaScriptオブジェクトと未定義のオブジェクト

firefox-addon javascript
(FireFox拡張機能で)同時に定義されたJavaScriptオブジェクトと未定義のオブジェクト

FireFox拡張機能でhttps://www.mozdev.org/bugs/show_bug.cgi?id=22480[bug]を追いかけています。 私はついに自分自身でそれを見ることができました(私は以前にレポートしか持っていませんでした)そして、私が見たものがどのように可能であるかを理解できません。

エラーコンソールの拡張機能からの1つのエラーメッセージは、「gBrowserが定義されていません」です。 オーバーレイはbrowser.xulとnavigator.xulの上にあるため、これだけでも十分驚くべきことであり、両方から gBrowser`が利用できると期待しています。 さらに悪いのは、実際に発生する場所です:http://gist.github.com/311567[nextplease.js]の101行目です。 つまり、関数 `isTopLevelDocument`内で、 onContentLoaded`からのみ呼び出され、 `onLoad`からのみ呼び出されます:

gBrowser.addEventListener(this.loadType, function (event) {
    nextplease.loadListener.onContentLoaded(event);
},
true);

したがって、「gBrowser」は「onLoad」で定義されていますが、「isTopLevelDocument」では何とか定義されていません。

拡張機能を実際に使用しようとしたときに、「nextpleaseが定義されていません」という別のエラーが表示されました。 興味深いのは、853行目と857行目で発生したことです。 つまり、_inside_関数

nextplease.getNextLink = function () {
    nextplease.getLink(window.content, nextplease.NextPhrasesMap, nextplease.NextImagesMap, nextplease.isNextRegExp, nextplease.NEXT_SEARCH_TYPE);
}

nextplease.getPrevLink = function () {
    nextplease.getLink(window.content, nextplease.PrevPhrasesMap, nextplease.PrevImagesMap, nextplease.isPrevRegExp, nextplease.PREV_SEARCH_TYPE);
}

したがって、「nextplease」はこれらの関数を呼び出すのに十分なほど定義されていますが、それらの内部では定義されていません。

最後に、Execute JSで `typeof(nextplease)`を実行すると、「オブジェクト」が返されます。 「gBrowser」でも同じです。

これはどのように起こりますか? 何か案は?

  16  2


ベストアンサー

2番目の場合:

nextplease.getNextLink = function () {
    nextplease.getLink(window.content, nextplease.NextPhrasesMap, nextplease.NextImagesMap, nextplease.isNextRegExp, nextplease.NEXT_SEARCH_TYPE);
}

nextplease.getPrevLink = function () {
    nextplease.getLink(window.content, nextplease.PrevPhrasesMap, nextplease.PrevImagesMap, nextplease.isPrevRegExp, nextplease.PREV_SEARCH_TYPE);
}

代わりにこれを試してみます:

nextplease.getNextLink = function () {
    this.getLink(window.content, this.NextPhrasesMap, this.NextImagesMap, this.isNextRegExp, this.NEXT_SEARCH_TYPE);
}

nextplease.getPrevLink = function () {
    this.getLink(window.content, this.PrevPhrasesMap, this.PrevImagesMap, this.isPrevRegExp, this.PREV_SEARCH_TYPE);
}

2


何が起こっているのかわかりません(コードがどのコンテキストで実行されているので、なぜgbrowserと他のグローバル変数が表示されないのですか)が、未定義のgbrowserの簡単な回避策は、メインウィンドウへの参照を取得し、そこ:

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                     .getInterface(Components.interfaces.nsIWebNavigation)
                     .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                     .rootTreeItem
                     .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                     .getInterface(Components.interfaces.nsIDOMWindow);

mainWindow.gbrowser.addEventListener( ... )

グローバル変数に依存しないため、これはコードが実行されているコンテキストとは無関係に機能するはずです。

1


タイトルとURLをコピーしました