From 5ae6d6281132c11b73448db064e9f4ce4582659c Mon Sep 17 00:00:00 2001 From: Christoph Wurst <christoph@winzerhof-wurst.at> Date: Mon, 19 Sep 2016 23:49:42 +0200 Subject: [PATCH] do not reload the page if the server is (temporarily) unreachable --- core/js/js.js | 20 +++++++++++++++++++- core/js/tests/specs/coreSpec.js | 11 ++++++++++- 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 @@ -729,6 +729,17 @@ var OC={ return oc_isadmin; }, + /** + * 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); + }); }); }); -- GitLab