From 72e24b7a632b7f713082d9100176064814cf2f61 Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Mon, 28 Jan 2013 14:27:27 -0500
Subject: [PATCH] Catch connection timeouts on message sending form submissions

---
 program/js/app.js |   18 +++++++++++++++++-
 1 files changed, 17 insertions(+), 1 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index c2456ac..6d5bdfe 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3119,6 +3119,13 @@
     form._draft.value = draft ? '1' : '';
     form.action = this.add_url(form.action, '_unlock', msgid);
     form.action = this.add_url(form.action, '_lang', lang);
+
+    // register timer to notify about connection timeout
+    this.submit_timer = setTimeout(function(){
+      ref.set_busy(false, null, msgid);
+      ref.display_message(ref.get_label('requesttimedout'), 'error');
+    }, this.env.request_timeout * 1000);
+
     form.submit();
   };
 
@@ -6345,7 +6352,7 @@
 
     // redirect to url specified in location header if not empty
     var location_url = request.getResponseHeader("Location");
-    if (location_url)
+    if (location_url && this.env.action != 'compose')  // don't redirect on compose screen, contents might get lost (#1488926)
       this.redirect(location_url);
 
     // re-send keep-alive requests after 30 seconds
@@ -6353,6 +6360,15 @@
       setTimeout(function(){ ref.keep_alive(); ref.start_keepalive(); }, 30000);
   };
 
+  // callback when an iframe finished loading
+  this.iframe_loaded = function(unlock)
+  {
+    this.set_busy(false, null, unlock);
+
+    if (this.submit_timer)
+      clearTimeout(this.submit_timer);
+  };
+
   // post the given form to a hidden iframe
   this.async_upload_form = function(form, action, onload)
   {

--
Gitblit v1.9.1