@@ -215,7 +215,7 @@ var BootstrapLoader = class extends ExtensionCommon.ExtensionAPI {
215215 // returns the outer browser, not the nested browser of the add-on manager
216216 // events must be attached to the outer browser
217217 getAddonManagerFromTab ( tab ) {
218- if ( tab . browser ) {
218+ if ( tab . browser && tab . mode . name == "contentTab" ) {
219219 let win = tab . browser . contentWindow ;
220220 if ( win && win . location . href == "about:addons" ) {
221221 return win ;
@@ -226,9 +226,28 @@ var BootstrapLoader = class extends ExtensionCommon.ExtensionAPI {
226226 getAddonManagerFromWindow ( window ) {
227227 let tabMail = this . getTabMail ( window ) ;
228228 for ( let tab of tabMail . tabInfo ) {
229- let win = this . getAddonManagerFromTab ( tab )
230- if ( win ) {
231- return win ;
229+ let managerWindow = this . getAddonManagerFromTab ( tab ) ;
230+ if ( managerWindow ) {
231+ return managerWindow ;
232+ }
233+ }
234+ }
235+
236+ async getAddonManagerFromWindowWaitForLoad ( window ) {
237+ let { setTimeout } = Services . wm . getMostRecentWindow ( "mail:3pane" ) ;
238+
239+ let tabMail = this . getTabMail ( window ) ;
240+ for ( let tab of tabMail . tabInfo ) {
241+ if ( tab . browser && tab . mode . name == "contentTab" ) {
242+ // Instead of registering a load observer, wait until its loaded. Not nice,
243+ // but gets around a lot of edge cases.
244+ while ( ! tab . pageLoaded ) {
245+ await new Promise ( r => setTimeout ( r , 150 ) ) ;
246+ }
247+ let managerWindow = this . getAddonManagerFromTab ( tab ) ;
248+ if ( managerWindow ) {
249+ return managerWindow ;
250+ }
232251 }
233252 }
234253 }
@@ -288,44 +307,20 @@ var BootstrapLoader = class extends ExtensionCommon.ExtensionAPI {
288307
289308 // TabMonitor to detect opening of tabs, to setup the options button in the add-on manager.
290309 this . tabMonitor = {
291- onTabTitleChanged ( aTab ) { } ,
292- onTabClosing ( aTab ) { } ,
293- onTabPersist ( aTab ) { } ,
294- onTabRestored ( aTab ) { } ,
295- onTabSwitched ( aNewTab , aOldTab ) {
296- //self.setupAddonManager(self.getAddonManagerFromTab(aNewTab));
297- } ,
298- async onTabOpened ( aTab ) {
299- if ( aTab . browser ) {
300- if ( ! aTab . pageLoaded ) {
301- // await a location change if browser is not loaded yet
302- await new Promise ( resolve => {
303- let reporterListener = {
304- QueryInterface : ChromeUtils . generateQI ( [
305- "nsIWebProgressListener" ,
306- "nsISupportsWeakReference" ,
307- ] ) ,
308- onStateChange ( ) { } ,
309- onProgressChange ( ) { } ,
310- onLocationChange (
311- /* in nsIWebProgress*/ aWebProgress ,
312- /* in nsIRequest*/ aRequest ,
313- /* in nsIURI*/ aLocation
314- ) {
315- aTab . browser . removeProgressListener ( reporterListener ) ;
316- resolve ( ) ;
317- } ,
318- onStatusChange ( ) { } ,
319- onSecurityChange ( ) { } ,
320- onContentBlockingEvent ( ) { }
321- }
322- aTab . browser . addProgressListener ( reporterListener ) ;
323- } ) ;
310+ onTabTitleChanged ( tab ) { } ,
311+ onTabClosing ( tab ) { } ,
312+ onTabPersist ( tab ) { } ,
313+ onTabRestored ( tab ) { } ,
314+ onTabSwitched ( aNewTab , aOldTab ) { } ,
315+ async onTabOpened ( tab ) {
316+ if ( tab . browser && tab . mode . name == "contentTab" ) {
317+ let { setTimeout } = Services . wm . getMostRecentWindow ( "mail:3pane" ) ;
318+ // Instead of registering a load observer, wait until its loaded. Not nice,
319+ // but gets around a lot of edge cases.
320+ while ( ! tab . pageLoaded ) {
321+ await new Promise ( r => setTimeout ( r , 150 ) ) ;
324322 }
325- // Setup the ViewChange event listener in the outer browser of the add-on,
326- // but do not actually add the button/menu, as the inner browser is not yet ready,
327- // let the ViewChange event do it
328- self . setupAddonManager ( self . getAddonManagerFromTab ( aTab ) ) ;
323+ self . setupAddonManager ( self . getAddonManagerFromTab ( tab ) ) ;
329324 }
330325 } ,
331326 } ;
@@ -417,15 +412,13 @@ var BootstrapLoader = class extends ExtensionCommon.ExtensionAPI {
417412 let element_addonPrefs = window . document . getElementById ( self . menu_addonPrefs_id ) ;
418413 element_addonPrefs . addEventListener ( "popupshowing" , self ) ;
419414 } else {
420- // Setup the options button/menu in the add-on manager, if it is already open.
421- self . setupAddonManager (
422- self . getAddonManagerFromWindow ( window ) ,
423- true
424- ) ;
425415 // Add a tabmonitor, to be able to setup the options button/menu in the add-on manager.
426416 self . getTabMail ( window ) . registerTabMonitor ( self . tabMonitor ) ;
427417 window [ self . uniqueRandomID ] = { } ;
428418 window [ self . uniqueRandomID ] . hasTabMonitor = true ;
419+ // Setup the options button/menu in the add-on manager, if it is already open.
420+ let managerWindow = await self . getAddonManagerFromWindowWaitForLoad ( window ) ;
421+ self . setupAddonManager ( managerWindow , true ) ;
429422 }
430423 } ,
431424
0 commit comments