@@ -1929,66 +1929,75 @@ builtinScriptlets.push({
19291929 ] ,
19301930 fn : noXhrIf ,
19311931 dependencies : [
1932- 'safe-self.fn' ,
1932+ 'match-object-properties.fn' ,
1933+ 'parse-properties-to-match.fn' ,
19331934 ] ,
19341935} ) ;
19351936function noXhrIf (
1936- arg1 = ''
1937+ propsToMatch = '' ,
1938+ randomize = ''
19371939) {
1938- if ( typeof arg1 !== 'string' ) { return ; }
1939- const safe = safeSelf ( ) ;
1940+ if ( typeof propsToMatch !== 'string' ) { return ; }
19401941 const xhrInstances = new WeakMap ( ) ;
1941- const needles = [ ] ;
1942- for ( const condition of arg1 . split ( / \s + / ) ) {
1943- if ( condition === '' ) { continue ; }
1944- const pos = condition . indexOf ( ':' ) ;
1945- let key , value ;
1946- if ( pos !== - 1 ) {
1947- key = condition . slice ( 0 , pos ) ;
1948- value = condition . slice ( pos + 1 ) ;
1949- } else {
1950- key = 'url' ;
1951- value = condition ;
1952- }
1953- needles . push ( { key, re : safe . patternToRegex ( value ) } ) ;
1954- }
1955- const log = needles . length === 0 ? console . log . bind ( console ) : undefined ;
1942+ const propNeedles = parsePropertiesToMatch ( propsToMatch , 'url' ) ;
1943+ const log = propNeedles . size === 0 ? console . log . bind ( console ) : undefined ;
19561944 self . XMLHttpRequest = class extends self . XMLHttpRequest {
1957- open ( ...args ) {
1945+ open ( method , url , ...args ) {
19581946 if ( log !== undefined ) {
1959- log ( `uBO: xhr.open(${ args . join ( ', ' ) } )` ) ;
1947+ log ( `uBO: xhr.open(${ method } , ${ url } , ${ args . join ( ', ' ) } )` ) ;
19601948 } else {
1961- const argNames = [ 'method' , 'url' ] ;
1962- const haystack = new Map ( ) ;
1963- for ( let i = 0 ; i < args . length && i < argNames . length ; i ++ ) {
1964- haystack . set ( argNames [ i ] , args [ i ] ) ;
1965- }
1966- if ( haystack . size !== 0 ) {
1967- let matches = true ;
1968- for ( const { key, re } of needles ) {
1969- matches = re . test ( haystack . get ( key ) || '' ) ;
1970- if ( matches === false ) { break ; }
1971- }
1972- if ( matches ) {
1973- xhrInstances . set ( this , haystack ) ;
1974- }
1949+ const haystack = { method, url } ;
1950+ if ( matchObjectProperties ( propNeedles , haystack ) ) {
1951+ xhrInstances . set ( this , haystack ) ;
19751952 }
19761953 }
1977- return super . open ( ...args ) ;
1954+ return super . open ( method , url , ...args ) ;
19781955 }
19791956 send ( ...args ) {
19801957 const haystack = xhrInstances . get ( this ) ;
19811958 if ( haystack === undefined ) {
19821959 return super . send ( ...args ) ;
19831960 }
19841961 Object . defineProperties ( this , {
1985- readyState : { value : 4 , writable : false } ,
1986- response : { value : '' , writable : false } ,
1987- responseText : { value : '' , writable : false } ,
1988- responseURL : { value : haystack . get ( 'url' ) , writable : false } ,
1989- responseXML : { value : '' , writable : false } ,
1990- status : { value : 200 , writable : false } ,
1991- statusText : { value : 'OK' , writable : false } ,
1962+ readyState : { value : 4 } ,
1963+ responseURL : { value : haystack . url } ,
1964+ status : { value : 200 } ,
1965+ statusText : { value : 'OK' } ,
1966+ } ) ;
1967+ let response = '' ;
1968+ let responseText = '' ;
1969+ let responseXML = null ;
1970+ switch ( this . responseType ) {
1971+ case 'arraybuffer' :
1972+ response = new ArrayBuffer ( 0 ) ;
1973+ break ;
1974+ case 'blob' :
1975+ response = new Blob ( [ ] ) ;
1976+ break ;
1977+ case 'document' : {
1978+ const parser = new DOMParser ( ) ;
1979+ const doc = parser . parseFromString ( '' , 'text/html' ) ;
1980+ response = doc ;
1981+ responseXML = doc ;
1982+ break ;
1983+ }
1984+ case 'json' :
1985+ response = { } ;
1986+ responseText = '{}' ;
1987+ break ;
1988+ default :
1989+ if ( randomize !== 'true' ) { break ; }
1990+ do {
1991+ response += Math . random ( ) . toString ( 36 ) . slice ( - 2 ) ;
1992+ } while ( response . length < 10 ) ;
1993+ response = response . slice ( - 10 ) ;
1994+ responseText = response ;
1995+ break ;
1996+ }
1997+ Object . defineProperties ( this , {
1998+ response : { value : response } ,
1999+ responseText : { value : responseText } ,
2000+ responseXML : { value : responseXML } ,
19922001 } ) ;
19932002 this . dispatchEvent ( new Event ( 'readystatechange' ) ) ;
19942003 this . dispatchEvent ( new Event ( 'load' ) ) ;
0 commit comments