1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/**
* @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);
}
}
});
|