Skip to content

Commit d9dd56b

Browse files
committed
Record whether viewport percentage dimensions are seen
Used to tell Servo to recalulate styles on window resize (servo/servo#8754).
1 parent d5c93cf commit d9dd56b

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

src/parser.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,20 @@ impl<'i, 't> Parser<'i, 't> {
236236
self.tokenizer.seen_var_functions()
237237
}
238238

239+
/// Start looking for viewport percentage lengths. (See the `seen_viewport_percentages`
240+
/// method.)
241+
#[inline]
242+
pub fn look_for_viewport_percentages(&mut self) {
243+
self.tokenizer.look_for_viewport_percentages()
244+
}
245+
246+
/// Return whether a `vh`, `vw`, `vmin`, or `vmax` dimension has been seen by the tokenizer
247+
/// since `look_for_viewport_percentages` was called, and stop looking.
248+
#[inline]
249+
pub fn seen_viewport_percentages(&mut self) -> bool {
250+
self.tokenizer.seen_viewport_percentages()
251+
}
252+
239253
/// Execute the given closure, passing it the parser.
240254
/// If the result (returned unchanged) is `Err`,
241255
/// the internal state of the parser (including position within the input)

src/tokenizer.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ pub struct Tokenizer<'a> {
212212
/// Cache for `source_location()`
213213
last_known_line_break: Cell<(usize, usize)>,
214214
var_functions: VarFunctions,
215+
viewport_percentages: ViewportPercentages,
215216
}
216217

217218
#[derive(Copy, Clone, PartialEq, Eq)]
@@ -221,6 +222,13 @@ enum VarFunctions {
221222
SeenAtLeastOne,
222223
}
223224

225+
#[derive(Copy, Clone, PartialEq, Eq)]
226+
enum ViewportPercentages {
227+
DontCare,
228+
LookingForThem,
229+
SeenAtLeastOne,
230+
}
231+
224232

225233
impl<'a> Tokenizer<'a> {
226234
#[inline]
@@ -230,6 +238,7 @@ impl<'a> Tokenizer<'a> {
230238
position: 0,
231239
last_known_line_break: Cell::new((1, 0)),
232240
var_functions: VarFunctions::DontCare,
241+
viewport_percentages: ViewportPercentages::DontCare,
233242
}
234243
}
235244

@@ -245,6 +254,18 @@ impl<'a> Tokenizer<'a> {
245254
seen
246255
}
247256

257+
#[inline]
258+
pub fn look_for_viewport_percentages(&mut self) {
259+
self.viewport_percentages = ViewportPercentages::LookingForThem;
260+
}
261+
262+
#[inline]
263+
pub fn seen_viewport_percentages(&mut self) -> bool {
264+
let seen = self.viewport_percentages == ViewportPercentages::SeenAtLeastOne;
265+
self.viewport_percentages = ViewportPercentages::DontCare;
266+
seen
267+
}
268+
248269
#[inline]
249270
pub fn next(&mut self) -> Result<Token<'a>, ()> {
250271
next_token(self).ok_or(())
@@ -784,7 +805,16 @@ fn consume_numeric<'a>(tokenizer: &mut Tokenizer<'a>) -> Token<'a> {
784805
has_sign: has_sign,
785806
};
786807
if is_ident_start(tokenizer) {
787-
Dimension(value, consume_name(tokenizer))
808+
let name = consume_name(tokenizer);
809+
if tokenizer.viewport_percentages == ViewportPercentages::LookingForThem {
810+
match &*name {
811+
"vh" | "vw" | "vmin" | "vmax" => {
812+
tokenizer.viewport_percentages = ViewportPercentages::SeenAtLeastOne;
813+
}
814+
_ => {}
815+
}
816+
}
817+
Dimension(value, name)
788818
} else {
789819
Number(value)
790820
}

0 commit comments

Comments
 (0)