@@ -213,14 +213,37 @@ export default class GMApi {
213
213
return this . message . syncSend ( "CAT_fetchBlob" , url ) ;
214
214
}
215
215
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
+
216
237
// 辅助GM_xml发送blob数据
217
238
@GMContext . API ( )
218
239
public CAT_createBlobUrl ( blob : Blob ) : Promise < string > {
219
240
return this . message . syncSend ( "CAT_createBlobUrl" , blob ) ;
220
241
}
221
242
222
243
// 用于脚本跨域请求,需要@connect domain指定允许的域名
223
- @GMContext . API ( { depend : [ "CAT_fetchBlob" , "CAT_createBlobUrl" ] } )
244
+ @GMContext . API ( {
245
+ depend : [ "CAT_fetchBlob" , "CAT_createBlobUrl" , "CAT_fetchDocument" ] ,
246
+ } )
224
247
public GM_xmlhttpRequest ( details : GMTypes . XHRDetails ) {
225
248
let connect : Channel ;
226
249
@@ -300,24 +323,45 @@ export default class GMApi {
300
323
}
301
324
}
302
325
326
+ let readerStream : ReadableStream < Uint8Array > | undefined ;
327
+ let controller : ReadableStreamDefaultController < Uint8Array > | undefined ;
303
328
// 如果返回类型是arraybuffer或者blob的情况下,需要将返回的数据转化为blob
304
329
// 在background通过URL.createObjectURL转化为url,然后在content页读取url获取blob对象
330
+ const responseType = details . responseType ?. toLocaleLowerCase ( ) ;
305
331
const warpResponse = ( old : Function ) => {
332
+ if ( responseType === "stream" ) {
333
+ readerStream = new ReadableStream < Uint8Array > ( {
334
+ start ( ctrl ) {
335
+ controller = ctrl ;
336
+ } ,
337
+ } ) ;
338
+ }
306
339
return async ( xhr : GMTypes . XHRResponse ) => {
307
340
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" ;
311
345
} 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
+ }
313
352
}
314
353
}
354
+ if ( responseType === "stream" ) {
355
+ xhr . response = readerStream ;
356
+ }
315
357
old ( xhr ) ;
316
358
} ;
317
359
} ;
318
360
if (
319
- details . responseType ?. toLowerCase ( ) === "arraybuffer" ||
320
- details . responseType ?. toLocaleLowerCase ( ) === "blob"
361
+ responseType === "arraybuffer" ||
362
+ responseType === "blob" ||
363
+ responseType === "document" ||
364
+ responseType === "stream"
321
365
) {
322
366
if ( details . onload ) {
323
367
details . onload = warpResponse ( details . onload ) ;
@@ -328,6 +372,15 @@ export default class GMApi {
328
372
if ( details . onloadend ) {
329
373
details . onloadend = warpResponse ( details . onloadend ) ;
330
374
}
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
+ }
331
384
}
332
385
333
386
connect = this . connect ( "GM_xmlhttpRequest" , [ param ] , ( resp : any ) => {
@@ -338,6 +391,9 @@ export default class GMApi {
338
391
break ;
339
392
case "onloadend" :
340
393
details . onloadend && details . onloadend ( data ) ;
394
+ if ( readerStream ) {
395
+ controller ?. close ( ) ;
396
+ }
341
397
break ;
342
398
case "onloadstart" :
343
399
details . onloadstart && details . onloadstart ( data ) ;
@@ -357,6 +413,9 @@ export default class GMApi {
357
413
case "onabort" :
358
414
details . onabort && details . onabort ( ) ;
359
415
break ;
416
+ case "onstream" :
417
+ controller ?. enqueue ( new Uint8Array ( resp . data ) ) ;
418
+ break ;
360
419
default :
361
420
LoggerCore . getLogger ( ) . warn ( "GM_xmlhttpRequest resp is error" , {
362
421
resp,
0 commit comments