diff options
Diffstat (limited to 'comm/mailnews/compose/content')
-rw-r--r-- | comm/mailnews/compose/content/sendProgress.js | 174 | ||||
-rw-r--r-- | comm/mailnews/compose/content/sendProgress.xhtml | 65 |
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> |