@@ -213,14 +213,37 @@ export default class GMApi {
213213 return this . message . syncSend ( "CAT_fetchBlob" , url ) ;
214214 }
215215
216+ @GMContext . API ( )
217+ public CAT_fetchDocument ( url : string ) : Promise < Document | undefined > {
218+ return new Promise ( ( resolve ) => {
219+ let el : Document | undefined ;
220+ ( < MessageContent > this . message ) . sendCallback (
221+ "CAT_fetchDocument" ,
222+ url ,
223+ ( resp ) => {
224+ el = < Document > (
225+ ( < unknown > (
226+ ( < MessageContent > this . message ) . getAndDelRelatedTarget (
227+ resp . relatedTarget
228+ )
229+ ) )
230+ ) ;
231+ resolve ( el ) ;
232+ }
233+ ) ;
234+ } ) ;
235+ }
236+
216237 // 辅助GM_xml发送blob数据
217238 @GMContext . API ( )
218239 public CAT_createBlobUrl ( blob : Blob ) : Promise < string > {
219240 return this . message . syncSend ( "CAT_createBlobUrl" , blob ) ;
220241 }
221242
222243 // 用于脚本跨域请求,需要@connect domain指定允许的域名
223- @GMContext . API ( { depend : [ "CAT_fetchBlob" , "CAT_createBlobUrl" ] } )
244+ @GMContext . API ( {
245+ depend : [ "CAT_fetchBlob" , "CAT_createBlobUrl" , "CAT_fetchDocument" ] ,
246+ } )
224247 public GM_xmlhttpRequest ( details : GMTypes . XHRDetails ) {
225248 let connect : Channel ;
226249
@@ -300,24 +323,45 @@ export default class GMApi {
300323 }
301324 }
302325
326+ let readerStream : ReadableStream < Uint8Array > | undefined ;
327+ let controller : ReadableStreamDefaultController < Uint8Array > | undefined ;
303328 // 如果返回类型是arraybuffer或者blob的情况下,需要将返回的数据转化为blob
304329 // 在background通过URL.createObjectURL转化为url,然后在content页读取url获取blob对象
330+ const responseType = details . responseType ?. toLocaleLowerCase ( ) ;
305331 const warpResponse = ( old : Function ) => {
332+ if ( responseType === "stream" ) {
333+ readerStream = new ReadableStream < Uint8Array > ( {
334+ start ( ctrl ) {
335+ controller = ctrl ;
336+ } ,
337+ } ) ;
338+ }
306339 return async ( xhr : GMTypes . XHRResponse ) => {
307340 if ( xhr . response ) {
308- const resp = await this . CAT_fetchBlob ( < string > xhr . response ) ;
309- if ( details . responseType === "arraybuffer" ) {
310- xhr . response = await resp . arrayBuffer ( ) ;
341+ if ( responseType === "document" ) {
342+ xhr . response = await this . CAT_fetchDocument ( < string > xhr . response ) ;
343+ xhr . responseXML = xhr . response ;
344+ xhr . responseType = "document" ;
311345 } else {
312- xhr . response = resp ;
346+ const resp = await this . CAT_fetchBlob ( < string > xhr . response ) ;
347+ if ( responseType === "arraybuffer" ) {
348+ xhr . response = await resp . arrayBuffer ( ) ;
349+ } else {
350+ xhr . response = resp ;
351+ }
313352 }
314353 }
354+ if ( responseType === "stream" ) {
355+ xhr . response = readerStream ;
356+ }
315357 old ( xhr ) ;
316358 } ;
317359 } ;
318360 if (
319- details . responseType ?. toLowerCase ( ) === "arraybuffer" ||
320- details . responseType ?. toLocaleLowerCase ( ) === "blob"
361+ responseType === "arraybuffer" ||
362+ responseType === "blob" ||
363+ responseType === "document" ||
364+ responseType === "stream"
321365 ) {
322366 if ( details . onload ) {
323367 details . onload = warpResponse ( details . onload ) ;
@@ -328,6 +372,15 @@ export default class GMApi {
328372 if ( details . onloadend ) {
329373 details . onloadend = warpResponse ( details . onloadend ) ;
330374 }
375+ // document类型读取blob,然后在content页转化为document对象
376+ if ( responseType === "document" ) {
377+ param . responseType = "blob" ;
378+ }
379+ if ( responseType === "stream" ) {
380+ if ( details . onloadstart ) {
381+ details . onloadstart = warpResponse ( details . onloadstart ) ;
382+ }
383+ }
331384 }
332385
333386 connect = this . connect ( "GM_xmlhttpRequest" , [ param ] , ( resp : any ) => {
@@ -338,6 +391,9 @@ export default class GMApi {
338391 break ;
339392 case "onloadend" :
340393 details . onloadend && details . onloadend ( data ) ;
394+ if ( readerStream ) {
395+ controller ?. close ( ) ;
396+ }
341397 break ;
342398 case "onloadstart" :
343399 details . onloadstart && details . onloadstart ( data ) ;
@@ -357,6 +413,9 @@ export default class GMApi {
357413 case "onabort" :
358414 details . onabort && details . onabort ( ) ;
359415 break ;
416+ case "onstream" :
417+ controller ?. enqueue ( new Uint8Array ( resp . data ) ) ;
418+ break ;
360419 default :
361420 LoggerCore . getLogger ( ) . warn ( "GM_xmlhttpRequest resp is error" , {
362421 resp,
0 commit comments