Bug #312940 --> more work for the new alert notification service

Delay the new mail alert animation until after all of our asynchronous fetch
preview text urls have completed loading for imap.
This commit is contained in:
scott%scott-macgregor.org 2005-11-24 02:43:27 +00:00
Родитель 8c5df94781
Коммит b2e49e5c66
3 изменённых файлов: 71 добавлений и 10 удалений

Просмотреть файл

@ -42,6 +42,7 @@ var gSlideTime = 10;
var gOpenTime = 3000; // total time the alert should stay up once we are done animating.
var gAlertCookie = "";
var gAlertListener = null;
var gPendingPreviewFetchRequests = 0;
function prefillAlertInfo()
{
@ -72,8 +73,40 @@ function prefillAlertInfo()
{
var folder = allFolders.GetElementAt(folderIndex).QueryInterface(Components.interfaces.nsIMsgFolder);
if (folder.hasNewMessages)
folderSummaryInfoEl.parseFolder(folder);
{
var asyncFetch = {};
folderSummaryInfoEl.parseFolder(folder, new urlListener(folder), asyncFetch);
if (asyncFetch.value)
gPendingPreviewFetchRequests++;
}
}
}
function urlListener(aFolder)
{
this.mFolder = aFolder;
}
urlListener.prototype = {
OnStartRunningUrl: function(aUrl)
{
},
OnStopRunningUrl: function(aUrl, aExitCode)
{
var folderSummaryInfoEl = document.getElementById('folderSummaryInfo');
var asyncFetch = {};
folderSummaryInfoEl.parseFolder(this.mFolder, null, asyncFetch);
gPendingPreviewFetchRequests--;
// when we are done running all of our urls for fetching the preview text,
// start the alert.
if (!gPendingPreviewFetchRequests)
{
resizeAlert();
setTimeout(animateAlert, gSlideTime);
}
},
}
function onAlertLoad()
@ -89,16 +122,22 @@ function onAlertLoad()
gOpenTime = prefBranch.getIntPref("alerts.totalOpenTime");
} catch (ex) {}
resizeAlert();
// if we aren't waiting to fetch preview text, then go ahead and
// start showing the alert.
if (!gPendingPreviewFetchRequests)
setTimeout(animateAlert, gSlideTime);
}
function resizeAlert()
{
sizeToContent();
gFinalHeight = window.outerHeight;
window.outerHeight = 1;
// be sure to offset the alert by 10 pixels from the far right edge of the screen
window.moveTo( (screen.availLeft + screen.availWidth - window.outerWidth) - 10, screen.availTop + screen.availHeight - window.outerHeight);
setTimeout(animateAlert, gSlideTime);
}
function animateAlert()

Просмотреть файл

@ -2004,7 +2004,8 @@
var msgFolder = GetFolderResource(folderTree, row).QueryInterface(Components.interfaces.nsIMsgFolder);
if (!msgFolder || msgFolder.isServer)
return false;
return document.getAnonymousNodes(this)[0].parseFolder(msgFolder);
var asyncResults = {};
return document.getAnonymousNodes(this)[0].parseFolder(msgFolder, null, asyncResults);
]]>
</handler>
@ -2023,6 +2024,8 @@
<field name="mMaxMsgHdrsInPopup">8</field>
<method name="parseFolder">
<parameter name="aFolder"/>
<parameter name="aUrlListener"/>
<parameter name="aOutAsync"/>
<body>
<![CDATA[
// from nsMsgFolderFlags.h
@ -2044,10 +2047,8 @@
// fetchMsgPreviewText forces the previewText property to get generated
// for each of the message keys.
var asyncResults = {};
try {
aFolder.fetchMsgPreviewText(msgKeys.value, numMsgKeys.value, false, null, asyncResults);
aFolder.fetchMsgPreviewText(msgKeys.value, numMsgKeys.value, false, aUrlListener, aOutAsync);
aFolder.setMsgDatabase(null);
}
catch (ex)
@ -2058,6 +2059,12 @@
return false;
}
// if fetching the preview text is going to be an asynch operation and the caller
// is set up to handle that fact, then don't bother filling in any of the fields since
// we'll have to do this all over again when the fetch for the preview text completes.
if (aOutAsync.value && aUrlListener)
return false;
var index = 0;
var hdrParser = Components.classes["@mozilla.org/messenger/headerparser;1"].getService(Components.interfaces.nsIMsgHeaderParser);
while (document.getAnonymousNodes(this)[0].childNodes.length < this.mMaxMsgHdrsInPopup && index < numMsgKeys.value)

Просмотреть файл

@ -690,6 +690,20 @@ nsresult nsImapMailFolder::GetDatabase(nsIMsgWindow *aMsgWindow)
if(mDatabase)
{
PRBool hasNewMessages = PR_FALSE;
for (PRUint32 keyIndex = 0; keyIndex < m_newMsgs.GetSize(); keyIndex++)
{
PRBool isRead = PR_FALSE;
mDatabase->IsRead(m_newMsgs[keyIndex], &isRead);
if (!isRead)
{
hasNewMessages = PR_TRUE;
mDatabase->AddToNewList(m_newMsgs[keyIndex]);
}
}
SetHasNewMessages(hasNewMessages);
if(mAddListener)
mDatabase->AddListener(this);
UpdateSummaryTotals(PR_TRUE);
@ -8392,7 +8406,7 @@ NS_IMETHODIMP nsImapMailFolder::FetchMsgPreviewText(nsMsgKey *aKeysToFetch, PRUi
nsCOMPtr <nsICacheEntryDescriptor> cacheEntry;
// if mem cache entry is broken or empty, go to next message.
rv = cacheSession->OpenCacheEntry(cacheKey, nsICache::ACCESS_READ, PR_TRUE, getter_AddRefs(cacheEntry));
rv = cacheSession->OpenCacheEntry(cacheKey, nsICache::ACCESS_READ, PR_FALSE, getter_AddRefs(cacheEntry));
if (cacheEntry)
{
rv = cacheEntry->OpenInputStream(0, getter_AddRefs(inputStream));
@ -8434,6 +8448,7 @@ NS_IMETHODIMP nsImapMailFolder::FetchMsgPreviewText(nsMsgKey *aKeysToFetch, PRUi
nsnull, messageIds);
rv = imapService->GetBodyStart(m_eventQueue, this, aUrlListener,
messageIds.get(), 2048, nsnull);
*aAsyncResults = PR_TRUE; // the preview text will be available async...
}
return NS_OK;
}