Firefox addon 如何等待所有区域在bootstrap.js::startup()中注册到CustomizeLeUI?

Firefox addon 如何等待所有区域在bootstrap.js::startup()中注册到CustomizeLeUI?,firefox-addon,firefox-addon-restartless,Firefox Addon,Firefox Addon Restartless,我正在构建一个无重启插件,它是一个customizeleUI小部件 当我在startup()期间调用customizeleUI.createWidget()时,我希望defaultArea属性是首选区域的选择之一。目前,我正在通过以下方式实现这一目标: // ordered from most to least preferred let preferredAreas = [ 'ctraddon_addon-bar', 'ctraddon_extra-bar', Customizab

我正在构建一个无重启插件,它是一个
customizeleUI
小部件

当我在
startup()
期间调用
customizeleUI.createWidget()
时,我希望
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 */
} );

您需要做的是为
onareNodeRegistered
添加一个侦听器。在回调中,然后创建小部件

onAreaNodeRegistered和OnAreanodeUnregistered不在mdn上,因此定义如下:

因此,对于实现,请执行以下操作:

首先检查您想要的区域是否存在。如果没有,则添加一个侦听器。在监听器中执行创建小部件:

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);
}

嗨,诺伊蒂达特,谢谢你的回答。我明天将对此进行调查。感谢您的详细说明。我明白你想做什么了。问题是:我不想无限期地等待某个区域。我只想看看Firefox启动时(Firefox完全加载后)是否有特定区域可用,如果没有,只需将
defaultArea
be
null
(这基本上意味着将其放在自定义调色板中)。此外:这可能只是一种形式,因为在安装过程中,所有区域都已存在。我只想
customizeleUI.createWidget()
在后续的
startup()
调用中有一致的输入。也许我应该把初始区域保存在某个地方。哦,我明白了。所以实际上
customizeleUI.areas.indexOf(aTargetAreaId)
应该可以正常工作吗?但问题是在启动时,您可能应该等待第一个窗口完成加载,对吗?因此,就像启动插件一样,如果其中任何一个已完全加载,则迭代所有
nsIDOMWindow
s检查,如果它们已加载,则使用
.areas.indexOf
是安全的。如果尚未加载任何窗口,则使用
windowListener
来侦听第一次加载的
nsIDOMWindow
,然后在加载时删除窗口侦听器并运行自定义代码。你觉得怎么样?很酷,谢谢。不过需要澄清的是:所以我们要等待窗口加载的原因是允许任何ADON执行其
注册区域
,而不是因为我们正在等待
自定义区域
填充已注册的区域。因为当CustomizeLeUI模块加载时,它会加载所有以前注册的区域,所以如果CustomizeLeUI.areas是可访问的,那么这意味着无论有什么都已注册,新的区域进入的唯一方式是加载项或其他内容进行新注册。这是正确的:在每次调用时填充。但是,如果注册了我感兴趣的领域的附加组件比我自己的附加组件加载得晚,它将无法通过
customizeleUI.areas
获得。这就是为什么我需要等待窗口加载的原因。
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);
}