@@ -19,22 +19,75 @@ const makeTestStorage = () => {
1919 return storage ;
2020} ;
2121
22- test ( 'isValidFamily ' , t => {
22+ test ( 'isValidSystemFont ' , t => {
2323 const { fontManager} = new Runtime ( ) ;
24- t . ok ( fontManager . isValidFamily ( 'Roboto' ) ) ;
25- t . ok ( fontManager . isValidFamily ( 'sans-serif' ) ) ;
26- t . ok ( fontManager . isValidFamily ( 'helvetica neue' ) ) ;
27- t . notOk ( fontManager . isValidFamily ( 'Roboto;Bold' ) ) ;
28- t . notOk ( fontManager . isValidFamily ( 'Arial, sans-serif' ) ) ;
24+ t . ok ( fontManager . isValidSystemFont ( 'Roboto' ) ) ;
25+ t . ok ( fontManager . isValidSystemFont ( 'sans-serif' ) ) ;
26+ t . ok ( fontManager . isValidSystemFont ( 'helvetica neue' ) ) ;
27+ t . notOk ( fontManager . isValidSystemFont ( 'Roboto;Bold' ) ) ;
28+ t . notOk ( fontManager . isValidSystemFont ( 'Arial, sans-serif' ) ) ;
29+
30+ fontManager . restrictFont ( 'Roboto' ) ;
31+ t . ok ( fontManager . isValidSystemFont ( 'Roboto' ) ) ;
32+
33+ t . end ( ) ;
34+ } ) ;
35+
36+ test ( 'isValidCustomFont' , t => {
37+ const { fontManager} = new Runtime ( ) ;
38+ t . ok ( fontManager . isValidCustomFont ( 'Roboto' ) ) ;
39+ t . ok ( fontManager . isValidCustomFont ( 'sans-serif' ) ) ;
40+ t . ok ( fontManager . isValidCustomFont ( 'helvetica neue' ) ) ;
41+ t . notOk ( fontManager . isValidCustomFont ( 'Roboto;Bold' ) ) ;
42+ t . notOk ( fontManager . isValidCustomFont ( 'Arial, sans-serif' ) ) ;
43+
44+ fontManager . restrictFont ( 'Roboto' ) ;
45+ t . notOk ( fontManager . isValidCustomFont ( 'Roboto' ) ) ;
46+ t . notOk ( fontManager . isValidCustomFont ( 'roboto' ) ) ;
47+ t . notOk ( fontManager . isValidCustomFont ( 'ROBOTO' ) ) ;
48+ t . ok ( fontManager . isValidCustomFont ( 'Roboto ' ) ) ;
49+ t . ok ( fontManager . isValidCustomFont ( 'Roboto2' ) ) ;
50+ t . ok ( fontManager . isValidCustomFont ( 'sans-serif' ) ) ;
51+ t . ok ( fontManager . isValidCustomFont ( 'helvetica neue' ) ) ;
52+ t . notOk ( fontManager . isValidCustomFont ( 'Roboto;Bold' ) ) ;
53+ t . notOk ( fontManager . isValidCustomFont ( 'Arial, sans-serif' ) ) ;
54+
2955 t . end ( ) ;
3056} ) ;
3157
32- test ( 'getSafeName ' , t => {
58+ test ( 'getSafeSystemFont ' , t => {
3359 const { fontManager} = new Runtime ( ) ;
34- t . equal ( fontManager . getSafeName ( 'Arial' ) , 'Arial' ) ;
60+ t . equal ( fontManager . getUnusedSystemFont ( 'Arial' ) , 'Arial' ) ;
3561 fontManager . addSystemFont ( 'Arial' , 'sans-serif' ) ;
36- t . equal ( fontManager . getSafeName ( 'Arial' ) , 'Arial2' ) ;
37- t . equal ( fontManager . getSafeName ( 'Weird123!@"<>?' ) , 'Weird123' ) ;
62+ t . equal ( fontManager . getUnusedSystemFont ( 'Arial' ) , 'Arial2' ) ;
63+ t . equal ( fontManager . getUnusedSystemFont ( 'Weird123!@"<>?' ) , 'Weird123' ) ;
64+
65+ fontManager . restrictFont ( 'Restricted' ) ;
66+ t . equal ( fontManager . getUnusedSystemFont ( 'Restricted' ) , 'Restricted' ) ;
67+
68+ t . end ( ) ;
69+ } ) ;
70+
71+ test ( 'getSafeCustomFont' , t => {
72+ const { fontManager} = new Runtime ( ) ;
73+ t . equal ( fontManager . getUnusedCustomFont ( 'Arial' ) , 'Arial' ) ;
74+ fontManager . addSystemFont ( 'Arial' , 'sans-serif' ) ;
75+ t . equal ( fontManager . getUnusedCustomFont ( 'Arial' ) , 'Arial2' ) ;
76+ t . equal ( fontManager . getUnusedCustomFont ( 'Weird123!@"<>?' ) , 'Weird123' ) ;
77+
78+ fontManager . restrictFont ( 'Restricted' ) ;
79+ t . equal ( fontManager . getUnusedCustomFont ( 'Restricted' ) , 'Restricted2' ) ;
80+ t . equal ( fontManager . getUnusedCustomFont ( 'restricted' ) , 'restricted2' ) ;
81+ t . equal ( fontManager . getUnusedCustomFont ( ' restricted' ) , ' restricted' ) ;
82+
83+ fontManager . restrictFont ( 'Restricted2' ) ;
84+ t . equal ( fontManager . getUnusedCustomFont ( 'Restricted' ) , 'Restricted3' ) ;
85+ t . equal ( fontManager . getUnusedCustomFont ( 'restricted' ) , 'restricted3' ) ;
86+
87+ fontManager . addSystemFont ( 'Restricted3' ) ;
88+ t . equal ( fontManager . getUnusedCustomFont ( 'Restricted' ) , 'Restricted4' ) ;
89+ t . equal ( fontManager . getUnusedCustomFont ( 'restricted' ) , 'restricted4' ) ;
90+
3891 t . end ( ) ;
3992} ) ;
4093
@@ -58,6 +111,7 @@ test('system font', t => {
58111 fontManager . addSystemFont ( 'Noto Sans Mono' , 'monospace' ) ;
59112 t . ok ( changed , 'addSystemFont() emits change' ) ;
60113 t . ok ( fontManager . hasFont ( 'Noto Sans Mono' ) , 'updated hasFont()' ) ;
114+ t . ok ( fontManager . hasFont ( 'noto sans mono' ) , 'updated hasFont() case insensitively' ) ;
61115 t . same ( fontManager . getFonts ( ) , [
62116 {
63117 system : true ,
@@ -115,9 +169,13 @@ test('system font', t => {
115169
116170test ( 'system font validation' , t => {
117171 const { fontManager} = new Runtime ( ) ;
172+ fontManager . restrictFont ( 'Restricted' ) ;
118173 t . throws ( ( ) => {
119174 fontManager . addCustomFont ( ';' , 'monospace' ) ;
120175 } ) ;
176+ t . throws ( ( ) => {
177+ fontManager . addCustomFont ( 'Restricted' , 'monospace' ) ;
178+ } ) ;
121179 t . end ( ) ;
122180} ) ;
123181
@@ -587,3 +645,72 @@ test('deserializes ignores invalid fonts', t => {
587645 t . end ( ) ;
588646 } ) ;
589647} ) ;
648+
649+ test ( 'restrict throws on invalid input' , t => {
650+ const { fontManager} = new Runtime ( ) ;
651+ t . throws ( ( ) => {
652+ fontManager . restrictFont ( '(#@*$' ) ;
653+ } , 'Invalid font' ) ;
654+ t . end ( ) ;
655+ } ) ;
656+
657+ test ( 'restrict removes existing fonts' , t => {
658+ let setCustomFontsCalls = 0 ;
659+ const mockRenderer = {
660+ setLayerGroupOrdering : ( ) => { } ,
661+ setCustomFonts : ( ) => {
662+ setCustomFontsCalls ++ ;
663+ }
664+ } ;
665+
666+ const rt = new Runtime ( ) ;
667+ rt . attachRenderer ( mockRenderer ) ;
668+ rt . attachStorage ( makeTestStorage ( ) ) ;
669+ const { fontManager, storage} = rt ;
670+
671+ let changeEvents = 0 ;
672+ fontManager . on ( 'change' , ( ) => {
673+ changeEvents ++ ;
674+ } ) ;
675+
676+ fontManager . addSystemFont ( 'System Font' , 'sans-serif' ) ;
677+ fontManager . addCustomFont ( 'Important Font' , 'sans-serif' , storage . createAsset (
678+ storage . AssetType . Font ,
679+ 'ttf' ,
680+ new Uint8Array ( [ 11 , 12 , 13 ] ) ,
681+ null ,
682+ true
683+ ) ) ;
684+ fontManager . addCustomFont ( 'Not Important Font' , 'sans-serif' , storage . createAsset (
685+ storage . AssetType . Font ,
686+ 'ttf' ,
687+ new Uint8Array ( [ 11 , 12 , 13 ] ) ,
688+ null ,
689+ true
690+ ) ) ;
691+
692+ t . equal ( changeEvents , 3 , 'sanity check' ) ;
693+ t . equal ( setCustomFontsCalls , 2 , 'sanity check' ) ;
694+
695+ fontManager . restrictFont ( 'Not Used' ) ;
696+ t . equal ( changeEvents , 3 , 'does not emit change when unused font restricted' ) ;
697+ t . equal ( setCustomFontsCalls , 2 , 'does not emit change when unused font restricted' ) ;
698+
699+ fontManager . restrictFont ( 'System Font' ) ;
700+ t . equal ( changeEvents , 3 , 'does not emit change when system font restricted' ) ;
701+ t . equal ( setCustomFontsCalls , 2 , 'does not emit change when system font restricted' ) ;
702+
703+ fontManager . restrictFont ( 'important font' ) ;
704+ t . equal ( changeEvents , 4 , 'emits change when custom font restricted' ) ;
705+ t . equal ( setCustomFontsCalls , 3 , 'emits change when custom font restricted' ) ;
706+ t . same ( fontManager . getFonts ( ) . map ( i => i . name ) , [
707+ 'System Font' ,
708+ 'Not Important Font'
709+ ] ) ;
710+
711+ fontManager . restrictFont ( 'Important Font' ) ;
712+ t . equal ( changeEvents , 4 , 'does not emit change when restricted font restricted again' ) ;
713+ t . equal ( setCustomFontsCalls , 3 , 'does not emit change when restricted font restricted again' ) ;
714+
715+ t . end ( ) ;
716+ } ) ;
0 commit comments