@@ -211,11 +211,12 @@ pub struct Tokenizer<'a> {
211
211
position : usize ,
212
212
/// Cache for `source_location()`
213
213
last_known_line_break : Cell < ( usize , usize ) > ,
214
- var_functions : VarFunctions ,
214
+ var_functions : SeenStatus ,
215
+ viewport_percentages : SeenStatus ,
215
216
}
216
217
217
218
#[ derive( Copy , Clone , PartialEq , Eq ) ]
218
- enum VarFunctions {
219
+ enum SeenStatus {
219
220
DontCare ,
220
221
LookingForThem ,
221
222
SeenAtLeastOne ,
@@ -229,19 +230,32 @@ impl<'a> Tokenizer<'a> {
229
230
input : input,
230
231
position : 0 ,
231
232
last_known_line_break : Cell :: new ( ( 1 , 0 ) ) ,
232
- var_functions : VarFunctions :: DontCare ,
233
+ var_functions : SeenStatus :: DontCare ,
234
+ viewport_percentages : SeenStatus :: DontCare ,
233
235
}
234
236
}
235
237
236
238
#[ inline]
237
239
pub fn look_for_var_functions ( & mut self ) {
238
- self . var_functions = VarFunctions :: LookingForThem ;
240
+ self . var_functions = SeenStatus :: LookingForThem ;
239
241
}
240
242
241
243
#[ inline]
242
244
pub fn seen_var_functions ( & mut self ) -> bool {
243
- let seen = self . var_functions == VarFunctions :: SeenAtLeastOne ;
244
- self . var_functions = VarFunctions :: DontCare ;
245
+ let seen = self . var_functions == SeenStatus :: SeenAtLeastOne ;
246
+ self . var_functions = SeenStatus :: DontCare ;
247
+ seen
248
+ }
249
+
250
+ #[ inline]
251
+ pub fn look_for_viewport_percentages ( & mut self ) {
252
+ self . viewport_percentages = SeenStatus :: LookingForThem ;
253
+ }
254
+
255
+ #[ inline]
256
+ pub fn seen_viewport_percentages ( & mut self ) -> bool {
257
+ let seen = self . viewport_percentages == SeenStatus :: SeenAtLeastOne ;
258
+ self . viewport_percentages = SeenStatus :: DontCare ;
245
259
seen
246
260
}
247
261
@@ -630,9 +644,9 @@ fn consume_ident_like<'a>(tokenizer: &mut Tokenizer<'a>) -> Token<'a> {
630
644
if value. eq_ignore_ascii_case ( "url" ) {
631
645
consume_unquoted_url ( tokenizer) . unwrap_or ( Function ( value) )
632
646
} else {
633
- if tokenizer. var_functions == VarFunctions :: LookingForThem &&
647
+ if tokenizer. var_functions == SeenStatus :: LookingForThem &&
634
648
value. eq_ignore_ascii_case ( "var" ) {
635
- tokenizer. var_functions = VarFunctions :: SeenAtLeastOne ;
649
+ tokenizer. var_functions = SeenStatus :: SeenAtLeastOne ;
636
650
}
637
651
Function ( value)
638
652
}
@@ -784,7 +798,16 @@ fn consume_numeric<'a>(tokenizer: &mut Tokenizer<'a>) -> Token<'a> {
784
798
has_sign : has_sign,
785
799
} ;
786
800
if is_ident_start ( tokenizer) {
787
- Dimension ( value, consume_name ( tokenizer) )
801
+ let name = consume_name ( tokenizer) ;
802
+ if tokenizer. viewport_percentages == SeenStatus :: LookingForThem {
803
+ if name. eq_ignore_ascii_case ( "vh" ) ||
804
+ name. eq_ignore_ascii_case ( "vw" ) ||
805
+ name. eq_ignore_ascii_case ( "vmin" ) ||
806
+ name. eq_ignore_ascii_case ( "vmax" ) {
807
+ tokenizer. viewport_percentages = SeenStatus :: SeenAtLeastOne ;
808
+ }
809
+ }
810
+ Dimension ( value, name)
788
811
} else {
789
812
Number ( value)
790
813
}
0 commit comments