зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
8c5df94781
Коммит
b2e49e5c66
|
@ -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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче