-
Notifications
You must be signed in to change notification settings - Fork 2
/
AjaxAgent.js
82 lines (67 loc) · 3.06 KB
/
AjaxAgent.js
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
_context.invoke('Nittro.Page', function(Arrays) {
var AjaxAgent = _context.extend(function(page, ajax, options) {
this._ = {
page: page,
ajax: ajax,
options: Arrays.mergeTree({}, AjaxAgent.defaults, options)
};
this._.page.on('before-transaction', this._checkTransaction.bind(this));
this._.page.on('transaction-created', this._initTransaction.bind(this));
}, {
STATIC: {
defaults: {
whitelistRedirects: false
}
},
_checkTransaction: function (evt) {
if (!this._.ajax.isAllowedOrigin(evt.data.url) || !this._.ajax.supports(evt.data.url, evt.data.context.method, evt.data.context.data)) {
evt.preventDefault();
}
},
_initTransaction: function(evt) {
var data = {
request: this._.ajax.createRequest(evt.data.transaction.getUrl(), evt.data.context.method, evt.data.context.data)
};
evt.data.transaction.on('dispatch', this._dispatch.bind(this, data));
evt.data.transaction.on('abort', this._abort.bind(this, data));
},
_dispatch: function(data, evt) {
evt.waitFor(Promise.resolve().then(this._doDispatch.bind(this, evt.target, data)));
},
_doDispatch: function (transaction, data) {
return transaction.trigger('ajax-request', { request: data.request })
.then(this._.ajax.dispatch.bind(this._.ajax, data.request))
.then(this._handleResponse.bind(this, transaction, data));
},
_abort: function(data) {
data.request.abort();
},
_handleResponse: function (transaction, data, response) {
return Promise.resolve().then(this._doHandleResponse.bind(this, transaction, data, response));
},
_doHandleResponse: function(transaction, data, response) {
return transaction.trigger('ajax-response', { response: response })
.then(function() {
var payload = response.getPayload();
if (payload.postGet) {
transaction.setUrl(payload.url);
}
if ('redirect' in payload) {
if ((!this._.options.whitelistRedirects ? payload.allowAjax !== false : payload.allowAjax) && this._.ajax.isAllowedOrigin(payload.redirect)) {
transaction.setUrl(payload.redirect);
data.request = this._.ajax.createRequest(payload.redirect);
return this._doDispatch(transaction, data);
} else {
document.location.href = payload.redirect;
return new Promise(function() {});
}
} else {
return data.request;
}
}.bind(this));
}
});
_context.register(AjaxAgent, 'AjaxAgent');
}, {
Arrays: 'Utils.Arrays'
});