@@ -31,6 +31,15 @@ const responses = {
31
31
}
32
32
} )
33
33
} ,
34
+ '/x-server-sanitized' : function ( ) {
35
+ return new Response ( 'This response should be marked as sanitized using a custom header!' , {
36
+ status : 200 ,
37
+ headers : {
38
+ 'Content-Type' : 'text/html; charset=utf-8' ,
39
+ 'X-Server-Sanitized' : 'sanitized=true'
40
+ }
41
+ } )
42
+ } ,
34
43
'/boom' : function ( ) {
35
44
return new Response ( 'boom' , {
36
45
status : 500
@@ -607,4 +616,110 @@ suite('include-fragment-element', function () {
607
616
assert . equal ( document . querySelector ( '#replaced' ) . textContent , 'hello' )
608
617
} )
609
618
} )
619
+
620
+ suite ( 'CSP trusted types' , ( ) => {
621
+ teardown ( ( ) => {
622
+ setCSPTrustedTypesPolicy ( null )
623
+ } )
624
+
625
+ test ( 'can set a pass-through mock CSP trusted types policy' , async function ( ) {
626
+ let policyCalled = false
627
+ setCSPTrustedTypesPolicy ( {
628
+ createHTML : htmlText => {
629
+ policyCalled = true
630
+ return htmlText
631
+ }
632
+ } )
633
+
634
+ const el = document . createElement ( 'include-fragment' )
635
+ el . src = '/hello'
636
+
637
+ const data = await el . data
638
+ assert . equal ( '<div id="replaced">hello</div>' , data )
639
+ assert . ok ( policyCalled )
640
+ } )
641
+
642
+ test ( 'can set and clear a mutating mock CSP trusted types policy' , async function ( ) {
643
+ let policyCalled = false
644
+ setCSPTrustedTypesPolicy ( {
645
+ createHTML : htmlText => {
646
+ policyCalled = true
647
+ return '<b>replacement</b>'
648
+ }
649
+ } )
650
+
651
+ const el = document . createElement ( 'include-fragment' )
652
+ el . src = '/hello'
653
+ const data = await el . data
654
+ assert . equal ( '<b>replacement</b>' , data )
655
+ assert . ok ( policyCalled )
656
+
657
+ setCSPTrustedTypesPolicy ( null )
658
+ const el2 = document . createElement ( 'include-fragment' )
659
+ el2 . src = '/hello'
660
+ const data2 = await el2 . data
661
+ assert . equal ( '<div id="replaced">hello</div>' , data2 )
662
+ } )
663
+
664
+ test ( 'can set a real CSP trusted types policy in Chromium' , async function ( ) {
665
+ let policyCalled = false
666
+ const policy = globalThis . trustedTypes . createPolicy ( 'test1' , {
667
+ createHTML : htmlText => {
668
+ policyCalled = true
669
+ return htmlText
670
+ }
671
+ } )
672
+ setCSPTrustedTypesPolicy ( policy )
673
+
674
+ const el = document . createElement ( 'include-fragment' )
675
+ el . src = '/hello'
676
+ const data = await el . data
677
+ assert . equal ( '<div id="replaced">hello</div>' , data )
678
+ assert . ok ( policyCalled )
679
+ } )
680
+
681
+ test ( 'can reject data using a mock CSP trusted types policy' , async function ( ) {
682
+ setCSPTrustedTypesPolicy ( {
683
+ createHTML : htmlText => {
684
+ throw new Error ( 'Rejected data!' )
685
+ }
686
+ } )
687
+
688
+ const el = document . createElement ( 'include-fragment' )
689
+ el . src = '/hello'
690
+ try {
691
+ await el . data
692
+ assert . ok ( false )
693
+ } catch ( error ) {
694
+ assert . match ( error , / R e j e c t e d d a t a ! / )
695
+ }
696
+ } )
697
+
698
+ test ( 'can access headers using a mock CSP trusted types policy' , async function ( ) {
699
+ setCSPTrustedTypesPolicy ( {
700
+ createHTML : ( htmlText , response ) => {
701
+ if ( response . headers . get ( "X-Server-Sanitized" ) !== "sanitized=true" ) {
702
+ // Note: this will reject the contents, but the error may be caught before it shows in the JS console.
703
+ throw new Error ( "Rejecting HTML that was not marked by the server as sanitized." ) ;
704
+ }
705
+ return htmlText ;
706
+ }
707
+ } )
708
+
709
+ const el = document . createElement ( 'include-fragment' )
710
+ el . src = '/hello'
711
+ try {
712
+ await el . data
713
+ assert . ok ( false )
714
+ } catch ( error ) {
715
+ assert . match ( error , / R e j e c t i n g H T M L t h a t w a s n o t m a r k e d b y t h e s e r v e r a s s a n i t i z e d ./ )
716
+ }
717
+
718
+ const el2 = document . createElement ( 'include-fragment' )
719
+ el2 . src = '/x-server-sanitized'
720
+
721
+ const data2 = await el2 . data
722
+ assert . equal ( 'This response should be marked as sanitized using a custom header!' , data2 )
723
+ } )
724
+ } )
610
725
} )
0 commit comments