summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/base/content/newmailalert.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/base/content/newmailalert.js')
-rw-r--r--comm/mailnews/base/content/newmailalert.js109
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", "");
+}