diff options
Diffstat (limited to '')
-rw-r--r-- | comm/mailnews/base/content/newmailalert.js | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/comm/mailnews/base/content/newmailalert.js b/comm/mailnews/base/content/newmailalert.js new file mode 100644 index 0000000000..898c8d6724 --- /dev/null +++ b/comm/mailnews/base/content/newmailalert.js @@ -0,0 +1,109 @@ +/* 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/. */ + +var { PluralForm } = ChromeUtils.importESModule( + "resource://gre/modules/PluralForm.sys.mjs" +); + +var gAlertListener = null; + +// NOTE: We must wait until "load" instead of "DOMContentLoaded" because +// otherwise the window height and width is not set in time for +// window.moveTo. +window.addEventListener("load", onAlertLoad); + +function prefillAlertInfo() { + // unwrap all the args.... + // arguments[0] --> The real nsIMsgFolder with new mail. + // arguments[1] --> The keys of new messages. + // arguments[2] --> The nsIObserver to receive window closed event. + let [folder, newMsgKeys, listener] = window.arguments; + newMsgKeys = newMsgKeys.wrappedJSObject; + gAlertListener = listener.QueryInterface(Ci.nsIObserver); + + // Generate an account label string based on the root folder. + var label = document.getElementById("alertTitle"); + var totalNumNewMessages = newMsgKeys.length; + let message = document + .getElementById("bundle_messenger") + .getString("newMailAlert_message"); + label.value = PluralForm.get(totalNumNewMessages, message) + .replace("#1", folder.server.rootFolder.prettyName) + .replace("#2", totalNumNewMessages); + + // <folder-summary> handles rendering of new messages. + var folderSummaryInfoEl = document.getElementById("folderSummaryInfo"); + folderSummaryInfoEl.maxMsgHdrsInPopup = 6; + folderSummaryInfoEl.render(folder, newMsgKeys); +} + +function onAlertLoad() { + let dragSession = Cc["@mozilla.org/widget/dragservice;1"] + .getService(Ci.nsIDragService) + .getCurrentSession(); + if (dragSession && dragSession.sourceNode) { + // If a drag session is active, adjusting this window's dimensions causes + // the drag session to be abruptly terminated. To avoid interrupting the + // user, wait until the drag is finished and then set up and show the alert. + dragSession.sourceNode.addEventListener("dragend", () => doOnAlertLoad()); + } else { + doOnAlertLoad(); + } +} + +function doOnAlertLoad() { + prefillAlertInfo(); + + if (!document.getElementById("folderSummaryInfo").hasMessages()) { + closeAlert(); // no mail, so don't bother showing the alert... + return; + } + + // resize the alert based on our current content + let alertTextBox = document.getElementById("alertTextBox"); + let alertImageBox = document.getElementById("alertImageBox"); + alertImageBox.style.minHeight = alertTextBox.scrollHeight + "px"; + + // Show in bottom right, offset by 10px. + // We wait one cycle until the window has resized. + setTimeout(() => { + let x = screen.availLeft + screen.availWidth - window.outerWidth - 10; + let y = screen.availTop + screen.availHeight - window.outerHeight - 10; + window.moveTo(x, y); + }); + + let openTime = Services.prefs.getIntPref("alerts.totalOpenTime"); + var alertContainer = document.getElementById("alertContainer"); + // Don't fade in if the prefers-reduced-motion is true. + if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) { + alertContainer.setAttribute("noanimation", true); + setTimeout(closeAlert, openTime); + return; + } + + alertContainer.addEventListener("animationend", function hideAlert(event) { + if (event.animationName == "fade-in") { + alertContainer.removeEventListener("animationend", hideAlert); + setTimeout(fadeOutAlert, openTime); + } + }); + + alertContainer.setAttribute("fade-in", true); +} + +function fadeOutAlert() { + var alertContainer = document.getElementById("alertContainer"); + alertContainer.addEventListener("animationend", function fadeOut(event) { + if (event.animationName == "fade-out") { + alertContainer.removeEventListener("animationend", fadeOut); + closeAlert(); + } + }); + alertContainer.setAttribute("fade-out", true); +} + +function closeAlert() { + window.close(); + gAlertListener.observe(null, "newmailalert-closed", ""); +} |