Skip to content

Commit

Permalink
Load and loadend event simulation
Browse files Browse the repository at this point in the history
  • Loading branch information
jellizaveta committed Oct 9, 2024
1 parent 959076c commit 2f927e7
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 29 deletions.
57 changes: 29 additions & 28 deletions src/scriptlets/prevent-xhr.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,14 +187,33 @@ export function preventXHR(source, propsToMatch, customResponseText) {
* By using Object.defineProperty, the function ensures
* that the readyState can be modified and configured appropriately,
* while allowing the property to be writable.
* @param {number} readyState - request status number.
* @param {number} state - request status number.
*/
const transitionReadyState = (readyState) => {
Object.defineProperty(thisArg, 'readyState', {
value: readyState,
writable: true,
configurable: true,
});
const transitionReadyState = (state) => {
if (state === 4) {
const {
responseURL,
responseXML,
} = forgedRequest;

// Mock response object
Object.defineProperties(thisArg, {
readyState: { value: 4, writable: false },
statusText: { value: 'OK', writable: false },
responseURL: { value: responseURL || thisArg.xhrData.url, writable: false },
responseXML: { value: responseXML, writable: false },
status: { value: 200, writable: false },
response: { value: modifiedResponse, writable: false },
responseText: { value: modifiedResponseText, writable: false },
});
hit(source);
} else {
Object.defineProperty(thisArg, 'readyState', {
value: state,
writable: true,
configurable: true,
});
}
const stateEvent = new Event('readystatechange');
thisArg.dispatchEvent(stateEvent);
};
Expand All @@ -211,32 +230,14 @@ export function preventXHR(source, propsToMatch, customResponseText) {
const progressEvent = new ProgressEvent('progress');
thisArg.dispatchEvent(progressEvent);
transitionReadyState(4);
});

hit(source);

const {
responseURL,
responseXML,
} = forgedRequest;

// Mock response object
Object.defineProperties(thisArg, {
readyState: { value: 4, writable: false },
statusText: { value: 'OK', writable: false },
responseURL: { value: responseURL || thisArg.xhrData.url, writable: false },
responseXML: { value: responseXML, writable: false },
status: { value: 200, writable: false },
response: { value: modifiedResponse, writable: false },
responseText: { value: modifiedResponseText, writable: false },
});

// Dispatch final events
setTimeout(() => {
const loadEvent = new ProgressEvent('load');
thisArg.dispatchEvent(loadEvent);

const loadEndEvent = new ProgressEvent('loadend');
thisArg.dispatchEvent(loadEndEvent);
});
}, 1);

nativeOpen.apply(forgedRequest, [thisArg.xhrData.method, thisArg.xhrData.url]);

Expand Down
3 changes: 2 additions & 1 deletion tests/scriptlets/prevent-xhr.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ if (isSupported) {
xhrEvents[xhr.readyState - 1] = true;

if (xhr.readyState === 4) {
assert.strictEqual(xhr.responseURL, URL, 'URL mocked');
assert.ok(xhrEvents.every((event) => event), 'All readyState change events were fired');
done();
}
Expand Down Expand Up @@ -691,6 +692,7 @@ if (isSupported) {

const xhr = new XMLHttpRequest();
xhr.open(METHOD, URL);
xhr.send();
xhr.addEventListener('load', () => {
done1();
});
Expand All @@ -700,7 +702,6 @@ if (isSupported) {
xhr.addEventListener('loadend', () => {
done3();
});
xhr.send();
});

test('Args, pass unmatched', async (assert) => {
Expand Down

0 comments on commit 2f927e7

Please sign in to comment.