2
2
* This file is provided by the addon-developer-support repository at
3
3
* https://github.com/thundernest/addon-developer-support
4
4
*
5
- * Version: 1.56
5
+ * Version: 1.57
6
6
*
7
7
* Author: John Bieling (john@thunderbird.net)
8
8
*
@@ -200,7 +200,7 @@ var WindowListener = class extends ExtensionCommon.ExtensionAPI {
200
200
// returns the outer browser, not the nested browser of the add-on manager
201
201
// events must be attached to the outer browser
202
202
getAddonManagerFromTab ( tab ) {
203
- if ( tab . browser ) {
203
+ if ( tab . browser && tab . mode . name == "contentTab" ) {
204
204
let win = tab . browser . contentWindow ;
205
205
if ( win && win . location . href == "about:addons" ) {
206
206
return win ;
@@ -211,9 +211,28 @@ var WindowListener = class extends ExtensionCommon.ExtensionAPI {
211
211
getAddonManagerFromWindow ( window ) {
212
212
let tabMail = this . getTabMail ( window ) ;
213
213
for ( let tab of tabMail . tabInfo ) {
214
- let win = this . getAddonManagerFromTab ( tab ) ;
215
- if ( win ) {
216
- return win ;
214
+ let managerWindow = this . getAddonManagerFromTab ( tab ) ;
215
+ if ( managerWindow ) {
216
+ return managerWindow ;
217
+ }
218
+ }
219
+ }
220
+
221
+ async getAddonManagerFromWindowWaitForLoad ( window ) {
222
+ let { setTimeout } = Services . wm . getMostRecentWindow ( "mail:3pane" ) ;
223
+
224
+ let tabMail = this . getTabMail ( window ) ;
225
+ for ( let tab of tabMail . tabInfo ) {
226
+ if ( tab . browser && tab . mode . name == "contentTab" ) {
227
+ // Instead of registering a load observer, wait until its loaded. Not nice,
228
+ // but gets aroud a lot of edge cases.
229
+ while ( ! tab . pageLoaded ) {
230
+ await new Promise ( r => setTimeout ( r , 150 ) ) ;
231
+ }
232
+ let managerWindow = this . getAddonManagerFromTab ( tab ) ;
233
+ if ( managerWindow ) {
234
+ return managerWindow ;
235
+ }
217
236
}
218
237
}
219
238
}
@@ -329,41 +348,20 @@ var WindowListener = class extends ExtensionCommon.ExtensionAPI {
329
348
330
349
// TabMonitor to detect opening of tabs, to setup the options button in the add-on manager.
331
350
this . tabMonitor = {
332
- onTabTitleChanged ( aTab ) { } ,
333
- onTabClosing ( aTab ) { } ,
334
- onTabPersist ( aTab ) { } ,
335
- onTabRestored ( aTab ) { } ,
336
- onTabSwitched ( aNewTab , aOldTab ) {
337
- //self.setupAddonManager(self.getAddonManagerFromTab(aNewTab));
338
- } ,
339
- async onTabOpened ( aTab ) {
340
- if ( aTab . browser ) {
341
- if ( ! aTab . pageLoaded ) {
342
- // await a location change if browser is not loaded yet
343
- await new Promise ( ( resolve ) => {
344
- let reporterListener = {
345
- QueryInterface : ChromeUtils . generateQI ( [
346
- "nsIWebProgressListener" ,
347
- "nsISupportsWeakReference" ,
348
- ] ) ,
349
- onStateChange ( ) { } ,
350
- onProgressChange ( ) { } ,
351
- onLocationChange (
352
- /* in nsIWebProgress*/ aWebProgress ,
353
- /* in nsIRequest*/ aRequest ,
354
- /* in nsIURI*/ aLocation
355
- ) {
356
- aTab . browser . removeProgressListener ( reporterListener ) ;
357
- resolve ( ) ;
358
- } ,
359
- onStatusChange ( ) { } ,
360
- onSecurityChange ( ) { } ,
361
- onContentBlockingEvent ( ) { } ,
362
- } ;
363
- aTab . browser . addProgressListener ( reporterListener ) ;
364
- } ) ;
351
+ onTabTitleChanged ( tab ) { } ,
352
+ onTabClosing ( tab ) { } ,
353
+ onTabPersist ( tab ) { } ,
354
+ onTabRestored ( tab ) { } ,
355
+ onTabSwitched ( aNewTab , aOldTab ) { } ,
356
+ async onTabOpened ( tab ) {
357
+ if ( tab . browser && tab . mode . name == "contentTab" ) {
358
+ let { setTimeout } = Services . wm . getMostRecentWindow ( "mail:3pane" ) ;
359
+ // Instead of registering a load observer, wait until its loaded. Not nice,
360
+ // but gets aroud a lot of edge cases.
361
+ while ( ! tab . pageLoaded ) {
362
+ await new Promise ( r => setTimeout ( r , 150 ) ) ;
365
363
}
366
- self . setupAddonManager ( self . getAddonManagerFromTab ( aTab ) ) ;
364
+ self . setupAddonManager ( self . getAddonManagerFromTab ( tab ) ) ;
367
365
}
368
366
} ,
369
367
} ;
@@ -594,16 +592,14 @@ var WindowListener = class extends ExtensionCommon.ExtensionAPI {
594
592
self
595
593
) ;
596
594
} else {
597
- // Setup the options button/menu in the add-on manager, if it is already open.
598
- self . setupAddonManager (
599
- self . getAddonManagerFromWindow ( window ) ,
600
- true
601
- ) ;
602
595
// Add a tabmonitor, to be able to setup the options button/menu in the add-on manager.
603
596
self
604
597
. getTabMail ( window )
605
598
. registerTabMonitor ( self . tabMonitor ) ;
606
599
window [ self . uniqueRandomID ] . hasTabMonitor = true ;
600
+ // Setup the options button/menu in the add-on manager, if it is already open.
601
+ let managerWindow = await self . getAddonManagerFromWindowWaitForLoad ( window ) ;
602
+ self . setupAddonManager ( managerWindow , true ) ;
607
603
}
608
604
}
609
605
}
@@ -1183,4 +1179,4 @@ var WindowListener = class extends ExtensionCommon.ExtensionAPI {
1183
1179
this . chromeHandle = null ;
1184
1180
}
1185
1181
}
1186
- } ;
1182
+ } ;
0 commit comments