Revision control
Copy as Markdown
Other Tools
/* 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
/**
* Tests folders with special use flags prevent removal of those flags, if the
* flags come from an IMAP server.
*/
const { IMAPServer } = ChromeUtils.importESModule(
);
add_task(async function () {
const server = new IMAPServer();
server.daemon.createMailbox("Trash", {
flags: ["\\Trash"],
subscribed: true,
});
server.daemon.createMailbox("Sent", { flags: ["\\Sent"], subscribed: true });
server.daemon.createMailbox("Drafts", {
flags: ["\\Drafts"],
subscribed: true,
});
server.daemon.createMailbox("Spam", { flags: ["\\Spam"], subscribed: true });
server.daemon.createMailbox("Archives", {
flags: ["\\Archive"],
subscribed: true,
});
server.daemon.createMailbox("Not Special", { subscribed: true });
const account = MailServices.accounts.createAccount();
account.addIdentity(MailServices.accounts.createIdentity());
account.incomingServer = MailServices.accounts.createIncomingServer(
"user",
"localhost",
"imap"
);
account.incomingServer.password = "password";
account.incomingServer.port = server.port;
const rootFolder = account.incomingServer.rootFolder;
const listener = new PromiseTestUtils.PromiseUrlListener();
MailServices.imap.discoverAllFolders(rootFolder, listener, null);
await listener.promise;
const inboxFolder = rootFolder.getChildNamed("INBOX");
testLockedFlag(inboxFolder, "Inbox");
testUnlockedFlag(inboxFolder);
const sentFolder = rootFolder.getChildNamed("Sent");
testLockedFlag(sentFolder, "SentMail");
testUnlockedFlag(sentFolder);
const draftsFolder = rootFolder.getChildNamed("Drafts");
testLockedFlag(draftsFolder, "Drafts");
testUnlockedFlag(draftsFolder);
const trashFolder = rootFolder.getChildNamed("Trash");
testLockedFlag(trashFolder, "Trash");
testUnlockedFlag(trashFolder);
const spamFolder = rootFolder.getChildNamed("Spam");
testLockedFlag(spamFolder, "Junk");
testUnlockedFlag(spamFolder);
const archivesFolder = rootFolder.getChildNamed("Archives");
testLockedFlag(archivesFolder, "Archive");
testUnlockedFlag(archivesFolder);
const notSpecialFolder = rootFolder.getChildNamed("Not Special");
testUnlockedFlag(notSpecialFolder);
testUnlockedFlag(notSpecialFolder, "SentMail");
testUnlockedFlag(notSpecialFolder, "Archive");
});
function testLockedFlag(folder, flagName) {
info(`checking the locked functions with ${flagName} flag on ${folder.URI}`);
const flag = Ci.nsMsgFolderFlags[flagName];
const initialFlags = folder.flags;
Assert.ok(initialFlags & flag, "folder had flag to begin with");
folder.clearFlag(flag);
Assert.equal(
folder.flags.toString(16),
initialFlags.toString(16),
"flags are unchanged after clearFlag"
);
folder.toggleFlag(flag);
Assert.equal(
folder.flags.toString(16),
initialFlags.toString(16),
"flags are unchanged after toggleFlag"
);
folder.flags &= ~flag;
Assert.equal(
folder.flags.toString(16),
initialFlags.toString(16),
"flags are unchanged after setFlags"
);
}
function testUnlockedFlag(folder, flagName = "Unused4") {
info(
`checking the unlocked functions with ${flagName} flag on ${folder.URI}`
);
const flag = Ci.nsMsgFolderFlags[flagName];
const initialFlags = folder.flags;
Assert.ok(!(initialFlags & flag), "folder did not have flag to begin with");
folder.setFlag(flag);
Assert.equal(
folder.flags.toString(16),
(initialFlags | flag).toString(16),
"flag is added by setFlag"
);
folder.clearFlag(flag);
Assert.equal(
folder.flags.toString(16),
initialFlags.toString(16),
"flag is removed by clearFlag"
);
folder.toggleFlag(flag);
Assert.equal(
folder.flags.toString(16),
(initialFlags | flag).toString(16),
"flag is added by toggleFlag"
);
folder.flags &= ~flag;
Assert.equal(
folder.flags.toString(16),
initialFlags.toString(16),
"flag is removed by setFlags"
);
}