/** * @namespace OC */ Object.assign(window.OC, { /* jshint camelcase: false */ /** * 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. */ _processAjaxError: function(xhr) { var self = this; // purposefully aborted request ? // this._userIsNavigatingAway needed to distinguish ajax calls cancelled by navigating away // from calls cancelled by failed cross-domain ajax due to SSO redirect if (xhr.status === 0 && (xhr.statusText === 'abort' || xhr.statusText === 'timeout' || self._reloadCalled)) { return; } if (_.contains([302, 303, 307, 401], xhr.status) && OC.currentUser) { // sometimes "beforeunload" happens later, so need to defer the reload a bit setTimeout(function() { if (!self._userIsNavigatingAway && !self._reloadCalled) { var timer = 0; var seconds = 5; var interval = setInterval( function() { OC.Notification.showUpdate(n('core', 'Problem loading page, reloading in %n second', 'Problem loading page, reloading in %n seconds', seconds - timer)); if (timer >= seconds) { clearInterval(interval); OC.reload(); } timer++; }, 1000 // 1 second interval ); // only call reload once 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); } }, /** * Registers XmlHttpRequest object for global error processing. * * This means that if this XHR object returns 401 or session timeout errors, * the current page will automatically be reloaded. * * @param {XMLHttpRequest} xhr */ registerXHRForErrorProcessing: function(xhr) { var loadCallback = function() { if (xhr.readyState !== 4) { return; } if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304) { return; } // fire jquery global ajax error handler $(document).trigger(new $.Event('ajaxError'), xhr); }; var errorCallback = function() { // fire jquery global ajax error handler $(document).trigger(new $.Event('ajaxError'), xhr); }; if (xhr.addEventListener) { xhr.addEventListener('load', loadCallback); xhr.addEventListener('error', errorCallback); } } });