@@ -64,7 +64,7 @@ describe('renderToChunks', () => {
6464 expect ( result ) . to . deep . equal ( [
6565 '<div><!--$s:10-->loading...<!--/$s:10--></div>' ,
6666 '<div hidden>' ,
67- createInitScript ( 1 ) ,
67+ createInitScript ( ) ,
6868 '</div>'
6969 ] ) ;
7070 } ) ;
@@ -111,7 +111,7 @@ describe('renderToChunks', () => {
111111 expect ( result ) . to . deep . equal ( [
112112 '<div><!--$s:16-->loading...<!--/$s:16--></div>' ,
113113 '<div hidden>' ,
114- createInitScript ( 1 ) ,
114+ createInitScript ( ) ,
115115 createSubtree ( '16' , '<p>it works</p>' ) ,
116116 '</div>'
117117 ] ) ;
@@ -144,7 +144,7 @@ describe('renderToChunks', () => {
144144 expect ( result ) . to . deep . equal ( [
145145 '<div><p>id: P0-0</p><!--$s:24-->loading...<!--/$s:24--></div>' ,
146146 '<div hidden>' ,
147- createInitScript ( 1 ) ,
147+ createInitScript ( ) ,
148148 createSubtree ( '24' , '<p>id: P0-1</p>' ) ,
149149 '</div>'
150150 ] ) ;
@@ -184,7 +184,7 @@ describe('renderToChunks', () => {
184184 expect ( result ) . toEqual ( [
185185 '<div><p>id: P0-0</p><!--$s:33-->loading...<!--/$s:33--><!--$s:36-->loading...<!--/$s:36--></div>' ,
186186 '<div hidden>' ,
187- createInitScript ( 1 ) ,
187+ createInitScript ( ) ,
188188 createSubtree ( '33' , '<p>id: P0-1</p>' ) ,
189189 createSubtree ( '36' , '<p>id: P0-2</p>' ) ,
190190 '</div>'
@@ -307,9 +307,50 @@ describe('renderToChunks', () => {
307307 expect ( result ) . to . deep . equal ( [
308308 '<div><!--$s:70-->loading part 1...<!--/$s:70--></div>' ,
309309 '<div hidden>' ,
310- createInitScript ( 1 ) ,
310+ createInitScript ( ) ,
311311 createSubtree ( '70' , '<p>it works</p><p>it works</p>' ) ,
312312 '</div>'
313313 ] ) ;
314314 } ) ;
315+
316+ it ( 'should include the nonce attribute on the init script when a nonce is provided' , async ( ) => {
317+ const { Suspender, suspended } = createSuspender ( ) ;
318+
319+ const result = [ ] ;
320+ const promise = renderToChunks (
321+ < div >
322+ < Suspense fallback = "loading..." >
323+ < Suspender />
324+ </ Suspense >
325+ </ div > ,
326+ { onWrite : ( s ) => result . push ( s ) , nonce : 'r4nd0m-nonce' }
327+ ) ;
328+ suspended . resolve ( ) ;
329+ await promise ;
330+
331+ const fullHtml = result . join ( '' ) ;
332+ expect ( fullHtml ) . to . contain ( '<script nonce="r4nd0m-nonce">' ) ;
333+
334+ // The init script should be the only script emitted
335+ expect ( result [ 2 ] ) . to . equal ( createInitScript ( 'r4nd0m-nonce' ) ) ;
336+ } ) ;
337+ } ) ;
338+
339+ describe ( 'createInitScript' , ( ) => {
340+ it ( 'should not include a nonce attribute by default' , ( ) => {
341+ const script = createInitScript ( ) ;
342+ expect ( script . startsWith ( '<script>' ) ) . to . be . true ;
343+ expect ( script ) . to . not . contain ( 'nonce=' ) ;
344+ } ) ;
345+
346+ it ( 'should include a nonce attribute when a nonce is provided' , ( ) => {
347+ const script = createInitScript ( 'r4nd0m-nonce' ) ;
348+ expect ( script . startsWith ( '<script nonce="r4nd0m-nonce">' ) ) . to . be . true ;
349+ } ) ;
350+
351+ it ( 'should encode HTML entities in the nonce' , ( ) => {
352+ const script = createInitScript ( 'a"b&c<d' ) ;
353+ expect ( script . startsWith ( '<script nonce="a"b&c<d">' ) ) . to . be
354+ . true ;
355+ } ) ;
315356} ) ;
0 commit comments