2014-09-08 1 views
1

Я создаю перезагружаемое дополнение, которое представляет собой виджет 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'), но:

  1. при запуске приложения mostRecentWindow будут null
  2. на надстройке на установку 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(); 
} 

ответ

1

То, что вы должны сделать, это добавить прослушиватель для onAreaNodeRegistered. В обратном вызове создайте свой виджет.

См MDN :: CustomizableUI.jsm - addListener()

onAreaNodeRegistered и onAreaNodeUnregsitered не на MDN так вот definitons: http://mxr.mozilla.org/mozilla-release/source/browser/components/customizableui/src/CustomizableUI.jsm#2704

2704 * - onAreaNodeRegistered(aArea, aContainer) 
2705 *  Fired after an area node is first built when it is registered. This 
2706 *  is often when the window has opened, but in the case of add-ons, 
2707 *  could fire when the node has just been registered with CustomizableUI 
2708 *  after an add-on update or disable/enable sequence. 
2709 * - onAreaNodeUnregistered(aArea, aContainer, aReason) 
2710 *  Fired when an area node is explicitly unregistered by an API caller, 
2711 *  or by a window closing. The aReason parameter indicates which of 
2712 *  these is the case. 
2713 */ 

Так что для этого дела ввода:

Сначала проверьте, если область, которую вы хотите существует. Если он не добавляет слушателя. А в слушателе создайте виджет создания:

var targetAreaId = 'blah'; //the id of area you want test for, meaning the area you want to add your widget too, targetAreaId can be CustomizableUI.AREA_NAVBAR, basically its the id (first arg) argument of CustomizableUI.registerArea('blahIdHere'.. 

function createMyWidget() { 
    CustomizableUI.addWidget({ 
    id: "edit-controls", 
    type: "custom", 
    defaultArea: targetAreaId, 
    onBuild: function(aDocument) {} 
    //........ blah blah balh 
    }) 
} 


if (CustomizableUI.areas.indexOf(targetAreaId) > -1) { // customizableUI.areas is an array for example for me it is:`Array [ "PanelUI-contents", "nav-bar", "toolbar-menubar", "TabsToolbar", "PersonalToolbar", "addon-bar", "thePuzzlePiece-addon-bar" ]` 
    createMyWidget(); 
} else {  
    var myCustUiListener = { 
     'onAreaNodeRegistered': function(aArea, aContainer) { 
     //create your widget here 
     if (aArea.id == targetAreaId) { //im not sure of the properties on aArea do a console.log('aArea properties:', aArea) to see what all properties are there 
     createMyWidget(); 
     } 
     } 
    }; 
    CustomizableUI.addListener(myCustUiListener); 
} 
+0

Привет, Noitidart, спасибо за ваш ответ. Я собираюсь изучить это завтра. – Codifier

+1

Спасибо за разработку. Я вижу, что вы пытаетесь сделать. Дело в том, что я не хочу ждать бесконечно для определенной области. Я просто хочу узнать, доступны ли определенные области при запуске Firefox (после того, как Firefox полностью загружен), а если нет, просто 'defaultArea' будет' null' (что в основном означает поместить его в палитру настройки). Кроме того: это, вероятно, просто формальность, так как во время установки все области уже присутствовали. Я просто хочу, чтобы 'CustomizableUI.createWidget()' имел последовательный ввод при последующих вызовах 'startup()'. Возможно, я должен где-то сохранить исходную область. – Codifier

+0

Итак, я думаю, мой вопрос в основном сводится к следующему: могу ли я как-то заметить, что Firefox полностью закончил загрузку при запуске? (Если это действительно имеет смысл.) – Codifier