Skip to content
This repository was archived by the owner on Feb 26, 2024. It is now read-only.

Commit 9509747

Browse files
JiaLiPassionmhevery
authored andcommitted
fix: Prevent adding listener for xhrhttprequest multiple times
* fix bug add event listener to xhrhttprequest multiple times and invalid request call (#529) * fix bug add event listener to xhrhttprequest multiple times #527 * fix #287 with a better solution to prevent memory leak * fix #530 for xhr request to an invalid url cause Schedule task count failed
1 parent 2594817 commit 9509747

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

lib/browser/browser.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ patchXHR(_global);
4848

4949
const XHR_TASK = zoneSymbol('xhrTask');
5050
const XHR_SYNC = zoneSymbol('xhrSync');
51+
const XHR_LISTENER = zoneSymbol('xhrListener');
52+
const XHR_SCHEDULED = zoneSymbol('xhrScheduled');
5153

5254
interface XHROptions extends TaskData {
5355
target: any;
@@ -62,19 +64,28 @@ function patchXHR(window: any) {
6264
}
6365

6466
function scheduleTask(task: Task) {
67+
self[XHR_SCHEDULED] = false;
6568
var data = <XHROptions>task.data;
66-
data.target.addEventListener('readystatechange', () => {
69+
// remove existing event listener
70+
var listener = data.target[XHR_LISTENER];
71+
if (listener) {
72+
data.target.removeEventListener('readystatechange', listener);
73+
}
74+
var newListener = data.target[XHR_LISTENER] = () => {
6775
if (data.target.readyState === data.target.DONE) {
68-
if (!data.aborted) {
76+
if (!data.aborted && self[XHR_SCHEDULED]) {
6977
task.invoke();
7078
}
7179
}
72-
});
80+
};
81+
data.target.addEventListener('readystatechange', newListener);
82+
7383
var storedTask: Task = data.target[XHR_TASK];
7484
if (!storedTask) {
7585
data.target[XHR_TASK] = task;
7686
}
7787
sendNative.apply(data.target, data.args);
88+
self[XHR_SCHEDULED] = true;
7889
return task;
7990
}
8091

test/browser/XMLHttpRequest.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,16 @@ describe('XMLHttpRequest', function() {
182182
expect(XMLHttpRequest.LOADING).toEqual(3);
183183
expect(XMLHttpRequest.DONE).toEqual(4);
184184
});
185+
186+
it('should work properly when send request multiple times on single xmlRequest instance', function() {
187+
testZone.run(function() {
188+
var req = new XMLHttpRequest();
189+
req.open('get', '/', true);
190+
req.send();
191+
req.onloadend = function() {
192+
req.open('get', '/', true);
193+
req.send();
194+
}
195+
});
196+
})
185197
});

0 commit comments

Comments
 (0)