Skip to content

Commit 8e65a7c

Browse files
committed
! TB104 support
! smart folders now remember last viewed message (unless "forced" is enabled) ! no messages selected on startup ! settings UI not initialized if settings tab was opened on startup
1 parent de9c97f commit 8e65a7c

5 files changed

Lines changed: 181 additions & 135 deletions

File tree

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
*.xpi
22
chrome.manifest
33
install.rdf
4-
.main
4+
.main
5+
.vscode/Auto Select Latest Message.code-workspace
6+
.vscode/settings.json

src/api/BootstrapLoader/implementation.js

Lines changed: 39 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)