ウィジェットである再起動なしのアドオンを構築していCustomizableUI
ます。
CustomizableUI.createWidget()
中に電話するとき、その物件を優先エリアの選択の 1 つにしてstartup()
ほしいのですが。defaultArea
現在、私は次のようなものでこれを達成しています:
// ordered from most to least preferred
let preferredAreas = [
'ctraddon_addon-bar',
'ctraddon_extra-bar',
CustomizableUI.AREA_BOOKMARKS,
CustomizableUI.AREA_NAVBAR,
// null basically translates to 'PanelUI-contents'
// but this makes it easy to test later on
null
];
let registeredAreas = CustomizableUI.areas;
let preferredArea;
for( let i = 0, l = preferredAreas.length; i < l; i++ ) {
preferredArea = preferredAreas[ i ];
if( registeredAreas.indexOf( preferredArea ) > -1 ) {
break;
}
}
if( !preferredArea ) { // i.e. null
/* on first run: notify user that we were unable to find a preferred area */
}
CustomizableUI.createWidget( {
id: 'myAddon',
type: 'custom',
defaultArea: preferredArea,
/* etc */
} );
つまり、優先エリアが存在するかどうかを確認しています。startup()
インストール直後の では、これはほとんど期待どおりに機能します。これは、基本的にすべての対象領域 (Classic Theme Restorer などの他の拡張機能から) が既に登録されているためです。ただし、アドオンが既にインストールされていて、Firefox が起動したときCustomizableUI.areas
は、関心のあるすべての領域がまだ満たされていません (おそらく、関心のある領域を登録する拡張機能よりも先に拡張機能が読み込まれるためです)。
を利用してみましたがmostRecentWindow.addEventListener( 'load', /* etc */ )
、mostRecentWindow
は の戻り値ですがnsIWindowMediator.getMostRecentWindow( 'navigator:browser' )
、
- アプリの起動時
mostRecentWindow
にnull
- アドオンのインストール時にイベントが発生しなく
mostRecentWindow
なりましたload
CustomizableUI.createWidget()
だから、私の質問は次のとおりです。関連するすべてのコードがロードされるまで呼び出しを待つ簡単で効果的な方法は何ですか?
私がやったことは次のとおりです(これはNoitidartが提案したものでもあります)。これはうまくいくようです:
let createWidget = function() {
/* all the preferredArea and CustomizableUI.createWidget() stuff from above */
}
let mostRecentBrowserWindow = windowMediator.getMostRecentWindow( 'navigator:browser' );
if( null == mostRecentBrowserWindow ) {
let windowListenerWidget = {
onOpenWindow: function( wrappedWindow ) {
windowMediator.removeListener( windowListenerWidget );
let domWindow = wrappedWindow.QueryInterface( Ci.nsIInterfaceRequestor )
.getInterface( Ci.nsIDOMWindow );
domWindow.addEventListener( 'load', function onWindowLoad( event ) {
this.removeEventListener( 'load', onWindowLoad );
createWidget();
} );
}
}
windowMediator.addListener( windowListenerWidget );
}
else {
createWidget();
}