Skip to content

Commit 492da8f

Browse files
committed
fix closure bug for trusted-replace-xhr-response
1 parent 4f1d59b commit 492da8f

File tree

2 files changed

+9
-9
lines changed

2 files changed

+9
-9
lines changed

src/scriptlets/trusted-replace-xhr-response.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,7 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = ''
9090
const nativeOpen = window.XMLHttpRequest.prototype.open;
9191
const nativeSend = window.XMLHttpRequest.prototype.send;
9292

93-
let shouldReplace = false;
9493
let xhrData;
95-
let requestHeaders = [];
9694

9795
const openWrapper = (target, thisArg, args) => {
9896
// eslint-disable-next-line prefer-spread
@@ -106,13 +104,16 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = ''
106104
return Reflect.apply(target, thisArg, args);
107105
}
108106

109-
shouldReplace = matchRequestProps(source, propsToMatch, xhrData);
107+
if (matchRequestProps(source, propsToMatch, xhrData)) {
108+
thisArg.shouldBePrevented = true;
109+
}
110110

111111
// Trap setRequestHeader of target xhr object to mimic request headers later
112-
if (shouldReplace) {
112+
if (thisArg.shouldBePrevented) {
113+
thisArg.collectedHeaders = [];
113114
const setRequestHeaderWrapper = (target, thisArg, args) => {
114115
// Collect headers
115-
requestHeaders.push(args);
116+
thisArg.collectedHeaders.push(args);
116117
return Reflect.apply(target, thisArg, args);
117118
};
118119

@@ -129,7 +130,7 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = ''
129130
};
130131

131132
const sendWrapper = (target, thisArg, args) => {
132-
if (!shouldReplace) {
133+
if (!thisArg.shouldBePrevented) {
133134
return Reflect.apply(target, thisArg, args);
134135
}
135136

@@ -197,13 +198,13 @@ export function trustedReplaceXhrResponse(source, pattern = '', replacement = ''
197198

198199
// Mimic request headers before sending
199200
// setRequestHeader can only be called on open request objects
200-
requestHeaders.forEach((header) => {
201+
thisArg.collectedHeaders.forEach((header) => {
201202
const name = header[0];
202203
const value = header[1];
203204

204205
forgedRequest.setRequestHeader(name, value);
205206
});
206-
requestHeaders = [];
207+
thisArg.collectedHeaders = [];
207208

208209
try {
209210
nativeSend.call(forgedRequest, args);

tests/scriptlets/prevent-xhr.test.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,6 @@ if (isSupported) {
608608
xhr2.open(METHOD, URL_TO_BLOCK);
609609

610610
xhr1.onload = () => {
611-
clearGlobalProps('hit');
612611
assert.strictEqual(xhr1.readyState, 4, 'Response done');
613612
assert.ok(xhr1.response, 'Response data exists');
614613
assert.strictEqual(window.hit, undefined, 'hit should not fire');

0 commit comments

Comments
 (0)