summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/js/js.js20
-rw-r--r--core/js/tests/specs/coreSpec.js11
2 files changed, 29 insertions, 2 deletions
diff --git a/core/js/js.js b/core/js/js.js
index 67487ec979c..4b09cc49038 100644
--- a/core/js/js.js
+++ b/core/js/js.js
@@ -730,6 +730,17 @@ var OC={
},
/**
+ * Warn users that the connection to the server was lost temporarily
+ *
+ * This function is throttled to prevent stacked notfications.
+ * After 7sec the first notification is gone, then we can show another one
+ * if necessary.
+ */
+ _ajaxConnectionLostHandler: _.throttle(function() {
+ OC.Notification.showTemporary(t('core', 'Connection to server lost'));
+ }, 7 * 1000, {trailing: false}),
+
+ /**
* Process ajax error, redirects to main page
* if an error/auth error status was returned.
*/
@@ -742,7 +753,7 @@ var OC={
return;
}
- if (_.contains([0, 302, 303, 307, 401], xhr.status)) {
+ if (_.contains([302, 303, 307, 401], xhr.status)) {
// sometimes "beforeunload" happens later, so need to defer the reload a bit
setTimeout(function() {
if (!self._userIsNavigatingAway && !self._reloadCalled) {
@@ -752,6 +763,13 @@ var OC={
self._reloadCalled = true;
}
}, 100);
+ } else if(xhr.status === 0) {
+ // Connection lost (e.g. WiFi disconnected or server is down)
+ setTimeout(function() {
+ if (!self._userIsNavigatingAway && !self._reloadCalled) {
+ self._ajaxConnectionLostHandler();
+ }
+ }, 100);
}
},
diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js
index 1ffe7b38a40..01a0e6acb6f 100644
--- a/core/js/tests/specs/coreSpec.js
+++ b/core/js/tests/specs/coreSpec.js
@@ -924,7 +924,7 @@ describe('Core base tests', function() {
var dataProvider = [
[200, false],
[400, false],
- [0, true],
+ [0, false],
[401, true],
[302, true],
[303, true],
@@ -979,5 +979,14 @@ describe('Core base tests', function() {
clock.tick(waitTimeMs);
expect(notificationStub.calledOnce).toEqual(true);
});
+ it('shows a temporary notification if the connection is lost', function() {
+ var xhr = { status: 0 };
+ spyOn(OC, '_ajaxConnectionLostHandler');
+
+ $(document).trigger(new $.Event('ajaxError'), xhr);
+ clock.tick(101);
+
+ expect(OC._ajaxConnectionLostHandler.calls.count()).toBe(1);
+ });
});
});