summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/compose/content
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/compose/content')
-rw-r--r--comm/mailnews/compose/content/sendProgress.js174
-rw-r--r--comm/mailnews/compose/content/sendProgress.xhtml65
2 files changed, 239 insertions, 0 deletions
diff --git a/comm/mailnews/compose/content/sendProgress.js b/comm/mailnews/compose/content/sendProgress.js
new file mode 100644
index 0000000000..fbc05451a7
--- /dev/null
+++ b/comm/mailnews/compose/content/sendProgress.js
@@ -0,0 +1,174 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* 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/. */
+
+// dialog is just an array we'll use to store various properties from the dialog document...
+var dialog;
+
+// the msgProgress is a nsIMsgProgress object
+var msgProgress = null;
+
+// random global variables...
+var itsASaveOperation = false;
+var gBundle;
+
+window.addEventListener("DOMContentLoaded", onLoad);
+window.addEventListener("unload", onUnload);
+document.addEventListener("dialogcancel", onCancel);
+
+// all progress notifications are done through the nsIWebProgressListener implementation...
+var progressListener = {
+ onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
+ if (aStateFlags & Ci.nsIWebProgressListener.STATE_START) {
+ // Set progress meter to show indeterminate.
+ dialog.progress.removeAttribute("value");
+ dialog.progressText.value = "";
+ }
+
+ if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP) {
+ if (Components.isSuccessCode(aStatus)) {
+ // we are done sending/saving the message...
+ // Indicate completion in status area.
+ let msg;
+ if (itsASaveOperation) {
+ msg = gBundle.GetStringFromName("messageSaved");
+ } else {
+ msg = gBundle.GetStringFromName("messageSent");
+ }
+ dialog.status.setAttribute("value", msg);
+
+ // Put progress meter at 100%.
+ dialog.progress.setAttribute("value", 100);
+ dialog.progressText.setAttribute(
+ "value",
+ gBundle.formatStringFromName("percentMsg", [100])
+ );
+ }
+
+ // Note: Without some delay closing the window the "msg" string above may
+ // never be visible. Example: setTimeout(() => window.close(), 1000);
+ // Windows requires other delays. The delays also cause test failures.
+ window.close();
+ }
+ },
+
+ onProgressChange(
+ aWebProgress,
+ aRequest,
+ aCurSelfProgress,
+ aMaxSelfProgress,
+ aCurTotalProgress,
+ aMaxTotalProgress
+ ) {
+ // Calculate percentage.
+ var percent;
+ if (aMaxTotalProgress > 0) {
+ percent = Math.round((aCurTotalProgress / aMaxTotalProgress) * 100);
+ if (percent > 100) {
+ percent = 100;
+ }
+
+ // Advance progress meter.
+ dialog.progress.value = percent;
+
+ // Update percentage label on progress meter.
+ dialog.progressText.value = gBundle.formatStringFromName("percentMsg", [
+ percent,
+ ]);
+ } else {
+ // Have progress meter show indeterminate with denominator <= 0.
+ dialog.progress.removeAttribute("value");
+ dialog.progressText.value = "";
+ }
+ },
+
+ onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
+ // we can ignore this notification
+ },
+
+ onStatusChange(aWebProgress, aRequest, aStatus, aMessage) {
+ if (aMessage != "") {
+ dialog.status.setAttribute("value", aMessage);
+ }
+ },
+
+ onSecurityChange(aWebProgress, aRequest, state) {
+ // we can ignore this notification
+ },
+
+ onContentBlockingEvent(aWebProgress, aRequest, aEvent) {
+ // we can ignore this notification
+ },
+
+ QueryInterface: ChromeUtils.generateQI([
+ "nsIWebProgressListener",
+ "nsISupportsWeakReference",
+ ]),
+};
+
+function onLoad() {
+ // Set global variables.
+ gBundle = Services.strings.createBundle(
+ "chrome://messenger/locale/messengercompose/sendProgress.properties"
+ );
+
+ msgProgress = window.arguments[0];
+ if (!msgProgress) {
+ console.error("Invalid argument to sendProgress.xhtml.");
+ window.close();
+ return;
+ }
+
+ let subject = "";
+ if (window.arguments[1]) {
+ let progressParams = window.arguments[1].QueryInterface(
+ Ci.nsIMsgComposeProgressParams
+ );
+ if (progressParams) {
+ itsASaveOperation =
+ progressParams.deliveryMode != Ci.nsIMsgCompDeliverMode.Now;
+ subject = progressParams.subject;
+ }
+ }
+
+ if (subject) {
+ let title = itsASaveOperation
+ ? "titleSaveMsgSubject"
+ : "titleSendMsgSubject";
+ document.title = gBundle.formatStringFromName(title, [subject]);
+ } else {
+ let title = itsASaveOperation ? "titleSaveMsg" : "titleSendMsg";
+ document.title = gBundle.GetStringFromName(title);
+ }
+
+ dialog = {};
+ dialog.status = document.getElementById("dialog.status");
+ dialog.progress = document.getElementById("dialog.progress");
+ dialog.progressText = document.getElementById("dialog.progressText");
+
+ // set our web progress listener on the helper app launcher
+ msgProgress.registerListener(progressListener);
+}
+
+function onUnload() {
+ if (msgProgress) {
+ try {
+ msgProgress.unregisterListener(progressListener);
+ msgProgress = null;
+ } catch (e) {}
+ }
+}
+
+// If the user presses cancel, tell the app launcher and close the dialog...
+function onCancel(event) {
+ // Cancel app launcher.
+ try {
+ msgProgress.processCanceledByUser = true;
+ } catch (e) {
+ return;
+ }
+
+ // Don't close up dialog, the backend will close the dialog when everything will be aborted.
+ event.preventDefault();
+}
diff --git a/comm/mailnews/compose/content/sendProgress.xhtml b/comm/mailnews/compose/content/sendProgress.xhtml
new file mode 100644
index 0000000000..cf46d0c8cc
--- /dev/null
+++ b/comm/mailnews/compose/content/sendProgress.xhtml
@@ -0,0 +1,65 @@
+<?xml version="1.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/. -->
+
+<?xml-stylesheet href="chrome://messenger/skin/messenger.css" type="text/css"?>
+<?xml-stylesheet href="chrome://messenger/skin/colors.css" type="text/css"?>
+<?xml-stylesheet href="chrome://messenger/skin/themeableDialog.css" type="text/css"?>
+
+<!DOCTYPE html SYSTEM "chrome://messenger/locale/messengercompose/sendProgress.dtd">
+<html
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ style="min-width: 56ch; min-height: 8em"
+ lightweightthemes="true"
+ scrolling="false"
+>
+ <head>
+ <title>&sendDialog.title;</title>
+ <link rel="localization" href="branding/brand.ftl" />
+ <script
+ defer="defer"
+ src="chrome://messenger/content/dialogShadowDom.js"
+ ></script>
+ <script
+ defer="defer"
+ src="chrome://messenger/content/messengercompose/sendProgress.js"
+ ></script>
+ </head>
+ <html:body
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ >
+ <dialog id="sendProgress" buttons="cancel">
+ <hbox flex="1">
+ <vbox align="end">
+ <hbox flex="1" align="center">
+ <label value="&status.label;" />
+ </hbox>
+ <hbox flex="1" align="center">
+ <label value="&progress.label;" />
+ </hbox>
+ </vbox>
+ <vbox flex="1">
+ <hbox flex="1" align="center">
+ <label id="dialog.status" crop="center" />
+ </hbox>
+ <hbox
+ class="thin-separator"
+ flex="1"
+ style="display: flex; align-items: center"
+ >
+ <html:progress
+ id="dialog.progress"
+ value="0"
+ max="100"
+ style="flex: 1"
+ />
+ <label id="dialog.progressText" value="" />
+ </hbox>
+ </vbox>
+ </hbox>
+ </dialog>
+ </html:body>
+</html>