Skip to content

Commit d3fae27

Browse files
committed
Add support for xhr in xml-prune
Related issue: - uBlockOrigin/uAssets#18244
1 parent ea15cef commit d3fae27

File tree

1 file changed

+41
-10
lines changed

1 file changed

+41
-10
lines changed

assets/resources/scriptlets.js

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,26 +2009,33 @@ function xmlPrune(
20092009
if ( typeof selector !== 'string' ) { return; }
20102010
if ( selector === '' ) { return; }
20112011
const reUrl = patternToRegex(urlPattern);
2012-
const pruner = text => {
2013-
if ( (/^\s*</.test(text) && />\s*$/.test(text)) === false ) {
2014-
return text;
2015-
}
2012+
const pruneFromDoc = xmlDoc => {
20162013
try {
2017-
const xmlParser = new DOMParser();
2018-
const xmlDoc = xmlParser.parseFromString(text, 'text/xml');
20192014
if ( selectorCheck !== '' && xmlDoc.querySelector(selectorCheck) === null ) {
2020-
return text;
2015+
return xmlDoc;
20212016
}
20222017
const elems = xmlDoc.querySelectorAll(selector);
20232018
if ( elems.length !== 0 ) {
20242019
for ( const elem of elems ) {
20252020
elem.remove();
20262021
}
2027-
const serializer = new XMLSerializer();
2028-
text = serializer.serializeToString(xmlDoc);
20292022
}
20302023
} catch(ex) {
20312024
}
2025+
return xmlDoc;
2026+
};
2027+
const pruneFromText = text => {
2028+
if ( (/^\s*</.test(text) && />\s*$/.test(text)) === false ) {
2029+
return text;
2030+
}
2031+
try {
2032+
const xmlParser = new DOMParser();
2033+
const xmlDoc = xmlParser.parseFromString(text, 'text/xml');
2034+
pruneFromDoc(xmlDoc);
2035+
const serializer = new XMLSerializer();
2036+
text = serializer.serializeToString(xmlDoc);
2037+
} catch(ex) {
2038+
}
20322039
return text;
20332040
};
20342041
const urlFromArg = arg => {
@@ -2044,7 +2051,7 @@ function xmlPrune(
20442051
}
20452052
return realFetch(...args).then(realResponse =>
20462053
realResponse.text().then(text =>
2047-
new Response(pruner(text), {
2054+
new Response(pruneFromText(text), {
20482055
status: realResponse.status,
20492056
statusText: realResponse.statusText,
20502057
headers: realResponse.headers,
@@ -2053,6 +2060,30 @@ function xmlPrune(
20532060
);
20542061
}
20552062
});
2063+
self.XMLHttpRequest.prototype.open = new Proxy(self.XMLHttpRequest.prototype.open, {
2064+
apply: async (target, thisArg, args) => {
2065+
if ( reUrl.test(urlFromArg(args[1])) === false ) {
2066+
return Reflect.apply(target, thisArg, args);
2067+
}
2068+
thisArg.addEventListener('readystatechange', function() {
2069+
if ( thisArg.readyState !== 4 ) { return; }
2070+
const type = thisArg.responseType;
2071+
if ( type === 'text' ) {
2072+
const textin = thisArg.responseText;
2073+
const textout = pruneFromText(textin);
2074+
if ( textout === textin ) { return; }
2075+
Object.defineProperty(thisArg, 'response', { value: textout });
2076+
Object.defineProperty(thisArg, 'responseText', { value: textout });
2077+
return;
2078+
}
2079+
if ( type === 'document' ) {
2080+
pruneFromDoc(thisArg.response);
2081+
return;
2082+
}
2083+
});
2084+
return Reflect.apply(target, thisArg, args);
2085+
}
2086+
});
20562087
}
20572088

20582089
/******************************************************************************/

0 commit comments

Comments
 (0)