Я создаю перезагружаемое дополнение, которое представляет собой виджет CustomizableUI
.Как подождать, пока все области будут зарегистрированы с помощью CustomizableUI в bootstrap.js :: startup()?
Когда я звоню CustomizableUI.createWidget()
во время 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();
}
Привет, Noitidart, спасибо за ваш ответ. Я собираюсь изучить это завтра. – Codifier
Спасибо за разработку. Я вижу, что вы пытаетесь сделать. Дело в том, что я не хочу ждать бесконечно для определенной области. Я просто хочу узнать, доступны ли определенные области при запуске Firefox (после того, как Firefox полностью загружен), а если нет, просто 'defaultArea' будет' null' (что в основном означает поместить его в палитру настройки). Кроме того: это, вероятно, просто формальность, так как во время установки все области уже присутствовали. Я просто хочу, чтобы 'CustomizableUI.createWidget()' имел последовательный ввод при последующих вызовах 'startup()'. Возможно, я должен где-то сохранить исходную область. – Codifier
Итак, я думаю, мой вопрос в основном сводится к следующему: могу ли я как-то заметить, что Firefox полностью закончил загрузку при запуске? (Если это действительно имеет смысл.) – Codifier