xi-conversations

Minimal clone of thunderbird conversations
git clone https://git.ce9e.org/xi-conversations.git

commit
d5994ab082ebef5505cd970d5be8a0673d7e466e
parent
f38c7813c05f42981580edf6ecca639a10e19cff
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2024-04-19 06:56
Merge remote-tracking branch 'origin/thunderbird-115'

Diffstat

M background.js 12 +++++++++++-
M content/js/message.js 3 +--
M experiment-api/api.js 64 ++++++++++++++++++++++++++++++++++---------------------------
M experiment-api/schema.json 9 ++++++---
M manifest.json 3 ++-

5 files changed, 56 insertions, 35 deletions


diff --git a/background.js b/background.js

@@ -1,3 +1,13 @@
    1     1 /* global browser */
    2     2 
    3    -1 browser.xi.patchOpenSelectedMessages();
   -1     3 browser.tabs.onCreated.addListener(tab => {
   -1     4 	if (tab.mailTab) {
   -1     5 		browser.xi.patchTab(tab.id);
   -1     6 	}
   -1     7 });
   -1     8 
   -1     9 browser.tabs.query({mailTab: true}).then(tabs => {
   -1    10 	tabs.forEach(tab => {
   -1    11 		browser.xi.patchTab(tab.id);
   -1    12 	});
   -1    13 });

diff --git a/content/js/message.js b/content/js/message.js

@@ -149,11 +149,10 @@ export default function(msg, expanded) {
  149   149 
  150   150 	// body
  151   151 	var footer = e.querySelector('.message__footer');
  152    -1 	var details = e.querySelector('.message__details');
  153   152 	var bodyLoaded = false;
  154   153 	var lazyLoadBody = function() {
  155   154 		if (!bodyLoaded && e.classList.contains('is-expanded')) {
  156    -1 			details.insertBefore(createBody(msg), footer);
   -1   155 			footer.before(createBody(msg));
  157   156 			bodyLoaded = true;
  158   157 		}
  159   158 	};

diff --git a/experiment-api/api.js b/experiment-api/api.js

@@ -2,8 +2,10 @@
    2     2 
    3     3 var {ExtensionCommon} = ChromeUtils.import('resource://gre/modules/ExtensionCommon.jsm');
    4     4 var {Gloda} = ChromeUtils.import('resource:///modules/gloda/GlodaPublic.jsm');
   -1     5 var {GlodaConstants} = ChromeUtils.import('resource:///modules/gloda/GlodaConstants.jsm');
    5     6 var {Services} = ChromeUtils.import('resource://gre/modules/Services.jsm');
    6     7 var {MsgHdrToMimeMessage} = ChromeUtils.import('resource:///modules/gloda/MimeMessage.jsm');
   -1     8 var {MailServices} = ChromeUtils.import('resource:///modules/MailServices.jsm');
    7     9 
    8    10 var unique = function(l, keyFn) {
    9    11 	var keys = [];
@@ -16,6 +18,16 @@ var unique = function(l, keyFn) {
   16    18 	});
   17    19 };
   18    20 
   -1    21 var waitForLoad = function(win) {
   -1    22 	return new Promise(resolve => {
   -1    23 		if (win.document.readyState === 'complete') {
   -1    24 			resolve();
   -1    25 		} else {
   -1    26 			win.addEventListener('load', resolve);
   -1    27 		}
   -1    28 	});
   -1    29 };
   -1    30 
   19    31 var getConversation = function(ids) {
   20    32 	return new Promise((resolve, reject) => {
   21    33 		var conversationListener = {
@@ -44,7 +56,7 @@ var getConversation = function(ids) {
   44    56 			},
   45    57 		};
   46    58 
   47    -1 		var query = Gloda.newQuery(Gloda.NOUN_MESSAGE);
   -1    59 		var query = Gloda.newQuery(GlodaConstants.NOUN_MESSAGE);
   48    60 		query.headerMessageID.apply(query, ids);
   49    61 		query.getCollection(listener, null);
   50    62 	});
@@ -81,34 +93,30 @@ var xi = class extends ExtensionCommon.ExtensionAPI {
   81    93 					var win = Services.wm.getMostRecentWindow('mail:3pane');
   82    94 					var msgHdr = context.extension.messageManager.get(id);
   83    95 					var uri = msgHdr.folder.getUriForMsg(msgHdr);
   84    -1 					win.ViewPageSource([uri]);
   -1    96 					var url = MailServices.mailSession.ConvertMsgURIToMsgURL(uri, null);
   -1    97 					win.openDialog(
   -1    98 						'chrome://messenger/content/viewSource.xhtml',
   -1    99 						'_blank',
   -1   100 						'all,dialog=no',
   -1   101 						{URL: url},
   -1   102 					);
   85   103 				},
   86    -1 				// cannot be replaced by messageDisplay.OnMessagesDisplayed because
   87    -1 				// we need to replace the original handler
   88    -1 				patchOpenSelectedMessages() {
   89    -1 					var observer = (win, topic) => {
   90    -1 						if (topic === 'domwindowopened' && win.location.href === 'chrome://messenger/content/messenger.xhtml') {
   91    -1 							win.MsgOpenSelectedMessages = () => {
   92    -1 								var msgs = win.gFolderDisplay.selectedMessages;
   93    -1 								var ids = msgs.map(msgHdr => msgHdr.messageId);
   94    -1 								var url = '/content/main.html?ids=' + encodeURIComponent(ids);
   95    -1 								var tab = win.openTab('contentTab', {
   96    -1 									url: context.uri.resolve(url),
   97    -1 									linkHandler: 'single-page',
   98    -1 									principal: context.extension.principal,
   99    -1 								});
  100    -1 								tab.toolbar.hidden = true;
  101    -1 							};
  102    -1 						}
  103    -1 						win.addEventListener('load', () => observer(win, topic));
  104    -1 					};
  105    -1 
  106    -1 					Services.ww.registerNotification(observer);
  107    -1 
  108    -1 					var e = Services.ww.getWindowEnumerator();
  109    -1 					while (e.hasMoreElements()) {
  110    -1 						observer(e.getNext(), 'domwindowopened');
  111    -1 					}
   -1   104 				patchTab(id) {
   -1   105 					var tabObject = context.extension.tabManager.get(id);
   -1   106 					var win = tabObject.nativeTab.chromeBrowser.contentWindow;
   -1   107 					return waitForLoad(win).then(() => {
   -1   108 						win.threadPane._onItemActivate = () => {
   -1   109 							var msgs = win.gDBView.getSelectedMsgHdrs();
   -1   110 							var ids = msgs.map(msgHdr => msgHdr.messageId);
   -1   111 							var url = '/content/main.html?ids=' + encodeURIComponent(ids);
   -1   112 							var tab = win.openTab('contentTab', {
   -1   113 								url: context.uri.resolve(url),
   -1   114 								linkHandler: 'single-page',
   -1   115 								principal: context.extension.principal,
   -1   116 							});
   -1   117 							tab.toolbar.hidden = true;
   -1   118 						};
   -1   119 					});
  112   120 				},
  113   121 			},
  114   122 		};

diff --git a/experiment-api/schema.json b/experiment-api/schema.json

@@ -28,9 +28,12 @@
   28    28 			"type": "integer"
   29    29 		}]
   30    30 	}, {
   31    -1 		"name": "patchOpenSelectedMessages",
   -1    31 		"name": "patchTab",
   32    32 		"type": "function",
   33    -1 		"async": false,
   34    -1 		"parameters": []
   -1    33 		"async": true,
   -1    34 		"parameters": [{
   -1    35 			"name": "id",
   -1    36 			"type": "integer"
   -1    37 		}]
   35    38 	}]
   36    39 }]

diff --git a/manifest.json b/manifest.json

@@ -17,7 +17,8 @@
   17    17   "permissions": [
   18    18     "accountsRead",
   19    19     "messagesRead",
   20    -1     "messagesMove"
   -1    20     "messagesMove",
   -1    21     "tabs"
   21    22   ],
   22    23   "experiment_apis": {
   23    24     "xi": {