summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/compose/content/sendProgress.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/compose/content/sendProgress.js')
-rw-r--r--comm/mailnews/compose/content/sendProgress.js174
1 files changed, 174 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();
+}