/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ let account, rootFolder, subFolders; let tabmail = document.getElementById("tabmail"); add_setup(async () => { account = createAccount(); rootFolder = account.incomingServer.rootFolder; rootFolder.createSubfolder("test1", null); rootFolder.createSubfolder("test2", null); subFolders = {}; for (let folder of rootFolder.subFolders) { subFolders[folder.name] = folder; } createMessages(subFolders.test1, 10); createMessages(subFolders.test2, 50); tabmail.currentTabInfo.folder = rootFolder; Services.prefs.setIntPref("extensions.webextensions.messagesPerPage", 10); registerCleanupFunction(() => { Services.prefs.clearUserPref("extensions.webextensions.messagesPerPage"); }); await new Promise(resolve => executeSoon(resolve)); }); add_task(async function test_MV3_event_pages() { let files = { "background.js": async () => { // Whenever the extension starts or wakes up, hasFired is set to false. In // case of a wake-up, the first fired event is the one that woke up the background. let hasFired = false; for (let eventName of [ "onDisplayedFolderChanged", "onSelectedMessagesChanged", ]) { browser.mailTabs[eventName].addListener((...args) => { // Only send the first event after background wake-up, this should be // the only one expected. if (!hasFired) { hasFired = true; browser.test.sendMessage(`${eventName} received`, args); } }); } browser.test.sendMessage("background started"); }, "utils.js": await getUtilsJS(), }; let extension = ExtensionTestUtils.loadExtension({ files, manifest: { manifest_version: 3, background: { scripts: ["utils.js", "background.js"] }, permissions: ["accountsRead", "messagesRead"], browser_specific_settings: { gecko: { id: "mailtabs@mochi.test" }, }, }, }); function checkPersistentListeners({ primed }) { // A persistent event is referenced by its moduleName as defined in // ext-mails.json, not by its actual namespace. const persistent_events = [ "mailTabs.onDisplayedFolderChanged", "mailTabs.onSelectedMessagesChanged", ]; for (let event of persistent_events) { let [moduleName, eventName] = event.split("."); assertPersistentListeners(extension, moduleName, eventName, { primed, }); } } await extension.startup(); await extension.awaitMessage("background started"); // The listeners should be persistent, but not primed. checkPersistentListeners({ primed: false }); await extension.terminateBackground({ disableResetIdleForTest: true }); // Verify the primed persistent listeners. checkPersistentListeners({ primed: true }); // Select a folder. { tabmail.currentTabInfo.folder = subFolders.test1; let displayInfo = await extension.awaitMessage( "onDisplayedFolderChanged received" ); Assert.deepEqual( [ { active: true, type: "mail", }, { name: "test1", path: "/test1" }, ], [ { active: displayInfo[0].active, type: displayInfo[0].type, }, { name: displayInfo[1].name, path: displayInfo[1].path }, ], "The primed onDisplayedFolderChanged event should return the correct values" ); await extension.awaitMessage("background started"); // The listeners should be persistent, but not primed. checkPersistentListeners({ primed: false }); await extension.terminateBackground({ disableResetIdleForTest: true }); // Verify the primed persistent listeners. checkPersistentListeners({ primed: true }); } // Select multiple messages. { let messages = [...subFolders.test1.messages].slice(0, 5); tabmail.currentAbout3Pane.threadTree.selectedIndices = messages.map(m => tabmail.currentAbout3Pane.gDBView.findIndexOfMsgHdr(m, false) ); let displayInfo = await extension.awaitMessage( "onSelectedMessagesChanged received" ); Assert.deepEqual( [ "Big Meeting Today", "Small Party Tomorrow", "Huge Shindig Yesterday", "Tiny Wedding In a Fortnight", "Red Document Needs Attention", ], displayInfo[1].messages.map(e => e.subject), "The primed onSelectedMessagesChanged event should return the correct values" ); Assert.deepEqual( { active: true, type: "mail", }, { active: displayInfo[0].active, type: displayInfo[0].type, }, "The primed onSelectedMessagesChanged event should return the correct values" ); await extension.awaitMessage("background started"); // The listeners should be persistent, but not primed. checkPersistentListeners({ primed: false }); } await extension.unload(); });