@@ -236,6 +236,29 @@ promise_test(t => {
236236 } ) ;
237237} , 'ReadableStream with byte source: Test that erroring a stream does not release a BYOB reader automatically' ) ;
238238
239+ promise_test ( async t => {
240+ const rs = new ReadableStream ( {
241+ type : 'bytes' ,
242+ start ( c ) {
243+ c . enqueue ( new Uint8Array ( [ 1 , 2 , 3 ] ) ) ;
244+ }
245+ } ) ;
246+
247+ const reader1 = rs . getReader ( { mode : 'byob' } ) ;
248+ reader1 . releaseLock ( ) ;
249+
250+ const reader2 = rs . getReader ( { mode : 'byob' } ) ;
251+
252+ // Should be a no-op
253+ reader1 . releaseLock ( ) ;
254+
255+ const result = await reader2 . read ( new Uint8Array ( [ 0 , 0 , 0 ] ) ) ;
256+ assert_typed_array_equals ( result . value , new Uint8Array ( [ 1 , 2 , 3 ] ) ,
257+ 'read() should still work on reader2 even after reader1 is released' ) ;
258+ assert_false ( result . done , 'done' ) ;
259+
260+ } , 'ReadableStream with byte source: cannot use an already-released BYOB reader to unlock a stream again' ) ;
261+
239262promise_test ( async t => {
240263 const stream = new ReadableStream ( {
241264 type : 'bytes'
@@ -992,6 +1015,69 @@ promise_test(() => {
9921015} , 'ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array enqueues the 1 byte ' +
9931016 'remainder' ) ;
9941017
1018+ promise_test ( ( ) => {
1019+ let pullCount = 0 ;
1020+
1021+ let controller ;
1022+ let byobRequest ;
1023+ let viewInfo ;
1024+
1025+ const stream = new ReadableStream ( {
1026+ start ( c ) {
1027+ controller = c ;
1028+ } ,
1029+ pull ( ) {
1030+ ++ pullCount ;
1031+
1032+ byobRequest = controller . byobRequest ;
1033+ const view = byobRequest . view ;
1034+ viewInfo = extractViewInfo ( view ) ;
1035+
1036+ view [ 0 ] = 0x01 ;
1037+ view [ 1 ] = 0x02 ;
1038+ view [ 2 ] = 0x03 ;
1039+
1040+ controller . byobRequest . respond ( 3 ) ;
1041+ } ,
1042+ type : 'bytes'
1043+ } ) ;
1044+
1045+ const reader = stream . getReader ( { mode : 'byob' } ) ;
1046+ const read1 = reader . read ( new Uint16Array ( 2 ) ) ;
1047+ const read2 = reader . read ( new Uint8Array ( 1 ) ) ;
1048+
1049+ return read1 . then ( result => {
1050+ assert_equals ( pullCount , 1 ) ;
1051+
1052+ assert_false ( result . done , 'done' ) ;
1053+
1054+ const view = result . value ;
1055+ assert_equals ( view . byteOffset , 0 , 'byteOffset' ) ;
1056+ assert_equals ( view . byteLength , 2 , 'byteLength' ) ;
1057+
1058+ const dataView = new DataView ( view . buffer , view . byteOffset , view . byteLength ) ;
1059+ assert_equals ( dataView . getUint16 ( 0 ) , 0x0102 ) ;
1060+
1061+ return read2 ;
1062+ } ) . then ( result => {
1063+ assert_equals ( pullCount , 1 ) ;
1064+ assert_not_equals ( byobRequest , null , 'byobRequest must not be null' ) ;
1065+ assert_equals ( viewInfo . constructor , Uint8Array , 'view.constructor should be Uint8Array' ) ;
1066+ assert_equals ( viewInfo . bufferByteLength , 4 , 'view.buffer.byteLength should be 4' ) ;
1067+ assert_equals ( viewInfo . byteOffset , 0 , 'view.byteOffset should be 0' ) ;
1068+ assert_equals ( viewInfo . byteLength , 4 , 'view.byteLength should be 4' ) ;
1069+
1070+ assert_false ( result . done , 'done' ) ;
1071+
1072+ const view = result . value ;
1073+ assert_equals ( view . byteOffset , 0 , 'byteOffset' ) ;
1074+ assert_equals ( view . byteLength , 1 , 'byteLength' ) ;
1075+
1076+ assert_equals ( view [ 0 ] , 0x03 ) ;
1077+ } ) ;
1078+ } , 'ReadableStream with byte source: respond(3) to read(view) with 2 element Uint16Array fulfills second read(view) ' +
1079+ 'with the 1 byte remainder' ) ;
1080+
9951081promise_test ( t => {
9961082 const stream = new ReadableStream ( {
9971083 start ( controller ) {
0 commit comments