Bug 1678109 - get rid of the mailnews IOUtils.jsm module. r=freaktechnik
Differential Revision: https://phabricator.services.mozilla.com/D108933 --HG-- extra : rebase_source : d8bd49f8dd04b4b142c9975fe18a422da89587e9
This commit is contained in:
Родитель
1919389f7d
Коммит
b02c872895
|
@ -21,7 +21,6 @@ var { MailServices } = ChromeUtils.import(
|
||||||
"resource:///modules/MailServices.jsm"
|
"resource:///modules/MailServices.jsm"
|
||||||
);
|
);
|
||||||
var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm");
|
var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm");
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
var { FeedUtils } = ChromeUtils.import("resource:///modules/FeedUtils.jsm");
|
var { FeedUtils } = ChromeUtils.import("resource:///modules/FeedUtils.jsm");
|
||||||
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
|
|
||||||
|
@ -143,8 +142,10 @@ var gFolderTreeView = {
|
||||||
/**
|
/**
|
||||||
* Called when the window is initially loaded. This function initializes the
|
* Called when the window is initially loaded. This function initializes the
|
||||||
* folder-pane to the view last shown before the application was closed.
|
* folder-pane to the view last shown before the application was closed.
|
||||||
|
* @param {XULTreeElement} aTree - the tree to load
|
||||||
|
* @param {string} [aJSONFile] - name of JSON file to load data from.
|
||||||
*/
|
*/
|
||||||
load(aTree, aJSONFile) {
|
async load(aTree, aJSONFile = null) {
|
||||||
this._treeElement = aTree;
|
this._treeElement = aTree;
|
||||||
this.messengerBundle = document.getElementById("bundle_messenger");
|
this.messengerBundle = document.getElementById("bundle_messenger");
|
||||||
this.folderColorStyle = document.getElementById("folderColorsStyle");
|
this.folderColorStyle = document.getElementById("folderColorsStyle");
|
||||||
|
@ -167,19 +168,19 @@ var gFolderTreeView = {
|
||||||
|
|
||||||
if (aJSONFile) {
|
if (aJSONFile) {
|
||||||
// Parse our persistent-state json file
|
// Parse our persistent-state json file
|
||||||
let data = IOUtils.loadFileToString(aJSONFile);
|
let spec = OS.Path.join(OS.Constants.Path.profileDir, aJSONFile);
|
||||||
if (data) {
|
try {
|
||||||
try {
|
let data = await IOUtils.readJSON(spec);
|
||||||
let parsedData = JSON.parse(data);
|
// Migrate all the data from the old stored object if the "open"
|
||||||
// Migrate all the data from the old stored object if the "open"
|
// object doesn't exist.
|
||||||
// object doesn't exist.
|
this._persistOpenMap = data.open || data;
|
||||||
this._persistOpenMap = parsedData.open || parsedData;
|
this._persistColorMap = data.colors;
|
||||||
this._persistColorMap = parsedData.colors;
|
} catch (ex) {
|
||||||
} catch (x) {
|
if (!["NotFoundError"].includes(ex.name)) {
|
||||||
Cu.reportError(
|
Cu.reportError(
|
||||||
gFolderTreeView.messengerBundle.getFormattedString(
|
gFolderTreeView.messengerBundle.getFormattedString(
|
||||||
"failedToReadFile",
|
"failedToReadFile",
|
||||||
[aJSONFile, x]
|
[aJSONFile, ex]
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -201,18 +202,20 @@ var gFolderTreeView = {
|
||||||
/**
|
/**
|
||||||
* Called when the window is being torn down. Here we undo everything we did
|
* Called when the window is being torn down. Here we undo everything we did
|
||||||
* onload. That means removing our listener and serializing our JSON.
|
* onload. That means removing our listener and serializing our JSON.
|
||||||
|
* @param {string} [filename] - Name of the file to serialize to.
|
||||||
*/
|
*/
|
||||||
unload(aJSONFile) {
|
async unload(filename = null) {
|
||||||
// Remove our listener
|
// Remove our listener
|
||||||
MailServices.mailSession.RemoveFolderListener(this);
|
MailServices.mailSession.RemoveFolderListener(this);
|
||||||
|
|
||||||
if (aJSONFile) {
|
if (filename) {
|
||||||
// Write out our json file...
|
// Write out our json file...
|
||||||
let data = JSON.stringify({
|
let data = {
|
||||||
open: this._persistOpenMap,
|
open: this._persistOpenMap,
|
||||||
colors: this._persistColorMap,
|
colors: this._persistColorMap,
|
||||||
});
|
};
|
||||||
IOUtils.saveStringToFile(aJSONFile, data);
|
let spec = OS.Path.join(OS.Constants.Path.profileDir, filename);
|
||||||
|
await IOUtils.writeJSON(spec, data);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
ChromeUtils.import("resource:///modules/activity/activityModules.jsm");
|
ChromeUtils.import("resource:///modules/activity/activityModules.jsm");
|
||||||
var { logException } = ChromeUtils.import("resource:///modules/ErrUtils.jsm");
|
var { logException } = ChromeUtils.import("resource:///modules/ErrUtils.jsm");
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
var { JSTreeSelection } = ChromeUtils.import(
|
var { JSTreeSelection } = ChromeUtils.import(
|
||||||
"resource:///modules/JsTreeSelection.jsm"
|
"resource:///modules/JsTreeSelection.jsm"
|
||||||
);
|
);
|
||||||
|
@ -798,7 +797,7 @@ var gMailInit = {
|
||||||
|
|
||||||
OnMailWindowUnload();
|
OnMailWindowUnload();
|
||||||
try {
|
try {
|
||||||
MailInstrumentation.uninit();
|
MailInstrumentation.uninit.bind(MailInstrumentation);
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
logException(ex);
|
logException(ex);
|
||||||
}
|
}
|
||||||
|
@ -840,11 +839,11 @@ function _showNewInstallModal() {
|
||||||
* integration dialog since the New Account Provinsioner uses a secondary
|
* integration dialog since the New Account Provinsioner uses a secondary
|
||||||
* success dialog after a new account has been created.
|
* success dialog after a new account has been created.
|
||||||
*/
|
*/
|
||||||
function LoadPostAccountWizard(isFromProvisioner) {
|
async function LoadPostAccountWizard(isFromProvisioner) {
|
||||||
InitMsgWindow();
|
InitMsgWindow();
|
||||||
messenger.setWindow(window, msgWindow);
|
messenger.setWindow(window, msgWindow);
|
||||||
|
|
||||||
InitPanes();
|
await InitPanes();
|
||||||
MigrateJunkMailSettings();
|
MigrateJunkMailSettings();
|
||||||
MigrateFolderViews();
|
MigrateFolderViews();
|
||||||
MigrateOpenMessageBehavior();
|
MigrateOpenMessageBehavior();
|
||||||
|
@ -1360,8 +1359,8 @@ function AddToSession() {
|
||||||
MailServices.mailSession.AddFolderListener(folderListener, notifyFlags);
|
MailServices.mailSession.AddFolderListener(folderListener, notifyFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
function InitPanes() {
|
async function InitPanes() {
|
||||||
gFolderTreeView.load(
|
await gFolderTreeView.load(
|
||||||
document.getElementById("folderTree"),
|
document.getElementById("folderTree"),
|
||||||
"folderTree.json"
|
"folderTree.json"
|
||||||
);
|
);
|
||||||
|
|
|
@ -11,11 +11,6 @@
|
||||||
|
|
||||||
var EXPORTED_SYMBOLS = ["MailMigrator"];
|
var EXPORTED_SYMBOLS = ["MailMigrator"];
|
||||||
|
|
||||||
ChromeUtils.defineModuleGetter(
|
|
||||||
this,
|
|
||||||
"IOUtils",
|
|
||||||
"resource:///modules/IOUtils.jsm"
|
|
||||||
);
|
|
||||||
const { MailServices } = ChromeUtils.import(
|
const { MailServices } = ChromeUtils.import(
|
||||||
"resource:///modules/MailServices.jsm"
|
"resource:///modules/MailServices.jsm"
|
||||||
);
|
);
|
||||||
|
@ -214,21 +209,23 @@ var MailMigrator = {
|
||||||
// This one is needed also in all new profiles.
|
// This one is needed also in all new profiles.
|
||||||
// Add an expanded entry for All Address Books.
|
// Add an expanded entry for All Address Books.
|
||||||
if (currentUIVersion < 10 || newProfile) {
|
if (currentUIVersion < 10 || newProfile) {
|
||||||
const DIR_TREE_FILE = "directoryTree.json";
|
|
||||||
|
|
||||||
// If the file exists, read its contents, prepend the "All ABs" URI
|
// If the file exists, read its contents, prepend the "All ABs" URI
|
||||||
// and save it, else, just write the "All ABs" URI to the file.
|
// and save it, else, just write the "All ABs" URI to the file.
|
||||||
let data = IOUtils.loadFileToString(DIR_TREE_FILE);
|
PathUtils.getProfileDir().then(dir => {
|
||||||
if (!data || data == "[]") {
|
let spec = PathUtils.join(dir, "directoryTree.json");
|
||||||
data = "";
|
IOUtils.readJSON(spec)
|
||||||
} else if (data.length > 0) {
|
.then(data => {
|
||||||
data = data.substring(1, data.length - 1);
|
data.unshift("moz-abdirectory://?");
|
||||||
}
|
IOUtils.writeJSON(spec, data);
|
||||||
|
})
|
||||||
data =
|
.catch(ex => {
|
||||||
'["moz-abdirectory://?"' + (data.length > 0 ? "," + data : "") + "]";
|
if (["NotFoundError"].includes(ex.name)) {
|
||||||
|
IOUtils.writeJSON(spec, ["moz-abdirectory://?"]);
|
||||||
IOUtils.saveStringToFile(DIR_TREE_FILE, data);
|
} else {
|
||||||
|
Cu.reportError(ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Several Latin language groups were consolidated into x-western.
|
// Several Latin language groups were consolidated into x-western.
|
||||||
|
@ -605,7 +602,7 @@ var MailMigrator = {
|
||||||
*
|
*
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
*/
|
*/
|
||||||
_migrateRSS() {
|
async _migrateRSS() {
|
||||||
// Find all the RSS IncomingServers.
|
// Find all the RSS IncomingServers.
|
||||||
let rssServers = [];
|
let rssServers = [];
|
||||||
for (let server of MailServices.accounts.allServers) {
|
for (let server of MailServices.accounts.allServers) {
|
||||||
|
@ -616,48 +613,46 @@ var MailMigrator = {
|
||||||
|
|
||||||
// For each one...
|
// For each one...
|
||||||
for (let server of rssServers) {
|
for (let server of rssServers) {
|
||||||
this._migrateRSSServer(server);
|
await this._migrateRSSServer(server);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_migrateRSSServer(server) {
|
async _migrateRSSServer(server) {
|
||||||
let rssServer = server.QueryInterface(Ci.nsIRssIncomingServer);
|
let rssServer = server.QueryInterface(Ci.nsIRssIncomingServer);
|
||||||
|
|
||||||
// Convert feeds.rdf to feeds.json (if needed).
|
// Convert feeds.rdf to feeds.json (if needed).
|
||||||
let feedsFile = rssServer.subscriptionsPath;
|
let feedsFile = rssServer.subscriptionsPath;
|
||||||
let legacyFeedsFile = server.localPath;
|
let legacyFeedsFile = server.localPath;
|
||||||
legacyFeedsFile.append("feeds.rdf");
|
legacyFeedsFile.append("feeds.rdf");
|
||||||
if (!feedsFile.exists() && legacyFeedsFile.exists()) {
|
|
||||||
try {
|
try {
|
||||||
this._migrateRSSSubscriptions(legacyFeedsFile, feedsFile);
|
await this._migrateRSSSubscriptions(legacyFeedsFile, feedsFile);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
Cu.reportError(
|
Cu.reportError(
|
||||||
"Failed to migrate '" +
|
"Failed to migrate '" +
|
||||||
feedsFile.path +
|
feedsFile.path +
|
||||||
"' to '" +
|
"' to '" +
|
||||||
legacyFeedsFile.path +
|
legacyFeedsFile.path +
|
||||||
"': " +
|
"': " +
|
||||||
err
|
err
|
||||||
);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert feeditems.rdf to feeditems.json (if needed).
|
// Convert feeditems.rdf to feeditems.json (if needed).
|
||||||
let itemsFile = rssServer.feedItemsPath;
|
let itemsFile = rssServer.feedItemsPath;
|
||||||
let legacyItemsFile = server.localPath;
|
let legacyItemsFile = server.localPath;
|
||||||
legacyItemsFile.append("feeditems.rdf");
|
legacyItemsFile.append("feeditems.rdf");
|
||||||
if (!itemsFile.exists() && legacyItemsFile.exists()) {
|
try {
|
||||||
try {
|
await this._migrateRSSItems(legacyItemsFile, itemsFile);
|
||||||
this._migrateRSSItems(legacyItemsFile, itemsFile);
|
} catch (err) {
|
||||||
} catch (err) {
|
Cu.reportError(
|
||||||
Cu.reportError(
|
"Failed to migrate '" +
|
||||||
"Failed to migrate '" +
|
itemsFile.path +
|
||||||
itemsFile.path +
|
"' to '" +
|
||||||
"' to '" +
|
legacyItemsFile.path +
|
||||||
legacyItemsFile.path +
|
"': " +
|
||||||
"': " +
|
err
|
||||||
err
|
);
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -675,11 +670,17 @@ var MailMigrator = {
|
||||||
* @param {nsIFile} legacyFile - Location of the rdf file.
|
* @param {nsIFile} legacyFile - Location of the rdf file.
|
||||||
* @param {nsIFile} jsonFile - Location for the output JSON file.
|
* @param {nsIFile} jsonFile - Location for the output JSON file.
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
* @throws Will throw an error if the conversion fails.
|
|
||||||
*/
|
*/
|
||||||
_migrateRSSSubscriptions(legacyFile, jsonFile) {
|
async _migrateRSSSubscriptions(legacyFile, jsonFile) {
|
||||||
// Load .rdf file into an XMLDocument.
|
// Load .rdf file into an XMLDocument.
|
||||||
let rawXMLRDF = IOUtils.loadFileToString(legacyFile);
|
let rawXMLRDF;
|
||||||
|
try {
|
||||||
|
rawXMLRDF = await IOUtils.readUTF8(legacyFile.path);
|
||||||
|
} catch (ex) {
|
||||||
|
if (["NotFoundError"].includes(ex.name)) {
|
||||||
|
return; // nothing legacy file to migrate
|
||||||
|
}
|
||||||
|
}
|
||||||
let parser = new DOMParser();
|
let parser = new DOMParser();
|
||||||
let doc = parser.parseFromString(rawXMLRDF, "text/xml");
|
let doc = parser.parseFromString(rawXMLRDF, "text/xml");
|
||||||
|
|
||||||
|
@ -737,8 +738,7 @@ var MailMigrator = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = JSON.stringify(feeds);
|
await IOUtils.writeJSON(jsonFile.path, feeds);
|
||||||
IOUtils.saveStringToFile(jsonFile, data);
|
|
||||||
legacyFile.remove(false);
|
legacyFile.remove(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -749,11 +749,17 @@ var MailMigrator = {
|
||||||
* @param {nsIFile} legacyFile - Location of the rdf file.
|
* @param {nsIFile} legacyFile - Location of the rdf file.
|
||||||
* @param {nsIFile} jsonFile - Location for the output JSON file.
|
* @param {nsIFile} jsonFile - Location for the output JSON file.
|
||||||
* @returns {void}
|
* @returns {void}
|
||||||
* @throws Will throw an error if the conversion fails.
|
|
||||||
*/
|
*/
|
||||||
_migrateRSSItems(legacyFile, jsonFile) {
|
async _migrateRSSItems(legacyFile, jsonFile) {
|
||||||
// Load .rdf file into an XMLDocument.
|
// Load .rdf file into an XMLDocument.
|
||||||
let rawXMLRDF = IOUtils.loadFileToString(legacyFile);
|
let rawXMLRDF;
|
||||||
|
try {
|
||||||
|
rawXMLRDF = await IOUtils.readUTF8(legacyFile.path);
|
||||||
|
} catch (ex) {
|
||||||
|
if (["NotFoundError"].includes(ex.name)) {
|
||||||
|
return; // nothing legacy file to migrate
|
||||||
|
}
|
||||||
|
}
|
||||||
let parser = new DOMParser();
|
let parser = new DOMParser();
|
||||||
let doc = parser.parseFromString(rawXMLRDF, "text/xml");
|
let doc = parser.parseFromString(rawXMLRDF, "text/xml");
|
||||||
|
|
||||||
|
@ -834,8 +840,7 @@ var MailMigrator = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let data = JSON.stringify(items);
|
await IOUtils.writeJSON(jsonFile.path, items);
|
||||||
IOUtils.saveStringToFile(jsonFile, data);
|
|
||||||
legacyFile.remove(false);
|
legacyFile.remove(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,6 @@
|
||||||
var { MailServices } = ChromeUtils.import(
|
var { MailServices } = ChromeUtils.import(
|
||||||
"resource:///modules/MailServices.jsm"
|
"resource:///modules/MailServices.jsm"
|
||||||
);
|
);
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
var { FileUtils } = ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
|
var { FileUtils } = ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
|
||||||
var { PrivateBrowsingUtils } = ChromeUtils.import(
|
var { PrivateBrowsingUtils } = ChromeUtils.import(
|
||||||
|
|
|
@ -17,7 +17,6 @@ var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
var { MailServices } = ChromeUtils.import(
|
var { MailServices } = ChromeUtils.import(
|
||||||
"resource:///modules/MailServices.jsm"
|
"resource:///modules/MailServices.jsm"
|
||||||
);
|
);
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Each abDirTreeItem corresponds to one row in the tree view.
|
* Each abDirTreeItem corresponds to one row in the tree view.
|
||||||
|
@ -121,12 +120,22 @@ directoryTreeView.prototype = {
|
||||||
"addrbook-reloaded",
|
"addrbook-reloaded",
|
||||||
],
|
],
|
||||||
|
|
||||||
init(aTree, aJSONFile) {
|
/**
|
||||||
|
* Init the tree view.
|
||||||
|
*
|
||||||
|
* @param {XULTreeElement} aTree - The element to init.
|
||||||
|
* @param {string} [aJSONFile] - The persistent-open-state JSON file; directoryTree.json
|
||||||
|
*/
|
||||||
|
async init(aTree, aJSONFile = null) {
|
||||||
if (aJSONFile) {
|
if (aJSONFile) {
|
||||||
// Parse our persistent-open-state json file
|
// Parse our persistent-open-state json file
|
||||||
let data = IOUtils.loadFileToString(aJSONFile);
|
let spec = PathUtils.join(await PathUtils.getProfileDir(), aJSONFile);
|
||||||
if (data) {
|
try {
|
||||||
this._persistOpenMap = JSON.parse(data);
|
this._persistOpenMap = await IOUtils.readJSON(spec);
|
||||||
|
} catch (ex) {
|
||||||
|
if (!["NotFoundError"].includes(ex.name)) {
|
||||||
|
Cu.reportError(ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,12 +147,12 @@ directoryTreeView.prototype = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
shutdown(aJSONFile) {
|
async shutdown(aJSONFile) {
|
||||||
// Write out the persistOpenMap to our JSON file
|
// Write out the persistOpenMap to our JSON file
|
||||||
if (aJSONFile) {
|
if (aJSONFile) {
|
||||||
// Write out our json file...
|
// Write out our json file...
|
||||||
let data = JSON.stringify(this._persistOpenMap);
|
let spec = PathUtils.join(await PathUtils.getProfileDir(), aJSONFile);
|
||||||
IOUtils.saveStringToFile(aJSONFile, data);
|
await IOUtils.writeJSON(spec, this._persistOpenMap);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ var kFirstNameFirst = 2;
|
||||||
// of IM contacts).
|
// of IM contacts).
|
||||||
var kChatProperties = ["_GoogleTalk", "_JabberId"];
|
var kChatProperties = ["_GoogleTalk", "_JabberId"];
|
||||||
|
|
||||||
function OnUnloadAddressBook() {
|
async function OnUnloadAddressBook() {
|
||||||
// If there's no default startupURI, save the last used URI as new startupURI.
|
// If there's no default startupURI, save the last used URI as new startupURI.
|
||||||
let saveLastURIasStartupURI = !Services.prefs.getBoolPref(
|
let saveLastURIasStartupURI = !Services.prefs.getBoolPref(
|
||||||
"mail.addr_book.view.startupURIisDefault"
|
"mail.addr_book.view.startupURIisDefault"
|
||||||
|
@ -76,7 +76,7 @@ function OnUnloadAddressBook() {
|
||||||
|
|
||||||
// Shutdown the tree view - this will also save the open/collapsed
|
// Shutdown the tree view - this will also save the open/collapsed
|
||||||
// state of the tree view to a JSON file.
|
// state of the tree view to a JSON file.
|
||||||
gDirectoryTreeView.shutdown(kPersistCollapseMapStorage);
|
await gDirectoryTreeView.shutdown(kPersistCollapseMapStorage);
|
||||||
|
|
||||||
MailServices.mailSession.RemoveMsgWindow(msgWindow);
|
MailServices.mailSession.RemoveMsgWindow(msgWindow);
|
||||||
|
|
||||||
|
@ -145,10 +145,10 @@ function OnLoadAddressBook() {
|
||||||
chatHandler.ChatCore.init();
|
chatHandler.ChatCore.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(delayedOnLoadAddressBook, 0); // when debugging, set this to 5000, so you can see what happens after the window comes up.
|
delayedOnLoadAddressBook();
|
||||||
}
|
}
|
||||||
|
|
||||||
function delayedOnLoadAddressBook() {
|
async function delayedOnLoadAddressBook() {
|
||||||
InitCommonJS();
|
InitCommonJS();
|
||||||
|
|
||||||
GetCurrentPrefs();
|
GetCurrentPrefs();
|
||||||
|
@ -157,7 +157,7 @@ function delayedOnLoadAddressBook() {
|
||||||
OnLoadCardView();
|
OnLoadCardView();
|
||||||
|
|
||||||
// Initialize the Address Book tree view
|
// Initialize the Address Book tree view
|
||||||
gDirectoryTreeView.init(gDirTree, kPersistCollapseMapStorage);
|
await gDirectoryTreeView.init(gDirTree, kPersistCollapseMapStorage);
|
||||||
|
|
||||||
selectStartupViewDirectory();
|
selectStartupViewDirectory();
|
||||||
gAbResultsTree.focus();
|
gAbResultsTree.focus();
|
||||||
|
|
|
@ -73,7 +73,8 @@ add_task(async function test_additions_and_removals() {
|
||||||
|
|
||||||
observer.setUp();
|
observer.setUp();
|
||||||
|
|
||||||
openRootDirectory();
|
await openRootDirectory();
|
||||||
|
info("Performing check #1");
|
||||||
checkCardsListed(contactA1, contactB1);
|
checkCardsListed(contactA1, contactB1);
|
||||||
|
|
||||||
// While in bookA, add a contact and list. Check that they show up.
|
// While in bookA, add a contact and list. Check that they show up.
|
||||||
|
@ -87,7 +88,8 @@ add_task(async function test_additions_and_removals() {
|
||||||
listC.addCard(contactA1);
|
listC.addCard(contactA1);
|
||||||
checkCardsListed(contactA1, contactA2, listC);
|
checkCardsListed(contactA1, contactA2, listC);
|
||||||
|
|
||||||
openRootDirectory();
|
await openRootDirectory();
|
||||||
|
info("Performing check #2");
|
||||||
checkCardsListed(contactA1, contactA2, contactB1, listC);
|
checkCardsListed(contactA1, contactA2, contactB1, listC);
|
||||||
|
|
||||||
// While in listC, add a member and remove a member. Check that they show up
|
// While in listC, add a member and remove a member. Check that they show up
|
||||||
|
@ -99,7 +101,8 @@ add_task(async function test_additions_and_removals() {
|
||||||
await deleteRowWithPrompt(0);
|
await deleteRowWithPrompt(0);
|
||||||
checkCardsListed(contactA2);
|
checkCardsListed(contactA2);
|
||||||
|
|
||||||
openRootDirectory();
|
await openRootDirectory();
|
||||||
|
info("Performing check #3");
|
||||||
checkCardsListed(contactA1, contactA2, contactB1, listC);
|
checkCardsListed(contactA1, contactA2, contactB1, listC);
|
||||||
|
|
||||||
// While in bookA, delete a contact. Check it disappears.
|
// While in bookA, delete a contact. Check it disappears.
|
||||||
|
@ -116,7 +119,8 @@ add_task(async function test_additions_and_removals() {
|
||||||
listD.addCard(contactB1);
|
listD.addCard(contactB1);
|
||||||
checkCardsListed(contactA2, listC);
|
checkCardsListed(contactA2, listC);
|
||||||
|
|
||||||
openRootDirectory();
|
await openRootDirectory();
|
||||||
|
info("Performing check #4");
|
||||||
checkCardsListed(contactA2, contactB1, contactB2, listC, listD);
|
checkCardsListed(contactA2, contactB1, contactB2, listC, listD);
|
||||||
|
|
||||||
// While in listC, do some things in an unrelated list. Check nothing
|
// While in listC, do some things in an unrelated list. Check nothing
|
||||||
|
@ -130,7 +134,8 @@ add_task(async function test_additions_and_removals() {
|
||||||
bookB.deleteCards([contactB1]);
|
bookB.deleteCards([contactB1]);
|
||||||
checkCardsListed(contactA2);
|
checkCardsListed(contactA2);
|
||||||
|
|
||||||
openRootDirectory();
|
await openRootDirectory();
|
||||||
|
info("Performing check #5");
|
||||||
checkCardsListed(contactA2, contactB2, listC, listD);
|
checkCardsListed(contactA2, contactB2, listC, listD);
|
||||||
|
|
||||||
// While in bookA, do some things in an unrelated book. Check nothing
|
// While in bookA, do some things in an unrelated book. Check nothing
|
||||||
|
@ -145,7 +150,8 @@ add_task(async function test_additions_and_removals() {
|
||||||
|
|
||||||
// While in "All Address Books", make some changes and check that things
|
// While in "All Address Books", make some changes and check that things
|
||||||
// appear or disappear as appropriate.
|
// appear or disappear as appropriate.
|
||||||
openRootDirectory();
|
await openRootDirectory();
|
||||||
|
info("Performing check #6");
|
||||||
checkCardsListed(contactA2, contactB2);
|
checkCardsListed(contactA2, contactB2);
|
||||||
let listE = bookB.addMailList(createMailingList("list E")); // Add E.
|
let listE = bookB.addMailList(createMailingList("list E")); // Add E.
|
||||||
checkDirectoryDisplayed(null);
|
checkDirectoryDisplayed(null);
|
||||||
|
|
|
@ -40,6 +40,7 @@ add_task(async () => {
|
||||||
let abWindow = await openAddressBookWindow();
|
let abWindow = await openAddressBookWindow();
|
||||||
|
|
||||||
let dirTree = abWindow.document.getElementById("dirTree");
|
let dirTree = abWindow.document.getElementById("dirTree");
|
||||||
|
|
||||||
Assert.equal(
|
Assert.equal(
|
||||||
dirTree.view.getCellText(2, dirTree.columns[0]),
|
dirTree.view.getCellText(2, dirTree.columns[0]),
|
||||||
inputs.abName,
|
inputs.abName,
|
||||||
|
|
|
@ -42,7 +42,6 @@ async function openAddressBookWindow() {
|
||||||
abWindow,
|
abWindow,
|
||||||
"address book window has focus"
|
"address book window has focus"
|
||||||
);
|
);
|
||||||
|
|
||||||
return abWindow;
|
return abWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +59,7 @@ function getAddressBookWindow() {
|
||||||
return Services.wm.getMostRecentWindow("mail:addressbook");
|
return Services.wm.getMostRecentWindow("mail:addressbook");
|
||||||
}
|
}
|
||||||
|
|
||||||
function openRootDirectory() {
|
async function openRootDirectory() {
|
||||||
let abWindow = getAddressBookWindow();
|
let abWindow = getAddressBookWindow();
|
||||||
let abDirTree = abWindow.gDirTree;
|
let abDirTree = abWindow.gDirTree;
|
||||||
mailTestUtils.treeClick(EventUtils, abWindow, abDirTree, 0, 0, {});
|
mailTestUtils.treeClick(EventUtils, abWindow, abDirTree, 0, 0, {});
|
||||||
|
|
|
@ -50,7 +50,6 @@ add_task(function test_re_test_config() {
|
||||||
// unwind before opening the next one, so do that here.
|
// unwind before opening the next one, so do that here.
|
||||||
mc.sleep(0);
|
mc.sleep(0);
|
||||||
open_mail_account_setup_wizard(function(awc) {
|
open_mail_account_setup_wizard(function(awc) {
|
||||||
dump("xxxmagnus opened!\n");
|
|
||||||
// Input user's account information
|
// Input user's account information
|
||||||
awc.click(awc.eid("realname"));
|
awc.click(awc.eid("realname"));
|
||||||
if (awc.e("realname").value) {
|
if (awc.e("realname").value) {
|
||||||
|
|
|
@ -31,8 +31,6 @@ var { close_window } = ChromeUtils.import(
|
||||||
"resource://testing-common/mozmill/WindowHelpers.jsm"
|
"resource://testing-common/mozmill/WindowHelpers.jsm"
|
||||||
);
|
);
|
||||||
|
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
|
|
||||||
var gImageFolder;
|
var gImageFolder;
|
||||||
|
|
||||||
add_task(function setupModule(module) {
|
add_task(function setupModule(module) {
|
||||||
|
@ -89,7 +87,7 @@ add_task(async function test_cid_image_load() {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Make sure there is a cid: referenced image in the message.
|
// Make sure there is a cid: referenced image in the message.
|
||||||
let msgSource = IOUtils.loadFileToString(file);
|
let msgSource = await IOUtils.readUTF8(file.path);
|
||||||
Assert.ok(msgSource.includes('<img src="cid:'));
|
Assert.ok(msgSource.includes('<img src="cid:'));
|
||||||
|
|
||||||
// Our image should be in the loaded eml document.
|
// Our image should be in the loaded eml document.
|
||||||
|
|
|
@ -37,7 +37,6 @@ var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
var { MailServices } = ChromeUtils.import(
|
var { MailServices } = ChromeUtils.import(
|
||||||
"resource:///modules/MailServices.jsm"
|
"resource:///modules/MailServices.jsm"
|
||||||
);
|
);
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
|
|
||||||
var statusHeader = "X-Mozilla-Status: ";
|
var statusHeader = "X-Mozilla-Status: ";
|
||||||
|
|
||||||
|
@ -94,7 +93,7 @@ add_task(function setupModule(module) {
|
||||||
* @param aStatusOffset Offset from the start of the message where the status line is. Optional.
|
* @param aStatusOffset Offset from the start of the message where the status line is. Optional.
|
||||||
* @param aStatus The required status of the message.
|
* @param aStatus The required status of the message.
|
||||||
*/
|
*/
|
||||||
function check_status(aMsgHdr, aOffset, aStatusOffset, aStatus) {
|
async function check_status(aMsgHdr, aOffset, aStatusOffset, aStatus) {
|
||||||
if (aOffset == null) {
|
if (aOffset == null) {
|
||||||
aOffset = aMsgHdr.messageOffset;
|
aOffset = aMsgHdr.messageOffset;
|
||||||
}
|
}
|
||||||
|
@ -103,8 +102,7 @@ function check_status(aMsgHdr, aOffset, aStatusOffset, aStatus) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let folder = aMsgHdr == null ? gInbox : aMsgHdr.folder;
|
let folder = aMsgHdr == null ? gInbox : aMsgHdr.folder;
|
||||||
|
let mboxstring = await IOUtils.readUTF8(folder.filePath.path);
|
||||||
let mboxstring = IOUtils.loadFileToString(folder.filePath);
|
|
||||||
|
|
||||||
let expectedStatusString = aStatus.toString(16);
|
let expectedStatusString = aStatus.toString(16);
|
||||||
while (expectedStatusString.length < 4) {
|
while (expectedStatusString.length < 4) {
|
||||||
|
@ -127,7 +125,7 @@ function check_status(aMsgHdr, aOffset, aStatusOffset, aStatus) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_task(function test_mark_messages_read() {
|
add_task(async function test_mark_messages_read() {
|
||||||
// 5 messages in the folder
|
// 5 messages in the folder
|
||||||
be_in_folder(gInbox);
|
be_in_folder(gInbox);
|
||||||
let curMessage = select_click_row(0);
|
let curMessage = select_click_row(0);
|
||||||
|
@ -135,10 +133,10 @@ add_task(function test_mark_messages_read() {
|
||||||
// after the message is deleted.
|
// after the message is deleted.
|
||||||
let offset = curMessage.messageOffset;
|
let offset = curMessage.messageOffset;
|
||||||
let statusOffset = curMessage.statusOffset;
|
let statusOffset = curMessage.statusOffset;
|
||||||
check_status(curMessage, null, null, 0); // status = unread
|
await check_status(curMessage, null, null, 0); // status = unread
|
||||||
press_delete(mc);
|
press_delete(mc);
|
||||||
Assert.notEqual(curMessage, select_click_row(0));
|
Assert.notEqual(curMessage, select_click_row(0));
|
||||||
check_status(
|
await check_status(
|
||||||
null,
|
null,
|
||||||
offset,
|
offset,
|
||||||
statusOffset,
|
statusOffset,
|
||||||
|
@ -147,7 +145,7 @@ add_task(function test_mark_messages_read() {
|
||||||
|
|
||||||
// 4 messages in the folder.
|
// 4 messages in the folder.
|
||||||
curMessage = select_click_row(0);
|
curMessage = select_click_row(0);
|
||||||
check_status(curMessage, null, null, 0); // status = unread
|
await check_status(curMessage, null, null, 0); // status = unread
|
||||||
|
|
||||||
// Make sure we can mark all read with >0 messages unread.
|
// Make sure we can mark all read with >0 messages unread.
|
||||||
right_click_on_row(0);
|
right_click_on_row(0);
|
||||||
|
@ -158,16 +156,16 @@ add_task(function test_mark_messages_read() {
|
||||||
|
|
||||||
// All the 4 messages should now be read.
|
// All the 4 messages should now be read.
|
||||||
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
||||||
check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
await check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
||||||
curMessage = select_click_row(1);
|
curMessage = select_click_row(1);
|
||||||
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
||||||
check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
await check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
||||||
curMessage = select_click_row(2);
|
curMessage = select_click_row(2);
|
||||||
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
||||||
check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
await check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
||||||
curMessage = select_click_row(3);
|
curMessage = select_click_row(3);
|
||||||
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
Assert.ok(curMessage.isRead, "Message should have been marked Read!");
|
||||||
check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
await check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Read);
|
||||||
|
|
||||||
// Let's have the last message unread.
|
// Let's have the last message unread.
|
||||||
right_click_on_row(3);
|
right_click_on_row(3);
|
||||||
|
@ -176,10 +174,10 @@ add_task(function test_mark_messages_read() {
|
||||||
{ id: "mailContext-markUnread" },
|
{ id: "mailContext-markUnread" },
|
||||||
]);
|
]);
|
||||||
Assert.ok(!curMessage.isRead, "Message should have not been marked Read!");
|
Assert.ok(!curMessage.isRead, "Message should have not been marked Read!");
|
||||||
check_status(curMessage, null, null, 0);
|
await check_status(curMessage, null, null, 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function test_mark_messages_flagged() {
|
add_task(async function test_mark_messages_flagged() {
|
||||||
// Mark a message with the star.
|
// Mark a message with the star.
|
||||||
let curMessage = select_click_row(1);
|
let curMessage = select_click_row(1);
|
||||||
right_click_on_row(1);
|
right_click_on_row(1);
|
||||||
|
@ -188,7 +186,7 @@ add_task(function test_mark_messages_flagged() {
|
||||||
{ id: "mailContext-markFlagged" },
|
{ id: "mailContext-markFlagged" },
|
||||||
]);
|
]);
|
||||||
Assert.ok(curMessage.isFlagged, "Message should have been marked Flagged!");
|
Assert.ok(curMessage.isFlagged, "Message should have been marked Flagged!");
|
||||||
check_status(
|
await check_status(
|
||||||
curMessage,
|
curMessage,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
|
@ -196,11 +194,11 @@ add_task(function test_mark_messages_flagged() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
function subtest_check_queued_message() {
|
async function subtest_check_queued_message() {
|
||||||
// Always check the last message in the Outbox for the correct flag.
|
// Always check the last message in the Outbox for the correct flag.
|
||||||
be_in_folder(gOutbox);
|
be_in_folder(gOutbox);
|
||||||
let lastMsg = [...gOutbox.messages].pop();
|
let lastMsg = [...gOutbox.messages].pop();
|
||||||
check_status(lastMsg, null, null, Ci.nsMsgMessageFlags.Queued);
|
await check_status(lastMsg, null, null, Ci.nsMsgMessageFlags.Queued);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -209,7 +207,7 @@ function subtest_check_queued_message() {
|
||||||
* @param aMsgRow Row index of message in Inbox that is to be replied/forwarded.
|
* @param aMsgRow Row index of message in Inbox that is to be replied/forwarded.
|
||||||
* @param aReply true = reply, false = forward.
|
* @param aReply true = reply, false = forward.
|
||||||
*/
|
*/
|
||||||
function reply_forward_message(aMsgRow, aReply) {
|
async function reply_forward_message(aMsgRow, aReply) {
|
||||||
be_in_folder(gInbox);
|
be_in_folder(gInbox);
|
||||||
select_click_row(aMsgRow);
|
select_click_row(aMsgRow);
|
||||||
let cwc;
|
let cwc;
|
||||||
|
@ -237,7 +235,7 @@ function reply_forward_message(aMsgRow, aReply) {
|
||||||
);
|
);
|
||||||
wait_for_window_close(cwc);
|
wait_for_window_close(cwc);
|
||||||
|
|
||||||
subtest_check_queued_message();
|
await subtest_check_queued_message();
|
||||||
|
|
||||||
// Now this is hacky. We can't get the message to be sent out of TB because there
|
// Now this is hacky. We can't get the message to be sent out of TB because there
|
||||||
// is no fake SMTP server support yet.
|
// is no fake SMTP server support yet.
|
||||||
|
@ -253,10 +251,10 @@ function reply_forward_message(aMsgRow, aReply) {
|
||||||
gInbox.addMessageDispositionState(curMessage, disposition);
|
gInbox.addMessageDispositionState(curMessage, disposition);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_task(function test_mark_messages_replied() {
|
add_task(async function test_mark_messages_replied() {
|
||||||
reply_forward_message(2, true);
|
await reply_forward_message(2, true);
|
||||||
let curMessage = select_click_row(2);
|
let curMessage = select_click_row(2);
|
||||||
check_status(
|
await check_status(
|
||||||
curMessage,
|
curMessage,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
|
@ -264,23 +262,23 @@ add_task(function test_mark_messages_replied() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function test_mark_messages_forwarded() {
|
add_task(async function test_mark_messages_forwarded() {
|
||||||
be_in_folder(gInbox);
|
be_in_folder(gInbox);
|
||||||
// Forward a clean message.
|
// Forward a clean message.
|
||||||
reply_forward_message(3, false);
|
await reply_forward_message(3, false);
|
||||||
let curMessage = select_click_row(3);
|
let curMessage = select_click_row(3);
|
||||||
check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Forwarded);
|
await check_status(curMessage, null, null, Ci.nsMsgMessageFlags.Forwarded);
|
||||||
|
|
||||||
// Forward a message that is read and already replied to.
|
// Forward a message that is read and already replied to.
|
||||||
curMessage = select_click_row(2);
|
curMessage = select_click_row(2);
|
||||||
check_status(
|
await check_status(
|
||||||
curMessage,
|
curMessage,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
Ci.nsMsgMessageFlags.Replied + Ci.nsMsgMessageFlags.Read
|
Ci.nsMsgMessageFlags.Replied + Ci.nsMsgMessageFlags.Read
|
||||||
);
|
);
|
||||||
reply_forward_message(2, false);
|
await reply_forward_message(2, false);
|
||||||
check_status(
|
await check_status(
|
||||||
curMessage,
|
curMessage,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
|
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
var { mailTestUtils } = ChromeUtils.import(
|
||||||
|
"resource://testing-common/mailnews/MailTestUtils.jsm"
|
||||||
|
);
|
||||||
|
|
||||||
var controller = ChromeUtils.import(
|
var controller = ChromeUtils.import(
|
||||||
"resource://testing-common/mozmill/controller.jsm"
|
"resource://testing-common/mozmill/controller.jsm"
|
||||||
);
|
);
|
||||||
|
@ -41,7 +45,6 @@ var {
|
||||||
wait_for_window_close,
|
wait_for_window_close,
|
||||||
} = ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm");
|
} = ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm");
|
||||||
|
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
var { FileUtils } = ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
|
var { FileUtils } = ChromeUtils.import("resource://gre/modules/FileUtils.jsm");
|
||||||
var { SessionStoreManager } = ChromeUtils.import(
|
var { SessionStoreManager } = ChromeUtils.import(
|
||||||
"resource:///modules/SessionStoreManager.jsm"
|
"resource:///modules/SessionStoreManager.jsm"
|
||||||
|
@ -61,20 +64,32 @@ var asyncFileWriteDelayMS = 3000;
|
||||||
/**
|
/**
|
||||||
* Reads the contents of the session file into a JSON object.
|
* Reads the contents of the session file into a JSON object.
|
||||||
*/
|
*/
|
||||||
function readFile() {
|
async function readFile2() {
|
||||||
try {
|
try {
|
||||||
let data = IOUtils.loadFileToString(SessionStoreManager.sessionFile);
|
return await IOUtils.readJSON(SessionStoreManager.sessionFile.path);
|
||||||
if (data) {
|
|
||||||
return JSON.parse(data);
|
|
||||||
}
|
|
||||||
} catch (ex) {
|
} catch (ex) {
|
||||||
|
if (!["NotFoundError"].includes(ex.name)) {
|
||||||
|
Cu.reportError(ex);
|
||||||
|
}
|
||||||
// fall through and return null if the session file cannot be read
|
// fall through and return null if the session file cannot be read
|
||||||
// or is bad
|
// or is bad
|
||||||
|
dump(ex + "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reads the contents of the session file into a JSON object.
|
||||||
|
* FIXME: readFile2 should really be used instead. For some weird reason using
|
||||||
|
* that, OR making this function async (+ await the results) will
|
||||||
|
* not work - seem like the file reading just dies (???)
|
||||||
|
* So use the sync file reading for now...
|
||||||
|
*/
|
||||||
|
function readFile() {
|
||||||
|
let data = mailTestUtils.loadFileToString(SessionStoreManager.sessionFile);
|
||||||
|
return JSON.parse(data);
|
||||||
|
}
|
||||||
|
|
||||||
function waitForFileRefresh() {
|
function waitForFileRefresh() {
|
||||||
controller.sleep(kSaveDelayMs);
|
controller.sleep(kSaveDelayMs);
|
||||||
utils.waitFor(
|
utils.waitFor(
|
||||||
|
@ -169,7 +184,7 @@ add_task(function test_periodic_nondirty_session_persistence() {
|
||||||
utils.waitFor(() => !sessionFile.exists(), "session file should not exist");
|
utils.waitFor(() => !sessionFile.exists(), "session file should not exist");
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function test_single_3pane_periodic_session_persistence() {
|
add_task(async function test_single_3pane_periodic_session_persistence() {
|
||||||
be_in_folder(folderA);
|
be_in_folder(folderA);
|
||||||
|
|
||||||
// get the state object. this assumes there is one and only one
|
// get the state object. this assumes there is one and only one
|
||||||
|
@ -453,7 +468,7 @@ add_task(function test_message_pane_width_persistence() {
|
||||||
wait_for_window_close();
|
wait_for_window_close();
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function test_multiple_3pane_periodic_session_persistence() {
|
add_task(async function test_multiple_3pane_periodic_session_persistence() {
|
||||||
// open a few more 3pane windows
|
// open a few more 3pane windows
|
||||||
for (var i = 0; i < 3; ++i) {
|
for (var i = 0; i < 3; ++i) {
|
||||||
open3PaneWindow();
|
open3PaneWindow();
|
||||||
|
@ -470,6 +485,7 @@ add_task(function test_multiple_3pane_periodic_session_persistence() {
|
||||||
|
|
||||||
// load the saved state from disk
|
// load the saved state from disk
|
||||||
let loadedState = readFile();
|
let loadedState = readFile();
|
||||||
|
|
||||||
Assert.ok(loadedState, "previously saved state should be non-null");
|
Assert.ok(loadedState, "previously saved state should be non-null");
|
||||||
|
|
||||||
Assert.equal(
|
Assert.equal(
|
||||||
|
@ -486,11 +502,9 @@ add_task(function test_multiple_3pane_periodic_session_persistence() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// close all but one 3pane window
|
// close all but one 3pane window
|
||||||
let enumerator = Services.wm.getEnumerator("mail:3pane");
|
let windows = Services.wm.getEnumerator("mail:3pane");
|
||||||
for (let window of enumerator) {
|
for (let win of windows) {
|
||||||
if (enumerator.hasMoreElements()) {
|
win.close();
|
||||||
window.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -520,7 +534,7 @@ async function test_bad_session_file_simple() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_task(function test_clean_shutdown_session_persistence_simple() {
|
add_task(async function test_clean_shutdown_session_persistence_simple() {
|
||||||
// open a few more 3pane windows
|
// open a few more 3pane windows
|
||||||
for (var i = 0; i < 3; ++i) {
|
for (var i = 0; i < 3; ++i) {
|
||||||
open3PaneWindow();
|
open3PaneWindow();
|
||||||
|
|
|
@ -162,6 +162,7 @@ ABView.prototype = {
|
||||||
if (tree) {
|
if (tree) {
|
||||||
Services.obs.addObserver(this, topic, true);
|
Services.obs.addObserver(this, topic, true);
|
||||||
} else {
|
} else {
|
||||||
|
// XXX: seems |this| is not usually a valid observer here
|
||||||
Services.obs.removeObserver(this, topic);
|
Services.obs.removeObserver(this, topic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@ XPCOMUtils.defineLazyModuleGetters(this, {
|
||||||
setTimeout: "resource://gre/modules/Timer.jsm",
|
setTimeout: "resource://gre/modules/Timer.jsm",
|
||||||
clearTimeout: "resource://gre/modules/Timer.jsm",
|
clearTimeout: "resource://gre/modules/Timer.jsm",
|
||||||
MailE10SUtils: "resource:///modules/MailE10SUtils.jsm",
|
MailE10SUtils: "resource:///modules/MailE10SUtils.jsm",
|
||||||
Services: "resource://gre/modules/Services.jsm",
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* globals for a particular window */
|
/* globals for a particular window */
|
||||||
|
|
|
@ -1,143 +0,0 @@
|
||||||
/* 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/. */
|
|
||||||
|
|
||||||
const EXPORTED_SYMBOLS = ["IOUtils"];
|
|
||||||
|
|
||||||
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
||||||
|
|
||||||
var kStringBlockSize = 4096;
|
|
||||||
var kStreamBlockSize = 8192;
|
|
||||||
|
|
||||||
var IOUtils = {
|
|
||||||
/**
|
|
||||||
* Read a file containing ASCII text into a string.
|
|
||||||
*
|
|
||||||
* @param aFile An nsIFile representing the file to read or a string containing
|
|
||||||
* the file name of a file under user's profile.
|
|
||||||
* @returns A string containing the contents of the file, presumed to be ASCII
|
|
||||||
* text. If the file didn't exist, returns null.
|
|
||||||
*/
|
|
||||||
loadFileToString(aFile) {
|
|
||||||
let file;
|
|
||||||
if (!(aFile instanceof Ci.nsIFile)) {
|
|
||||||
file = Services.dirsvc.get("ProfD", Ci.nsIFile);
|
|
||||||
file.append(aFile);
|
|
||||||
} else {
|
|
||||||
file = aFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!file.exists()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
let fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
|
|
||||||
Ci.nsIFileInputStream
|
|
||||||
);
|
|
||||||
// PR_RDONLY
|
|
||||||
fstream.init(file, 0x01, 0, 0);
|
|
||||||
|
|
||||||
let sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(
|
|
||||||
Ci.nsIScriptableInputStream
|
|
||||||
);
|
|
||||||
sstream.init(fstream);
|
|
||||||
|
|
||||||
let data = "";
|
|
||||||
while (sstream.available()) {
|
|
||||||
data += sstream.read(kStringBlockSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
sstream.close();
|
|
||||||
fstream.close();
|
|
||||||
|
|
||||||
return data;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save a string containing ASCII text into a file. The file will be overwritten
|
|
||||||
* and contain only the given text.
|
|
||||||
*
|
|
||||||
* @param aFile An nsIFile representing the file to write or a string containing
|
|
||||||
* the file name of a file under user's profile.
|
|
||||||
* @param aData The string to write.
|
|
||||||
* @param aPerms The octal file permissions for the created file. If unset
|
|
||||||
* the default of 0o600 is used.
|
|
||||||
*/
|
|
||||||
saveStringToFile(aFile, aData, aPerms = 0o600) {
|
|
||||||
let file;
|
|
||||||
if (!(aFile instanceof Ci.nsIFile)) {
|
|
||||||
file = Services.dirsvc.get("ProfD", Ci.nsIFile);
|
|
||||||
file.append(aFile);
|
|
||||||
} else {
|
|
||||||
file = aFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
let foStream = Cc[
|
|
||||||
"@mozilla.org/network/safe-file-output-stream;1"
|
|
||||||
].createInstance(Ci.nsIFileOutputStream);
|
|
||||||
|
|
||||||
// PR_WRONLY + PR_CREATE_FILE + PR_TRUNCATE
|
|
||||||
foStream.init(file, 0x02 | 0x08 | 0x20, aPerms, 0);
|
|
||||||
// safe-file-output-stream appears to throw an error if it doesn't write everything at once
|
|
||||||
// so we won't worry about looping to deal with partial writes.
|
|
||||||
// In case we try to use this function for big files where buffering
|
|
||||||
// is needed we could use the implementation in saveStreamToFile().
|
|
||||||
foStream.write(aData, aData.length);
|
|
||||||
foStream.QueryInterface(Ci.nsISafeOutputStream).finish();
|
|
||||||
foStream.close();
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Saves the given input stream to a file.
|
|
||||||
*
|
|
||||||
* @param aIStream The input stream to save.
|
|
||||||
* @param aFile The file to which the stream is saved.
|
|
||||||
* @param aPerms The octal file permissions for the created file. If unset
|
|
||||||
* the default of 0o600 is used.
|
|
||||||
*/
|
|
||||||
saveStreamToFile(aIStream, aFile, aPerms = 0o600) {
|
|
||||||
if (!(aIStream instanceof Ci.nsIInputStream)) {
|
|
||||||
throw new Error("Invalid stream passed to saveStreamToFile");
|
|
||||||
}
|
|
||||||
if (!(aFile instanceof Ci.nsIFile)) {
|
|
||||||
throw new Error("Invalid file passed to saveStreamToFile");
|
|
||||||
}
|
|
||||||
|
|
||||||
let fstream = Cc[
|
|
||||||
"@mozilla.org/network/safe-file-output-stream;1"
|
|
||||||
].createInstance(Ci.nsIFileOutputStream);
|
|
||||||
let buffer = Cc[
|
|
||||||
"@mozilla.org/network/buffered-output-stream;1"
|
|
||||||
].createInstance(Ci.nsIBufferedOutputStream);
|
|
||||||
|
|
||||||
// Write the input stream to the file.
|
|
||||||
// PR_WRITE + PR_CREATE + PR_TRUNCATE
|
|
||||||
fstream.init(aFile, 0x04 | 0x08 | 0x20, aPerms, 0);
|
|
||||||
buffer.init(fstream, kStreamBlockSize);
|
|
||||||
|
|
||||||
buffer.writeFrom(aIStream, aIStream.available());
|
|
||||||
|
|
||||||
// Close the output streams.
|
|
||||||
if (buffer instanceof Ci.nsISafeOutputStream) {
|
|
||||||
buffer.finish();
|
|
||||||
} else {
|
|
||||||
buffer.close();
|
|
||||||
}
|
|
||||||
if (fstream instanceof Ci.nsISafeOutputStream) {
|
|
||||||
fstream.finish();
|
|
||||||
} else {
|
|
||||||
fstream.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the input stream.
|
|
||||||
aIStream.close();
|
|
||||||
return aFile;
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns size of system memory.
|
|
||||||
*/
|
|
||||||
getPhysicalMemorySize() {
|
|
||||||
return Services.sysinfo.getPropertyAsInt64("memsize");
|
|
||||||
},
|
|
||||||
};
|
|
|
@ -103,7 +103,6 @@ EXTRA_JS_MODULES += [
|
||||||
"FolderLookupService.jsm",
|
"FolderLookupService.jsm",
|
||||||
"folderUtils.jsm",
|
"folderUtils.jsm",
|
||||||
"hostnameUtils.jsm",
|
"hostnameUtils.jsm",
|
||||||
"IOUtils.jsm",
|
|
||||||
"iteratorUtils.jsm",
|
"iteratorUtils.jsm",
|
||||||
"JsTreeSelection.jsm",
|
"JsTreeSelection.jsm",
|
||||||
"JXON.jsm",
|
"JXON.jsm",
|
||||||
|
|
|
@ -2,7 +2,6 @@ var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
var { MailServices } = ChromeUtils.import(
|
var { MailServices } = ChromeUtils.import(
|
||||||
"resource:///modules/MailServices.jsm"
|
"resource:///modules/MailServices.jsm"
|
||||||
);
|
);
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
var { XPCOMUtils } = ChromeUtils.import(
|
var { XPCOMUtils } = ChromeUtils.import(
|
||||||
"resource://gre/modules/XPCOMUtils.jsm"
|
"resource://gre/modules/XPCOMUtils.jsm"
|
||||||
);
|
);
|
||||||
|
|
|
@ -206,7 +206,6 @@ function testReply(aHrdIdx, aTemplateHdrIdx = 0) {
|
||||||
|
|
||||||
let headers, body;
|
let headers, body;
|
||||||
[headers, body] = MimeParser.extractHeadersAndBody(gServer._daemon.post);
|
[headers, body] = MimeParser.extractHeadersAndBody(gServer._daemon.post);
|
||||||
// dump("xxxmagnus gServer._daemon.post=" + gServer._daemon.post + "\n");
|
|
||||||
Assert.ok(headers.get("Subject").startsWith("Auto: "));
|
Assert.ok(headers.get("Subject").startsWith("Auto: "));
|
||||||
Assert.equal(headers.get("Auto-submitted"), "auto-replied");
|
Assert.equal(headers.get("Auto-submitted"), "auto-replied");
|
||||||
Assert.equal(headers.get("In-Reply-To"), "<" + msgHdr.messageId + ">");
|
Assert.equal(headers.get("In-Reply-To"), "<" + msgHdr.messageId + ">");
|
||||||
|
|
|
@ -187,9 +187,9 @@ function sendMessageLater() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
// Test file - for bug 429891
|
// Test file - for bug 429891
|
||||||
originalData = IOUtils.loadFileToString(testFile);
|
originalData = await IOUtils.readUTF8(testFile.path);
|
||||||
|
|
||||||
// Ensure we have a local mail account, an normal account and appropriate
|
// Ensure we have a local mail account, an normal account and appropriate
|
||||||
// servers and identities.
|
// servers and identities.
|
||||||
|
@ -250,4 +250,4 @@ function run_test() {
|
||||||
|
|
||||||
// Now we wait till we get copy notification of completion.
|
// Now we wait till we get copy notification of completion.
|
||||||
do_test_pending();
|
do_test_pending();
|
||||||
}
|
});
|
||||||
|
|
|
@ -94,7 +94,7 @@ msll.prototype = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
// The point of this test - send in background.
|
// The point of this test - send in background.
|
||||||
Services.prefs.setBoolPref("mailnews.sendInBackground", true);
|
Services.prefs.setBoolPref("mailnews.sendInBackground", true);
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ function run_test() {
|
||||||
);
|
);
|
||||||
|
|
||||||
// Test file - for bug 429891
|
// Test file - for bug 429891
|
||||||
originalData = IOUtils.loadFileToString(testFile1);
|
originalData = await IOUtils.readUTF8(testFile1.path);
|
||||||
|
|
||||||
// Check that the send later service thinks we don't have messages to send
|
// Check that the send later service thinks we don't have messages to send
|
||||||
Assert.equal(gMsgSendLater.hasUnsentMessages(identity), false);
|
Assert.equal(gMsgSendLater.hasUnsentMessages(identity), false);
|
||||||
|
@ -220,4 +220,4 @@ function run_test() {
|
||||||
thread.processNextEvent(true);
|
thread.processNextEvent(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
|
@ -125,7 +125,7 @@ MsgSendListener.prototype = {
|
||||||
]),
|
]),
|
||||||
};
|
};
|
||||||
|
|
||||||
function DoSendTest(aRecipient, aRecipientExpected) {
|
async function doSendTest(aRecipient, aRecipientExpected) {
|
||||||
info(`Testing send to ${aRecipient} will get sent to ${aRecipientExpected}`);
|
info(`Testing send to ${aRecipient} will get sent to ${aRecipientExpected}`);
|
||||||
test = aRecipient;
|
test = aRecipient;
|
||||||
server = setupServerDaemon();
|
server = setupServerDaemon();
|
||||||
|
@ -136,7 +136,7 @@ function DoSendTest(aRecipient, aRecipientExpected) {
|
||||||
|
|
||||||
// Random test file with data we don't actually care about. ;-)
|
// Random test file with data we don't actually care about. ;-)
|
||||||
var testFile = do_get_file("data/message1.eml");
|
var testFile = do_get_file("data/message1.eml");
|
||||||
var originalData = IOUtils.loadFileToString(testFile);
|
var originalData = await IOUtils.readUTF8(testFile.path);
|
||||||
|
|
||||||
// Handle the server in a try/catch/finally loop so that we always will stop
|
// Handle the server in a try/catch/finally loop so that we always will stop
|
||||||
// the server if something fails.
|
// the server if something fails.
|
||||||
|
@ -191,13 +191,13 @@ add_task(function setup() {
|
||||||
sentFolder = localAccountUtils.rootFolder.createLocalSubfolder("Sent");
|
sentFolder = localAccountUtils.rootFolder.createLocalSubfolder("Sent");
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function plainASCIIRecipient() {
|
add_task(async function plainASCIIRecipient() {
|
||||||
// Test 1:
|
// Test 1:
|
||||||
// Plain ASCII recipient address.
|
// Plain ASCII recipient address.
|
||||||
DoSendTest(kToASCII, kToASCII);
|
await doSendTest(kToASCII, kToASCII);
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function domainContainsNonAscii() {
|
add_task(async function domainContainsNonAscii() {
|
||||||
// Test 2:
|
// Test 2:
|
||||||
// The recipient's domain part contains a non-ASCII character, hence the
|
// The recipient's domain part contains a non-ASCII character, hence the
|
||||||
// address needs to be converted to ACE before sending.
|
// address needs to be converted to ACE before sending.
|
||||||
|
@ -205,21 +205,21 @@ add_task(function domainContainsNonAscii() {
|
||||||
// the message to the remaining - wrong! - address.
|
// the message to the remaining - wrong! - address.
|
||||||
// The new code will translate the domain part to ACE for the SMTP
|
// The new code will translate the domain part to ACE for the SMTP
|
||||||
// transaction (only), i.e. the To: header will stay as stated by the sender.
|
// transaction (only), i.e. the To: header will stay as stated by the sender.
|
||||||
DoSendTest(kToValid, kToValidACE);
|
await doSendTest(kToValid, kToValidACE);
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function localContainsNonAscii() {
|
add_task(async function localContainsNonAscii() {
|
||||||
// Test 3:
|
// Test 3:
|
||||||
// The recipient's local part contains a non-ASCII character, which is not
|
// The recipient's local part contains a non-ASCII character, which is not
|
||||||
// allowed with unextended SMTP.
|
// allowed with unextended SMTP.
|
||||||
// The old code would just strip the invalid character and try to send the
|
// The old code would just strip the invalid character and try to send the
|
||||||
// message to the remaining - wrong! - address.
|
// message to the remaining - wrong! - address.
|
||||||
// The new code will present an informational message box and deny sending.
|
// The new code will present an informational message box and deny sending.
|
||||||
DoSendTest(kToInvalid, kToInvalid);
|
await doSendTest(kToInvalid, kToInvalid);
|
||||||
});
|
});
|
||||||
|
|
||||||
add_task(function invalidCharNoAt() {
|
add_task(async function invalidCharNoAt() {
|
||||||
// Test 4:
|
// Test 4:
|
||||||
// Bug 856506. invalid char without '@' causes crash.
|
// Bug 856506. invalid char without '@' causes crash.
|
||||||
DoSendTest(kToInvalidWithoutDomain, kToInvalidWithoutDomain);
|
await doSendTest(kToInvalidWithoutDomain, kToInvalidWithoutDomain);
|
||||||
});
|
});
|
||||||
|
|
|
@ -94,12 +94,12 @@ msl.prototype = {
|
||||||
]),
|
]),
|
||||||
};
|
};
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
server = setupServerDaemon();
|
server = setupServerDaemon();
|
||||||
|
|
||||||
// Test file - for bug 429891
|
// Test file - for bug 429891
|
||||||
var testFile = do_get_file("data/429891_testcase.eml");
|
var testFile = do_get_file("data/429891_testcase.eml");
|
||||||
originalData = IOUtils.loadFileToString(testFile);
|
originalData = await IOUtils.readUTF8(testFile.path);
|
||||||
|
|
||||||
// Ensure we have at least one mail account
|
// Ensure we have at least one mail account
|
||||||
localAccountUtils.loadLocalMailAccount();
|
localAccountUtils.loadLocalMailAccount();
|
||||||
|
@ -169,4 +169,4 @@ function run_test() {
|
||||||
thread.processNextEvent(true);
|
thread.processNextEvent(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
|
@ -192,9 +192,9 @@ function sendMessageLater() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
// Test file - for bug 429891
|
// Test file - for bug 429891
|
||||||
originalData = IOUtils.loadFileToString(testFile);
|
originalData = await IOUtils.readUTF8(testFile.path);
|
||||||
|
|
||||||
// Ensure we have a local mail account, an normal account and appropriate
|
// Ensure we have a local mail account, an normal account and appropriate
|
||||||
// servers and identities.
|
// servers and identities.
|
||||||
|
@ -258,4 +258,4 @@ function run_test() {
|
||||||
|
|
||||||
// Now we wait till we get copy notification of completion.
|
// Now we wait till we get copy notification of completion.
|
||||||
do_test_pending();
|
do_test_pending();
|
||||||
}
|
});
|
||||||
|
|
|
@ -235,10 +235,10 @@ function* actually_run_test() {
|
||||||
do_test_finished();
|
do_test_finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
// Load in the test files so we have a record of length and their data.
|
// Load in the test files so we have a record of length and their data.
|
||||||
for (var i = 0; i < gMsgFile.length; ++i) {
|
for (var i = 0; i < gMsgFile.length; ++i) {
|
||||||
gMsgFileData[i] = IOUtils.loadFileToString(gMsgFile[i]);
|
gMsgFileData[i] = await IOUtils.readUTF8(gMsgFile[i].path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Ensure we have a local mail account, an normal account and appropriate
|
// Ensure we have a local mail account, an normal account and appropriate
|
||||||
|
@ -287,4 +287,4 @@ function run_test() {
|
||||||
|
|
||||||
// Do the test
|
// Do the test
|
||||||
async_run({ func: actually_run_test });
|
async_run({ func: actually_run_test });
|
||||||
}
|
});
|
||||||
|
|
|
@ -122,11 +122,11 @@ function sendMessageLater() {
|
||||||
msgSendLater.sendUnsentMessages(identity);
|
msgSendLater.sendUnsentMessages(identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
registerAlertTestUtils();
|
registerAlertTestUtils();
|
||||||
|
|
||||||
// Test file - for bug 429891
|
// Test file - for bug 429891
|
||||||
originalData = IOUtils.loadFileToString(testFile);
|
originalData = await IOUtils.readUTF8(testFile.path);
|
||||||
|
|
||||||
// Ensure we have a local mail account, an normal account and appropriate
|
// Ensure we have a local mail account, an normal account and appropriate
|
||||||
// servers and identities.
|
// servers and identities.
|
||||||
|
@ -186,4 +186,4 @@ function run_test() {
|
||||||
|
|
||||||
// Now we wait till we get copy notification of completion.
|
// Now we wait till we get copy notification of completion.
|
||||||
do_test_pending();
|
do_test_pending();
|
||||||
}
|
});
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
const EXPORTED_SYMBOLS = ["GlodaDatastore"];
|
const EXPORTED_SYMBOLS = ["GlodaDatastore"];
|
||||||
|
|
||||||
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
const { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
GlodaAttributeDBDef,
|
GlodaAttributeDBDef,
|
||||||
|
@ -1363,7 +1362,7 @@ var GlodaDatastore = {
|
||||||
);
|
);
|
||||||
cachePermillage = Math.min(cachePermillage, 50);
|
cachePermillage = Math.min(cachePermillage, 50);
|
||||||
cachePermillage = Math.max(cachePermillage, 0);
|
cachePermillage = Math.max(cachePermillage, 0);
|
||||||
let physMem = IOUtils.getPhysicalMemorySize();
|
let physMem = Services.sysinfo.getPropertyAsInt64("memsize");
|
||||||
if (physMem == 0) {
|
if (physMem == 0) {
|
||||||
physMem = MEMSIZE_FALLBACK_BYTES;
|
physMem = MEMSIZE_FALLBACK_BYTES;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ async function migrationTest(testDataDir) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform the migration
|
// Perform the migration
|
||||||
MailMigrator._migrateRSSServer(account.incomingServer);
|
await MailMigrator._migrateRSSServer(account.incomingServer);
|
||||||
|
|
||||||
// Check actual results against expectations.
|
// Check actual results against expectations.
|
||||||
let loadJSON = async function(filename) {
|
let loadJSON = async function(filename) {
|
||||||
|
|
|
@ -2,10 +2,9 @@
|
||||||
* Test bug 460636 - nsMsgSaveAsListener sometimes inserts extra LF characters
|
* Test bug 460636 - nsMsgSaveAsListener sometimes inserts extra LF characters
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* import-globals-from ../../../test/resources/logHelper.js */
|
var { PromiseTestUtils } = ChromeUtils.import(
|
||||||
/* import-globals-from ../../../test/resources/asyncTestUtils.js */
|
"resource://testing-common/mailnews/PromiseTestUtils.jsm"
|
||||||
load("../../../resources/logHelper.js");
|
);
|
||||||
load("../../../resources/asyncTestUtils.js");
|
|
||||||
|
|
||||||
var gSavedMsgFile;
|
var gSavedMsgFile;
|
||||||
|
|
||||||
|
@ -16,15 +15,17 @@ var gIMAPService = Cc[
|
||||||
var gFileName = "bug460636";
|
var gFileName = "bug460636";
|
||||||
var gMsgFile = do_get_file("../../../data/" + gFileName);
|
var gMsgFile = do_get_file("../../../data/" + gFileName);
|
||||||
|
|
||||||
var tests = [setup, checkSavedMessage, teardown];
|
add_task(async function run_the_test() {
|
||||||
|
await setup();
|
||||||
|
await checkSavedMessage();
|
||||||
|
teardown();
|
||||||
|
});
|
||||||
|
|
||||||
function* setup() {
|
async function setup() {
|
||||||
setupIMAPPump();
|
setupIMAPPump();
|
||||||
|
|
||||||
/*
|
// Ok, prelude done. Read the original message from disk
|
||||||
* Ok, prelude done. Read the original message from disk
|
// (through a file URI), and add it to the Inbox.
|
||||||
* (through a file URI), and add it to the Inbox.
|
|
||||||
*/
|
|
||||||
var msgfileuri = Services.io
|
var msgfileuri = Services.io
|
||||||
.newFileURI(gMsgFile)
|
.newFileURI(gMsgFile)
|
||||||
.QueryInterface(Ci.nsIFileURL);
|
.QueryInterface(Ci.nsIFileURL);
|
||||||
|
@ -32,44 +33,41 @@ function* setup() {
|
||||||
IMAPPump.mailbox.addMessage(
|
IMAPPump.mailbox.addMessage(
|
||||||
new imapMessage(msgfileuri.spec, IMAPPump.mailbox.uidnext++, [])
|
new imapMessage(msgfileuri.spec, IMAPPump.mailbox.uidnext++, [])
|
||||||
);
|
);
|
||||||
IMAPPump.inbox.updateFolderWithListener(null, asyncUrlListener);
|
let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
|
||||||
yield false;
|
IMAPPump.inbox.updateFolderWithListener(null, promiseUrlListener);
|
||||||
|
await promiseUrlListener.promise;
|
||||||
|
|
||||||
/*
|
// Save the message to a local file. IMapMD corresponds to
|
||||||
* Save the message to a local file. IMapMD corresponds to
|
// <profile_dir>/mailtest/ImapMail (where fakeserver puts the IMAP mailbox
|
||||||
* <profile_dir>/mailtest/ImapMail (where fakeserver puts the IMAP mailbox
|
// files). If we pass the test, we'll remove the file afterwards
|
||||||
* files). If we pass the test, we'll remove the file afterwards
|
// (cf. UrlListener), otherwise it's kept in IMapMD.
|
||||||
* (cf. UrlListener), otherwise it's kept in IMapMD.
|
|
||||||
*/
|
|
||||||
gSavedMsgFile = Services.dirsvc.get("IMapMD", Ci.nsIFile);
|
gSavedMsgFile = Services.dirsvc.get("IMapMD", Ci.nsIFile);
|
||||||
gSavedMsgFile.append(gFileName + ".eml");
|
gSavedMsgFile.append(gFileName + ".eml");
|
||||||
|
|
||||||
/*
|
// From nsIMsgMessageService.idl:
|
||||||
* From nsIMsgMessageService.idl:
|
// void SaveMessageToDisk(in string aMessageURI, in nsIFile aFile,
|
||||||
* void SaveMessageToDisk(in string aMessageURI, in nsIFile aFile,
|
// in boolean aGenerateDummyEnvelope,
|
||||||
* in boolean aGenerateDummyEnvelope,
|
// in nsIUrlListener aUrlListener, out nsIURI aURL,
|
||||||
* in nsIUrlListener aUrlListener, out nsIURI aURL,
|
// in boolean canonicalLineEnding,
|
||||||
* in boolean canonicalLineEnding,
|
// in nsIMsgWindow aMsgWindow);
|
||||||
* in nsIMsgWindow aMsgWindow);
|
// Enforcing canonicalLineEnding (i.e., CRLF) makes sure that the
|
||||||
* Enforcing canonicalLineEnding (i.e., CRLF) makes sure that the
|
let promiseUrlListener2 = new PromiseTestUtils.PromiseUrlListener();
|
||||||
* test also runs successfully on platforms not using CRLF by default.
|
|
||||||
*/
|
|
||||||
gIMAPService.SaveMessageToDisk(
|
gIMAPService.SaveMessageToDisk(
|
||||||
"imap-message://user@localhost/INBOX#" + (IMAPPump.mailbox.uidnext - 1),
|
"imap-message://user@localhost/INBOX#" + (IMAPPump.mailbox.uidnext - 1),
|
||||||
gSavedMsgFile,
|
gSavedMsgFile,
|
||||||
false,
|
false,
|
||||||
asyncUrlListener,
|
promiseUrlListener2,
|
||||||
{},
|
{},
|
||||||
true,
|
true,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
yield false;
|
await promiseUrlListener2.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkSavedMessage() {
|
async function checkSavedMessage() {
|
||||||
Assert.equal(
|
Assert.equal(
|
||||||
IOUtils.loadFileToString(gMsgFile),
|
await IOUtils.readUTF8(gMsgFile.path),
|
||||||
IOUtils.loadFileToString(gSavedMsgFile)
|
await IOUtils.readUTF8(gSavedMsgFile.path)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,7 +80,3 @@ function teardown() {
|
||||||
}
|
}
|
||||||
teardownIMAPPump();
|
teardownIMAPPump();
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_test() {
|
|
||||||
async_run_tests(tests);
|
|
||||||
}
|
|
||||||
|
|
|
@ -11,11 +11,9 @@
|
||||||
* that are run externally.
|
* that are run externally.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// async support
|
var { PromiseTestUtils } = ChromeUtils.import(
|
||||||
/* import-globals-from ../../../test/resources/logHelper.js */
|
"resource://testing-common/mailnews/PromiseTestUtils.jsm"
|
||||||
/* import-globals-from ../../../test/resources/asyncTestUtils.js */
|
);
|
||||||
load("../../../resources/logHelper.js");
|
|
||||||
load("../../../resources/asyncTestUtils.js");
|
|
||||||
|
|
||||||
var gFile = do_get_file("../../../data/bug92111b");
|
var gFile = do_get_file("../../../data/bug92111b");
|
||||||
var gIMAPDaemon, gIMAPServer, gIMAPIncomingServer;
|
var gIMAPDaemon, gIMAPServer, gIMAPIncomingServer;
|
||||||
|
@ -29,7 +27,7 @@ function addMessageToServer(file, mailbox) {
|
||||||
mailbox.addMessage(msg);
|
mailbox.addMessage(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function verifyContentLength() {
|
||||||
// Disable new mail notifications
|
// Disable new mail notifications
|
||||||
Services.prefs.setBoolPref("mail.biff.play_sound", false);
|
Services.prefs.setBoolPref("mail.biff.play_sound", false);
|
||||||
Services.prefs.setBoolPref("mail.biff.show_alert", false);
|
Services.prefs.setBoolPref("mail.biff.show_alert", false);
|
||||||
|
@ -56,10 +54,6 @@ function run_test() {
|
||||||
// We aren't interested in downloading messages automatically
|
// We aren't interested in downloading messages automatically
|
||||||
Services.prefs.setBoolPref("mail.server.server1.download_on_biff", false);
|
Services.prefs.setBoolPref("mail.server.server1.download_on_biff", false);
|
||||||
|
|
||||||
async_run_tests([verifyContentLength, endTest]);
|
|
||||||
}
|
|
||||||
|
|
||||||
function* verifyContentLength() {
|
|
||||||
dump("adding message to server\n");
|
dump("adding message to server\n");
|
||||||
// Add a message to the IMAP server
|
// Add a message to the IMAP server
|
||||||
addMessageToServer(gFile, gIMAPDaemon.getMailbox("INBOX"));
|
addMessageToServer(gFile, gIMAPDaemon.getMailbox("INBOX"));
|
||||||
|
@ -68,7 +62,6 @@ function* verifyContentLength() {
|
||||||
"@mozilla.org/messenger/messageservice;1?type=imap"
|
"@mozilla.org/messenger/messageservice;1?type=imap"
|
||||||
].getService(Ci.nsIMsgMessageService);
|
].getService(Ci.nsIMsgMessageService);
|
||||||
|
|
||||||
dump("getting uri\n");
|
|
||||||
let uri = imapS.getUrlForUri("imap-message://user@localhost/INBOX#1");
|
let uri = imapS.getUrlForUri("imap-message://user@localhost/INBOX#1");
|
||||||
|
|
||||||
// Get a channel from this URI, and check its content length
|
// Get a channel from this URI, and check its content length
|
||||||
|
@ -81,15 +74,15 @@ function* verifyContentLength() {
|
||||||
Ci.nsIContentPolicy.TYPE_OTHER
|
Ci.nsIContentPolicy.TYPE_OTHER
|
||||||
);
|
);
|
||||||
|
|
||||||
dump(channel + "\n");
|
let promiseStreamListener = new PromiseTestUtils.PromiseStreamListener();
|
||||||
|
|
||||||
// Read all the contents
|
// Read all the contents
|
||||||
channel.asyncOpen(gStreamListener, null);
|
channel.asyncOpen(promiseStreamListener, null);
|
||||||
yield false;
|
let streamData = (await promiseStreamListener.promise).replace(/\r\n/g, "\n");
|
||||||
|
|
||||||
// Now check whether our stream listener got the right bytes
|
// Now check whether our stream listener got the right bytes
|
||||||
// First, clean up line endings to avoid CRLF vs. LF differences
|
// First, clean up line endings to avoid CRLF vs. LF differences
|
||||||
let origData = IOUtils.loadFileToString(gFile).replace(/\r\n/g, "\n");
|
let origData = (await IOUtils.readUTF8(gFile.path)).replace(/\r\n/g, "\n");
|
||||||
let streamData = gStreamListener._data.replace(/\r\n/g, "\n");
|
|
||||||
Assert.equal(origData.length, streamData.length);
|
Assert.equal(origData.length, streamData.length);
|
||||||
Assert.equal(origData, streamData);
|
Assert.equal(origData, streamData);
|
||||||
|
|
||||||
|
@ -106,38 +99,10 @@ function* verifyContentLength() {
|
||||||
// entire message
|
// entire message
|
||||||
// do_check_eq(attachmentChannel.contentLength, gFile.fileSize);
|
// do_check_eq(attachmentChannel.contentLength, gFile.fileSize);
|
||||||
|
|
||||||
yield true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function* endTest() {
|
|
||||||
gIMAPIncomingServer.closeCachedConnections();
|
gIMAPIncomingServer.closeCachedConnections();
|
||||||
gIMAPServer.stop();
|
gIMAPServer.stop();
|
||||||
let thread = gThreadManager.currentThread;
|
let thread = gThreadManager.currentThread;
|
||||||
while (thread.hasPendingEvents()) {
|
while (thread.hasPendingEvents()) {
|
||||||
thread.processNextEvent(true);
|
thread.processNextEvent(true);
|
||||||
}
|
}
|
||||||
|
});
|
||||||
yield true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var gStreamListener = {
|
|
||||||
QueryInterface: ChromeUtils.generateQI(["nsIStreamListener"]),
|
|
||||||
_stream: null,
|
|
||||||
_data: null,
|
|
||||||
onStartRequest(aRequest) {
|
|
||||||
this._data = "";
|
|
||||||
this._stream = null;
|
|
||||||
},
|
|
||||||
onStopRequest(aRequest, aStatusCode) {
|
|
||||||
async_driver();
|
|
||||||
},
|
|
||||||
onDataAvailable(aRequest, aInputStream, aOff, aCount) {
|
|
||||||
if (this._stream == null) {
|
|
||||||
this._stream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(
|
|
||||||
Ci.nsIScriptableInputStream
|
|
||||||
);
|
|
||||||
this._stream.init(aInputStream);
|
|
||||||
}
|
|
||||||
this._data += this._stream.read(aCount);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
/*
|
/**
|
||||||
* Test bug 92111 - imap download-by-chunks doesn't download complete file if the
|
* Test bug 92111 - imap download-by-chunks doesn't download complete file if the
|
||||||
* server lies about rfc822.size (known to happen for Exchange and gmail)
|
* server lies about rfc822.size (known to happen for Exchange and gmail)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
|
|
||||||
var gIMAPDaemon, gServer, gIMAPIncomingServer, gSavedMsgFile;
|
var gIMAPDaemon, gServer, gIMAPIncomingServer, gSavedMsgFile;
|
||||||
|
|
||||||
var gIMAPService = Cc[
|
var gIMAPService = Cc[
|
||||||
|
@ -14,7 +12,7 @@ var gIMAPService = Cc[
|
||||||
var gFileName = "bug92111";
|
var gFileName = "bug92111";
|
||||||
var gMsgFile = do_get_file("../../../data/" + gFileName);
|
var gMsgFile = do_get_file("../../../data/" + gFileName);
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
/*
|
/*
|
||||||
* Set up an IMAP server. The bug is only triggered when nsMsgSaveAsListener
|
* Set up an IMAP server. The bug is only triggered when nsMsgSaveAsListener
|
||||||
* is used (i.e., for IMAP and NNTP).
|
* is used (i.e., for IMAP and NNTP).
|
||||||
|
@ -55,12 +53,10 @@ function run_test() {
|
||||||
message.setSize(gMsgFile.fileSize - 100);
|
message.setSize(gMsgFile.fileSize - 100);
|
||||||
inbox.addMessage(message);
|
inbox.addMessage(message);
|
||||||
|
|
||||||
/*
|
// Save the message to a local file. IMapMD corresponds to
|
||||||
* Save the message to a local file. IMapMD corresponds to
|
// <profile_dir>/mailtest/ImapMail (where fakeserver puts the IMAP mailbox
|
||||||
* <profile_dir>/mailtest/ImapMail (where fakeserver puts the IMAP mailbox
|
// files). If we pass the test, we'll remove the file afterwards
|
||||||
* files). If we pass the test, we'll remove the file afterwards
|
// (cf. UrlListener), otherwise it's kept in IMapMD.
|
||||||
* (cf. UrlListener), otherwise it's kept in IMapMD.
|
|
||||||
*/
|
|
||||||
gSavedMsgFile = Services.dirsvc.get("IMapMD", Ci.nsIFile);
|
gSavedMsgFile = Services.dirsvc.get("IMapMD", Ci.nsIFile);
|
||||||
gSavedMsgFile.append(gFileName + ".eml");
|
gSavedMsgFile.append(gFileName + ".eml");
|
||||||
|
|
||||||
|
@ -72,26 +68,30 @@ function run_test() {
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
// Enforcing canonicalLineEnding (i.e., CRLF) makes sure that the
|
||||||
* From nsIMsgMessageService.idl:
|
// test also runs successfully on platforms not using CRLF by default.
|
||||||
* void SaveMessageToDisk(in string aMessageURI, in nsIFile aFile,
|
let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
|
||||||
* in boolean aGenerateDummyEnvelope,
|
|
||||||
* in nsIUrlListener aUrlListener, out nsIURI aURL,
|
|
||||||
* in boolean canonicalLineEnding,
|
|
||||||
* in nsIMsgWindow aMsgWindow);
|
|
||||||
* Enforcing canonicalLineEnding (i.e., CRLF) makes sure that the
|
|
||||||
* test also runs successfully on platforms not using CRLF by default.
|
|
||||||
*/
|
|
||||||
gIMAPService.SaveMessageToDisk(
|
gIMAPService.SaveMessageToDisk(
|
||||||
"imap-message://user@localhost/INBOX#" + (inbox.uidnext - 1),
|
"imap-message://user@localhost/INBOX#" + (inbox.uidnext - 1),
|
||||||
gSavedMsgFile,
|
gSavedMsgFile,
|
||||||
false,
|
false,
|
||||||
UrlListener,
|
promiseUrlListener,
|
||||||
{},
|
{},
|
||||||
true,
|
true,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
}
|
await promiseUrlListener.promise;
|
||||||
|
|
||||||
|
let msgFileContent = await IOUtils.readUTF8(gMsgFile.path);
|
||||||
|
let savedMsgFileContent = await IOUtils.readUTF8(gSavedMsgFile.path);
|
||||||
|
// File contents should not have been modified.
|
||||||
|
Assert.equal(msgFileContent, savedMsgFileContent);
|
||||||
|
|
||||||
|
// The file doesn't get closed straight away, but does after a little bit.
|
||||||
|
// So wait, and then remove it. We need to test this to ensure we don't
|
||||||
|
// indefinitely lock the file.
|
||||||
|
do_timeout(1000, endTest);
|
||||||
|
});
|
||||||
|
|
||||||
function endTest() {
|
function endTest() {
|
||||||
gIMAPIncomingServer.closeCachedConnections();
|
gIMAPIncomingServer.closeCachedConnections();
|
||||||
|
@ -110,24 +110,5 @@ function endTest() {
|
||||||
do_test_finished();
|
do_test_finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
var UrlListener = {
|
|
||||||
OnStartRunningUrl(url) {},
|
|
||||||
OnStopRunningUrl(url, rc) {
|
|
||||||
// operation succeeded
|
|
||||||
Assert.equal(rc, 0);
|
|
||||||
|
|
||||||
// File contents were not modified
|
|
||||||
Assert.equal(
|
|
||||||
IOUtils.loadFileToString(gMsgFile),
|
|
||||||
IOUtils.loadFileToString(gSavedMsgFile)
|
|
||||||
);
|
|
||||||
|
|
||||||
// The file doesn't get closed straight away, but does after a little bit.
|
|
||||||
// So wait, and then remove it. We need to test this to ensure we don't
|
|
||||||
// indefinitely lock the file.
|
|
||||||
do_timeout(1000, endTest);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
// XXX IRVING we need a separate check somehow to make sure we store the correct
|
// XXX IRVING we need a separate check somehow to make sure we store the correct
|
||||||
// content size for chunked messages where the server lied
|
// content size for chunked messages where the server lied
|
||||||
|
|
|
@ -2,19 +2,21 @@
|
||||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
* 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/. */
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
var { PromiseTestUtils } = ChromeUtils.import(
|
||||||
|
"resource://testing-common/mailnews/PromiseTestUtils.jsm"
|
||||||
|
);
|
||||||
|
|
||||||
var MSG_LINEBREAK = "\r\n";
|
var MSG_LINEBREAK = "\r\n";
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
localAccountUtils.loadLocalMailAccount();
|
localAccountUtils.loadLocalMailAccount();
|
||||||
|
|
||||||
test_parse_headers_without_crash("./data/mailformed_recipients.eml");
|
await test_parse_headers_without_crash("./data/mailformed_recipients.eml");
|
||||||
test_parse_headers_without_crash("./data/mailformed_subject.eml");
|
await test_parse_headers_without_crash("./data/mailformed_subject.eml");
|
||||||
test_parse_headers_without_crash("./data/invalid_mozilla_keys.eml");
|
await test_parse_headers_without_crash("./data/invalid_mozilla_keys.eml");
|
||||||
}
|
});
|
||||||
|
|
||||||
function test_parse_headers_without_crash(eml) {
|
async function test_parse_headers_without_crash(eml) {
|
||||||
let file = do_get_file(eml);
|
let file = do_get_file(eml);
|
||||||
|
|
||||||
let parser = Cc["@mozilla.org/messenger/messagestateparser;1"].createInstance(
|
let parser = Cc["@mozilla.org/messenger/messagestateparser;1"].createInstance(
|
||||||
|
@ -24,7 +26,8 @@ function test_parse_headers_without_crash(eml) {
|
||||||
parser.SetMailDB(localAccountUtils.inboxFolder.getDatabaseWOReparse());
|
parser.SetMailDB(localAccountUtils.inboxFolder.getDatabaseWOReparse());
|
||||||
parser.state = Ci.nsIMsgParseMailMsgState.ParseHeadersState;
|
parser.state = Ci.nsIMsgParseMailMsgState.ParseHeadersState;
|
||||||
|
|
||||||
let mailData = IOUtils.loadFileToString(file);
|
let bytes = await IOUtils.read(file.path);
|
||||||
|
let mailData = new TextDecoder().decode(bytes);
|
||||||
let lines = mailData.split(MSG_LINEBREAK);
|
let lines = mailData.split(MSG_LINEBREAK);
|
||||||
|
|
||||||
for (let line = 0; line < lines.length; line++) {
|
for (let line = 0; line < lines.length; line++) {
|
||||||
|
@ -33,4 +36,7 @@ function test_parse_headers_without_crash(eml) {
|
||||||
lines[line].length + 2
|
lines[line].length + 2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
// Apparently getDatabaseWOReparse doesn't like being called too often
|
||||||
|
// in a row.
|
||||||
|
await PromiseTestUtils.promiseDelay(200);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
/*
|
/**
|
||||||
* Test bug 460636 - Saving message in local folder as .EML removes starting dot in all lines, and ignores line if single dot only line.
|
* Test bug 460636 - Saving message in local folder as .EML removes starting dot in all lines, and ignores line if single dot only line.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
var { PromiseTestUtils } = ChromeUtils.import(
|
||||||
|
"resource://testing-common/mailnews/PromiseTestUtils.jsm"
|
||||||
|
);
|
||||||
|
|
||||||
var MSG_LINEBREAK = "\r\n";
|
var MSG_LINEBREAK = "\r\n";
|
||||||
var dot = do_get_file("data/dot");
|
var dot = do_get_file("data/dot");
|
||||||
|
@ -22,7 +24,7 @@ function run_test() {
|
||||||
copyFileMessageInLocalFolder(dot, 0, "", null, save_message);
|
copyFileMessageInLocalFolder(dot, 0, "", null, save_message);
|
||||||
}
|
}
|
||||||
|
|
||||||
function save_message(aMessageHeaderKeys, aStatus) {
|
async function save_message(aMessageHeaderKeys, aStatus) {
|
||||||
let headerKeys = aMessageHeaderKeys;
|
let headerKeys = aMessageHeaderKeys;
|
||||||
Assert.notEqual(headerKeys, null);
|
Assert.notEqual(headerKeys, null);
|
||||||
|
|
||||||
|
@ -31,15 +33,22 @@ function save_message(aMessageHeaderKeys, aStatus) {
|
||||||
let messageService = Cc[
|
let messageService = Cc[
|
||||||
"@mozilla.org/messenger/messageservice;1?type=mailbox-message"
|
"@mozilla.org/messenger/messageservice;1?type=mailbox-message"
|
||||||
].getService(Ci.nsIMsgMessageService);
|
].getService(Ci.nsIMsgMessageService);
|
||||||
|
let promiseUrlListener = new PromiseTestUtils.PromiseUrlListener();
|
||||||
messageService.SaveMessageToDisk(
|
messageService.SaveMessageToDisk(
|
||||||
msgURI,
|
msgURI,
|
||||||
saveFile,
|
saveFile,
|
||||||
false,
|
false,
|
||||||
UrlListener,
|
promiseUrlListener,
|
||||||
{},
|
{},
|
||||||
true,
|
true,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
await promiseUrlListener.promise;
|
||||||
|
check_each_line(
|
||||||
|
await IOUtils.readUTF8(dot.path),
|
||||||
|
await IOUtils.readUTF8(saveFile.path)
|
||||||
|
);
|
||||||
|
do_test_finished();
|
||||||
}
|
}
|
||||||
|
|
||||||
function check_each_line(aExpectedLines, aActualLines) {
|
function check_each_line(aExpectedLines, aActualLines) {
|
||||||
|
@ -53,18 +62,6 @@ function check_each_line(aExpectedLines, aActualLines) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var UrlListener = {
|
|
||||||
OnStartRunningUrl(aUrl) {},
|
|
||||||
OnStopRunningUrl(aUrl, aExitCode) {
|
|
||||||
Assert.equal(aExitCode, 0);
|
|
||||||
check_each_line(
|
|
||||||
IOUtils.loadFileToString(dot),
|
|
||||||
IOUtils.loadFileToString(saveFile)
|
|
||||||
);
|
|
||||||
do_test_finished();
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
function teardown() {
|
function teardown() {
|
||||||
if (saveFile.exists()) {
|
if (saveFile.exists()) {
|
||||||
saveFile.remove(false);
|
saveFile.remove(false);
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
const { localAccountUtils } = ChromeUtils.import(
|
const { localAccountUtils } = ChromeUtils.import(
|
||||||
"resource://testing-common/mailnews/LocalAccountUtils.jsm"
|
"resource://testing-common/mailnews/LocalAccountUtils.jsm"
|
||||||
);
|
);
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
|
|
||||||
var gTestFiles = ["../../../data/bug505221", "../../../data/bug513543"];
|
var gTestFiles = ["../../../data/bug505221", "../../../data/bug513543"];
|
||||||
|
|
||||||
|
@ -26,19 +25,19 @@ var gUrlListener = {
|
||||||
|
|
||||||
localAccountUtils.loadLocalMailAccount();
|
localAccountUtils.loadLocalMailAccount();
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function run_the_test() {
|
||||||
do_test_pending();
|
do_test_pending();
|
||||||
localAccountUtils.inboxFolder.QueryInterface(Ci.nsIMsgLocalMailFolder);
|
localAccountUtils.inboxFolder.QueryInterface(Ci.nsIMsgLocalMailFolder);
|
||||||
for (let fileName of gTestFiles) {
|
for (let fileName of gTestFiles) {
|
||||||
localAccountUtils.inboxFolder.addMessage(
|
localAccountUtils.inboxFolder.addMessage(
|
||||||
IOUtils.loadFileToString(do_get_file(fileName))
|
await IOUtils.readUTF8(do_get_file(fileName).path)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
gMessages = [
|
gMessages = [
|
||||||
...localAccountUtils.inboxFolder.msgDatabase.EnumerateMessages(),
|
...localAccountUtils.inboxFolder.msgDatabase.EnumerateMessages(),
|
||||||
];
|
];
|
||||||
doNextTest();
|
doNextTest();
|
||||||
}
|
});
|
||||||
|
|
||||||
function streamMsg(msgHdr) {
|
function streamMsg(msgHdr) {
|
||||||
let msgURI = localAccountUtils.inboxFolder.getUriForMsg(msgHdr);
|
let msgURI = localAccountUtils.inboxFolder.getUriForMsg(msgHdr);
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
// HeaderParser methods are run correctly.
|
// HeaderParser methods are run correctly.
|
||||||
|
|
||||||
const { MimeParser } = ChromeUtils.import("resource:///modules/mimeParser.jsm");
|
const { MimeParser } = ChromeUtils.import("resource:///modules/mimeParser.jsm");
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
|
|
||||||
// Utility method to compare objects
|
// Utility method to compare objects
|
||||||
function compare_objects(real, expected) {
|
function compare_objects(real, expected) {
|
||||||
|
@ -46,10 +45,12 @@ var file_cache = {};
|
||||||
/**
|
/**
|
||||||
* Read a file into a string (all line endings become CRLF).
|
* Read a file into a string (all line endings become CRLF).
|
||||||
*/
|
*/
|
||||||
function read_file(file, start, end) {
|
async function read_file(file, start, end) {
|
||||||
if (!(file in file_cache)) {
|
if (!(file in file_cache)) {
|
||||||
var realFile = do_get_file("../../../data/" + file);
|
var realFile = do_get_file("../../../data/" + file);
|
||||||
file_cache[file] = IOUtils.loadFileToString(realFile).split(/\r\n|[\r\n]/);
|
file_cache[file] = (await IOUtils.readUTF8(realFile.path)).split(
|
||||||
|
/\r\n|[\r\n]/
|
||||||
|
);
|
||||||
}
|
}
|
||||||
var contents = file_cache[file];
|
var contents = file_cache[file];
|
||||||
if (start !== undefined) {
|
if (start !== undefined) {
|
||||||
|
@ -76,12 +77,21 @@ function read_file(file, start, end) {
|
||||||
* accumulated body part data for partnum would be the contents
|
* accumulated body part data for partnum would be the contents
|
||||||
* of the file from [line start, line end) [1-based lines]
|
* of the file from [line start, line end) [1-based lines]
|
||||||
*/
|
*/
|
||||||
function make_body_test(test, file, opts, partspec) {
|
async function make_body_test(test, file, opts, partspec) {
|
||||||
var results = partspec.map(p => [p[0], read_file(file, p[1], p[2])]);
|
let results = [];
|
||||||
var msgcontents = read_file(file);
|
for (let p of partspec) {
|
||||||
|
results.push([p[0], await read_file(file, p[1], p[2])]);
|
||||||
|
}
|
||||||
|
|
||||||
|
let msgcontents = await read_file(file);
|
||||||
return [test, msgcontents, opts, results];
|
return [test, msgcontents, opts, results];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function make_bodydecode_test(test, file, opts, expected) {
|
||||||
|
let msgcontents = await read_file(file);
|
||||||
|
return [test, msgcontents, opts, expected];
|
||||||
|
}
|
||||||
|
|
||||||
// This is the expected part specifier for the multipart-complex1 test file,
|
// This is the expected part specifier for the multipart-complex1 test file,
|
||||||
// specified here because it is used in several cases.
|
// specified here because it is used in several cases.
|
||||||
var mpart_complex1 = [
|
var mpart_complex1 = [
|
||||||
|
@ -100,8 +110,8 @@ var mpart_complex1 = [
|
||||||
// either a {partnum: header object} (to check headers)
|
// either a {partnum: header object} (to check headers)
|
||||||
// or a [[partnum body], [partnum body], ...] (to check bodies)
|
// or a [[partnum body], [partnum body], ...] (to check bodies)
|
||||||
// (the partnums refer to the expected part numbers of the MIME test)
|
// (the partnums refer to the expected part numbers of the MIME test)
|
||||||
// Note that for body tests, unless you're testing decoding, it is preferable to
|
// For body tests, unless you're testing decoding, use make_body_test.
|
||||||
// use make_body_test instead of writing the array yourself.
|
// For decoding tests, use make_bodydecode_test
|
||||||
var parser_tests = [
|
var parser_tests = [
|
||||||
// Body tests from data
|
// Body tests from data
|
||||||
// (Note: line numbers are 1-based. Also, to capture trailing EOF, add 2 to
|
// (Note: line numbers are 1-based. Also, to capture trailing EOF, add 2 to
|
||||||
|
@ -124,9 +134,9 @@ var parser_tests = [
|
||||||
make_body_test("Raw body", "multipart1", { bodyformat: "raw" }, [
|
make_body_test("Raw body", "multipart1", { bodyformat: "raw" }, [
|
||||||
["", 4, 14],
|
["", 4, 14],
|
||||||
]),
|
]),
|
||||||
[
|
make_bodydecode_test(
|
||||||
"Base64 decode 1",
|
"Base64 decode 1",
|
||||||
read_file("base64-1"),
|
"base64-1",
|
||||||
{ bodyformat: "decode" },
|
{ bodyformat: "decode" },
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
|
@ -136,11 +146,11 @@ var parser_tests = [
|
||||||
"'s even a CRLF at the end and one at the beginning, but the output" +
|
"'s even a CRLF at the end and one at the beginning, but the output" +
|
||||||
" shouldn't have it.\r\n",
|
" shouldn't have it.\r\n",
|
||||||
],
|
],
|
||||||
],
|
]
|
||||||
],
|
),
|
||||||
[
|
make_bodydecode_test(
|
||||||
"Base64 decode 2",
|
"Base64 decode 2",
|
||||||
read_file("base64-2"),
|
"base64-2",
|
||||||
{ bodyformat: "decode" },
|
{ bodyformat: "decode" },
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
|
@ -148,12 +158,12 @@ var parser_tests = [
|
||||||
"<html><body>This is base64 encoded HTML text, and the tags shouldn" +
|
"<html><body>This is base64 encoded HTML text, and the tags shouldn" +
|
||||||
"'t be stripped.\r\n<b>Bold text is bold!</b></body></html>\r\n",
|
"'t be stripped.\r\n<b>Bold text is bold!</b></body></html>\r\n",
|
||||||
],
|
],
|
||||||
],
|
]
|
||||||
],
|
),
|
||||||
make_body_test("Base64 nodecode", "base64-1", {}, [["", 4, 9]]),
|
make_body_test("Base64 nodecode", "base64-1", {}, [["", 4, 9]]),
|
||||||
[
|
make_bodydecode_test(
|
||||||
"QP decode",
|
"QP decode",
|
||||||
read_file("bug505221"),
|
"bug505221",
|
||||||
{ pruneat: "1", bodyformat: "decode" },
|
{ pruneat: "1", bodyformat: "decode" },
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
|
@ -163,8 +173,8 @@ var parser_tests = [
|
||||||
'tml; charset=us-ascii">\r\n\r\n\r\n<META content="MSHTML 6.00.600' +
|
'tml; charset=us-ascii">\r\n\r\n\r\n<META content="MSHTML 6.00.600' +
|
||||||
'0.16735" name=GENERATOR></HEAD>\r\n<BODY> bbb\r\n</BODY></HTML>',
|
'0.16735" name=GENERATOR></HEAD>\r\n<BODY> bbb\r\n</BODY></HTML>',
|
||||||
],
|
],
|
||||||
],
|
]
|
||||||
],
|
),
|
||||||
|
|
||||||
// Comprehensive tests from the torture test
|
// Comprehensive tests from the torture test
|
||||||
make_body_test("Torture regular body", "mime-torture", {}, [
|
make_body_test("Torture regular body", "mime-torture", {}, [
|
||||||
|
@ -212,12 +222,12 @@ function test_parser(message, opts, results) {
|
||||||
var emitter = {
|
var emitter = {
|
||||||
stack: [],
|
stack: [],
|
||||||
startMessage: function emitter_startMsg() {
|
startMessage: function emitter_startMsg() {
|
||||||
Assert.equal(this.stack.length, 0);
|
Assert.equal(this.stack.length, 0, "no stack at start");
|
||||||
calls++;
|
calls++;
|
||||||
this.partData = "";
|
this.partData = "";
|
||||||
},
|
},
|
||||||
endMessage: function emitter_endMsg() {
|
endMessage: function emitter_endMsg() {
|
||||||
Assert.equal(this.stack.length, 0);
|
Assert.equal(this.stack.length, 0, "no stack at end");
|
||||||
calls++;
|
calls++;
|
||||||
},
|
},
|
||||||
startPart: function emitter_startPart(partNum, headers) {
|
startPart: function emitter_startPart(partNum, headers) {
|
||||||
|
@ -294,8 +304,9 @@ function test_header(headerValue, flags, expected) {
|
||||||
compare_objects(result, expected[1]);
|
compare_objects(result, expected[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function run_test() {
|
add_task(async function testit() {
|
||||||
for (let test of parser_tests) {
|
for (let test of parser_tests) {
|
||||||
|
test = await test;
|
||||||
dump("Testing message " + test[0]);
|
dump("Testing message " + test[0]);
|
||||||
if (test[1] instanceof Array) {
|
if (test[1] instanceof Array) {
|
||||||
dump(" using " + test[1].length + " packets");
|
dump(" using " + test[1].length + " packets");
|
||||||
|
@ -307,4 +318,4 @@ function run_test() {
|
||||||
dump("Testing value ->" + test[0] + "<- with flags " + test[1] + "\n");
|
dump("Testing value ->" + test[0] + "<- with flags " + test[1] + "\n");
|
||||||
test_header(test[0], test[1], test[2]);
|
test_header(test[0], test[1], test[2]);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
|
|
|
@ -14,10 +14,12 @@ var EXPORTED_SYMBOLS = [
|
||||||
];
|
];
|
||||||
|
|
||||||
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
var { AuthPLAIN, AuthLOGIN, AuthCRAM } = ChromeUtils.import(
|
var { AuthPLAIN, AuthLOGIN, AuthCRAM } = ChromeUtils.import(
|
||||||
"resource://testing-common/mailnews/Auth.jsm"
|
"resource://testing-common/mailnews/Auth.jsm"
|
||||||
);
|
);
|
||||||
|
var { mailTestUtils } = ChromeUtils.import(
|
||||||
|
"resource://testing-common/mailnews/MailTestUtils.jsm"
|
||||||
|
);
|
||||||
|
|
||||||
// Since we don't really need to worry about peristence, we can just
|
// Since we don't really need to worry about peristence, we can just
|
||||||
// use a UIDL counter.
|
// use a UIDL counter.
|
||||||
|
@ -64,7 +66,7 @@ function readFile(fileName) {
|
||||||
throw new Error("Cannot find file named " + fileName);
|
throw new Error("Cannot find file named " + fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
return IOUtils.loadFileToString(file);
|
return mailTestUtils.loadFileToString(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
function pop3Daemon(flags) {
|
function pop3Daemon(flags) {
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
||||||
var { IOUtils } = ChromeUtils.import("resource:///modules/IOUtils.jsm");
|
|
||||||
// eslint-disable-next-line mozilla/reject-importGlobalProperties
|
// eslint-disable-next-line mozilla/reject-importGlobalProperties
|
||||||
Cu.importGlobalProperties(["Element", "Node"]);
|
Cu.importGlobalProperties(["Element", "Node"]);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче