@@ -17,12 +17,17 @@ const TYPED_ARRAY_CTORS = [
1717] ;
1818
1919function createGrowableSharedArrayBufferView ( Ctor ) {
20- const buffer = new SharedArrayBuffer ( 0 , { maxByteLength : 1 } ) ;
20+ const buffer = createGrowableSharedArrayBuffer ( ) ;
2121 const view = new Ctor ( buffer ) ;
22- assert . strictEqual ( view . buffer . growable , true ) ;
2322 return view ;
2423}
2524
25+ function createGrowableSharedArrayBuffer ( ) {
26+ const buffer = new SharedArrayBuffer ( 0 , { maxByteLength : 1 } ) ;
27+ assert . strictEqual ( buffer . growable , true ) ;
28+ return buffer ;
29+ }
30+
2631test ( 'BufferSource accepts ArrayBuffer' , ( ) => {
2732 const ab = new ArrayBuffer ( 8 ) ;
2833 assert . strictEqual ( converters . BufferSource ( ab ) , ab ) ;
@@ -104,6 +109,10 @@ test('BufferSource rejects SAB-backed TypedArray', () => {
104109 ( ) => converters . BufferSource ( view ) ,
105110 { code : 'ERR_INVALID_ARG_TYPE' } ,
106111 ) ;
112+ assert . throws (
113+ ( ) => converters . BufferSource ( view , { allowShared : true } ) ,
114+ { code : 'ERR_INVALID_ARG_TYPE' } ,
115+ ) ;
107116} ) ;
108117
109118test ( 'BufferSource rejects SAB-backed DataView' , ( ) => {
@@ -112,6 +121,10 @@ test('BufferSource rejects SAB-backed DataView', () => {
112121 ( ) => converters . BufferSource ( dv ) ,
113122 { code : 'ERR_INVALID_ARG_TYPE' } ,
114123 ) ;
124+ assert . throws (
125+ ( ) => converters . BufferSource ( dv , { allowShared : true } ) ,
126+ { code : 'ERR_INVALID_ARG_TYPE' } ,
127+ ) ;
115128} ) ;
116129
117130test ( 'BufferSource rejects SAB view whose buffer prototype was reassigned' , ( ) => {
@@ -166,26 +179,96 @@ test('BufferSource handles resizable-backed views with explicit options', () =>
166179 }
167180} ) ;
168181
169- test ( 'BufferSource handles growable SAB-backed views with explicit options' , ( ) => {
182+ test ( 'BufferSource rejects SAB-backed views with explicit options' , ( ) => {
170183 for ( const Ctor of [ DataView , ...TYPED_ARRAY_CTORS ] ) {
171- {
172- const view = createGrowableSharedArrayBufferView ( Ctor ) ;
173- assert . throws (
174- ( ) => converters . BufferSource ( view , {
175- allowShared : true ,
176- allowResizable : false ,
177- } ) ,
178- { code : 'ERR_INVALID_ARG_TYPE' } ,
179- ) ;
180- }
181-
182- {
183- const view = createGrowableSharedArrayBufferView ( Ctor ) ;
184- assert . strictEqual ( converters . BufferSource ( view , {
184+ const view = createGrowableSharedArrayBufferView ( Ctor ) ;
185+ assert . throws (
186+ ( ) => converters . BufferSource ( view , {
185187 allowShared : true ,
186188 allowResizable : true ,
187- } ) , view ) ;
188- }
189+ } ) ,
190+ { code : 'ERR_INVALID_ARG_TYPE' } ,
191+ ) ;
192+ }
193+ } ) ;
194+
195+ test ( 'AllowSharedBufferSource accepts ArrayBuffer and SharedArrayBuffer' , ( ) => {
196+ const ab = new ArrayBuffer ( 8 ) ;
197+ const sab = new SharedArrayBuffer ( 8 ) ;
198+
199+ assert . strictEqual ( converters . AllowSharedBufferSource ( ab ) , ab ) ;
200+ assert . strictEqual ( converters . AllowSharedBufferSource ( sab ) , sab ) ;
201+ } ) ;
202+
203+ test ( 'AllowSharedBufferSource accepts cross-realm buffers' , ( ) => {
204+ const context = vm . createContext ( ) ;
205+ const ab = vm . runInContext ( 'new ArrayBuffer(0)' , context ) ;
206+ const sab = vm . runInContext ( 'new SharedArrayBuffer(0)' , context ) ;
207+
208+ assert . strictEqual ( converters . AllowSharedBufferSource ( ab ) , ab ) ;
209+ assert . strictEqual ( converters . AllowSharedBufferSource ( sab ) , sab ) ;
210+ } ) ;
211+
212+ test ( 'AllowSharedBufferSource accepts ArrayBuffer and SharedArrayBuffer views' , ( ) => {
213+ const abView = new Uint8Array ( new ArrayBuffer ( 8 ) ) ;
214+ const sabView = new Uint8Array ( new SharedArrayBuffer ( 8 ) ) ;
215+ const abDataView = new DataView ( new ArrayBuffer ( 8 ) ) ;
216+ const sabDataView = new DataView ( new SharedArrayBuffer ( 8 ) ) ;
217+
218+ assert . strictEqual ( converters . AllowSharedBufferSource ( abView ) , abView ) ;
219+ assert . strictEqual ( converters . AllowSharedBufferSource ( sabView ) , sabView ) ;
220+ assert . strictEqual (
221+ converters . AllowSharedBufferSource ( abDataView ) , abDataView ) ;
222+ assert . strictEqual (
223+ converters . AllowSharedBufferSource ( sabDataView ) , sabDataView ) ;
224+ } ) ;
225+
226+ test ( 'AllowSharedBufferSource handles resizable buffers with explicit options' , ( ) => {
227+ const ab = new ArrayBuffer ( 0 , { maxByteLength : 1 } ) ;
228+ const views = [ new Uint8Array ( ab ) , new DataView ( ab ) ] ;
229+
230+ assert . throws (
231+ ( ) => converters . AllowSharedBufferSource ( ab ) ,
232+ { code : 'ERR_INVALID_ARG_TYPE' } ,
233+ ) ;
234+ for ( const view of views ) {
235+ assert . throws (
236+ ( ) => converters . AllowSharedBufferSource ( view ) ,
237+ { code : 'ERR_INVALID_ARG_TYPE' } ,
238+ ) ;
239+ }
240+ assert . strictEqual ( converters . AllowSharedBufferSource ( ab , {
241+ allowResizable : true ,
242+ } ) , ab ) ;
243+ for ( const view of views ) {
244+ assert . strictEqual ( converters . AllowSharedBufferSource ( view , {
245+ allowResizable : true ,
246+ } ) , view ) ;
247+ }
248+ } ) ;
249+
250+ test ( 'AllowSharedBufferSource handles growable shared buffers with explicit ' +
251+ 'options' , ( ) => {
252+ const sab = createGrowableSharedArrayBuffer ( ) ;
253+ const views = [ new Uint8Array ( sab ) , new DataView ( sab ) ] ;
254+
255+ assert . throws (
256+ ( ) => converters . AllowSharedBufferSource ( sab ) ,
257+ { code : 'ERR_INVALID_ARG_TYPE' } ,
258+ ) ;
259+ for ( const view of views ) {
260+ assert . throws (
261+ ( ) => converters . AllowSharedBufferSource ( view ) ,
262+ { code : 'ERR_INVALID_ARG_TYPE' } ,
263+ ) ;
264+ }
265+ assert . strictEqual ( converters . AllowSharedBufferSource ( sab , {
266+ allowResizable : true ,
267+ } ) , sab ) ;
268+ for ( const view of views ) {
269+ assert . strictEqual ( converters . AllowSharedBufferSource ( view , {
270+ allowResizable : true ,
271+ } ) , view ) ;
189272 }
190273} ) ;
191274
@@ -205,4 +288,11 @@ for (const value of [null, undefined, 0, 1, 1n, '', 'x', true, Symbol('s'), [],
205288 { code : 'ERR_INVALID_ARG_TYPE' } ,
206289 ) ;
207290 } ) ;
291+
292+ test ( `AllowSharedBufferSource rejects ${ typeof value } ${ String ( value ) } ` , ( ) => {
293+ assert . throws (
294+ ( ) => converters . AllowSharedBufferSource ( value ) ,
295+ { code : 'ERR_INVALID_ARG_TYPE' } ,
296+ ) ;
297+ } ) ;
208298}
0 commit comments