|
|
|
|
| 10 |
use app_units::Au; |
10 |
use app_units::Au; |
| 11 |
use cssparser::{Delimiter, Parser, Token}; |
11 |
use cssparser::{Delimiter, Parser, Token}; |
| 12 |
use euclid::size::{Size2D, TypedSize2D}; |
12 |
use euclid::size::{Size2D, TypedSize2D}; |
| 13 |
use serialize_comma_separated_list; |
13 |
use serialize_comma_separated_list; |
| 14 |
use std::fmt::{self, Write}; |
14 |
use std::fmt::{self, Write}; |
| 15 |
use style_traits::{ToCss, ViewportPx}; |
15 |
use style_traits::{ToCss, ViewportPx}; |
| 16 |
use values::computed::{self, ToComputedValue}; |
16 |
use values::computed::{self, ToComputedValue}; |
| 17 |
use values::specified; |
17 |
use values::specified; |
| 18 |
|
18 |
use properties::ComputedValues; |
|
|
19 |
#[cfg(feature = "gecko")] |
| 20 |
use std::sync::Arc; |
| 19 |
|
21 |
|
| 20 |
#[derive(Debug, PartialEq)] |
22 |
#[derive(Debug, PartialEq)] |
| 21 |
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] |
23 |
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] |
| 22 |
pub struct MediaList { |
24 |
pub struct MediaList { |
| 23 |
pub media_queries: Vec<MediaQuery> |
25 |
pub media_queries: Vec<MediaQuery> |
| 24 |
} |
26 |
} |
| 25 |
|
27 |
|
| 26 |
impl ToCss for MediaList { |
28 |
impl ToCss for MediaList { |
|
|
| 41 |
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] |
43 |
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] |
| 42 |
pub enum Range<T> { |
44 |
pub enum Range<T> { |
| 43 |
Min(T), |
45 |
Min(T), |
| 44 |
Max(T), |
46 |
Max(T), |
| 45 |
Eq(T), |
47 |
Eq(T), |
| 46 |
} |
48 |
} |
| 47 |
|
49 |
|
| 48 |
impl Range<specified::Length> { |
50 |
impl Range<specified::Length> { |
| 49 |
fn to_computed_range(&self, viewport_size: Size2D<Au>) -> Range<Au> { |
51 |
fn to_computed_range(&self, viewport_size: Size2D<Au>, default_values: &ComputedValues) -> Range<Au> { |
| 50 |
// http://dev.w3.org/csswg/mediaqueries3/#units |
52 |
// http://dev.w3.org/csswg/mediaqueries3/#units |
| 51 |
// em units are relative to the initial font-size. |
53 |
// em units are relative to the initial font-size. |
| 52 |
let context = computed::Context::initial(viewport_size, false); |
54 |
let context = computed::Context { |
|
|
55 |
is_root_element: false, |
| 56 |
viewport_size: viewport_size, |
| 57 |
inherited_style: default_values, |
| 58 |
// This cloning business is kind of dumb.... It's because Context |
| 59 |
// insists on having an actual ComputedValues inside itself. |
| 60 |
style: default_values.clone(), |
| 61 |
font_metrics_provider: None |
| 62 |
}; |
| 53 |
|
63 |
|
| 54 |
match *self { |
64 |
match *self { |
| 55 |
Range::Min(ref width) => Range::Min(width.to_computed_value(&context)), |
65 |
Range::Min(ref width) => Range::Min(width.to_computed_value(&context)), |
| 56 |
Range::Max(ref width) => Range::Max(width.to_computed_value(&context)), |
66 |
Range::Max(ref width) => Range::Max(width.to_computed_value(&context)), |
| 57 |
Range::Eq(ref width) => Range::Eq(width.to_computed_value(&context)) |
67 |
Range::Eq(ref width) => Range::Eq(width.to_computed_value(&context)) |
| 58 |
} |
68 |
} |
| 59 |
} |
69 |
} |
| 60 |
} |
70 |
} |
|
|
| 159 |
Unknown(Atom), |
169 |
Unknown(Atom), |
| 160 |
} |
170 |
} |
| 161 |
|
171 |
|
| 162 |
#[derive(Debug)] |
172 |
#[derive(Debug)] |
| 163 |
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] |
173 |
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] |
| 164 |
pub struct Device { |
174 |
pub struct Device { |
| 165 |
pub media_type: MediaType, |
175 |
pub media_type: MediaType, |
| 166 |
pub viewport_size: TypedSize2D<f32, ViewportPx>, |
176 |
pub viewport_size: TypedSize2D<f32, ViewportPx>, |
|
|
177 |
#[cfg(feature = "gecko")] |
| 178 |
pub default_values: Arc<ComputedValues>, |
| 167 |
} |
179 |
} |
| 168 |
|
180 |
|
| 169 |
impl Device { |
181 |
impl Device { |
|
|
182 |
#[cfg(feature = "servo")] |
| 170 |
pub fn new(media_type: MediaType, viewport_size: TypedSize2D<f32, ViewportPx>) -> Device { |
183 |
pub fn new(media_type: MediaType, viewport_size: TypedSize2D<f32, ViewportPx>) -> Device { |
| 171 |
Device { |
184 |
Device { |
| 172 |
media_type: media_type, |
185 |
media_type: media_type, |
| 173 |
viewport_size: viewport_size, |
186 |
viewport_size: viewport_size, |
| 174 |
} |
187 |
} |
| 175 |
} |
188 |
} |
| 176 |
|
189 |
|
|
|
190 |
#[cfg(feature = "servo")] |
| 191 |
pub fn default_values(&self) -> &ComputedValues { |
| 192 |
ComputedValues::initial_values() |
| 193 |
} |
| 194 |
|
| 195 |
#[cfg(feature = "gecko")] |
| 196 |
pub fn new(media_type: MediaType, viewport_size: TypedSize2D<f32, ViewportPx>, |
| 197 |
default_values: &Arc<ComputedValues>) -> Device { |
| 198 |
Device { |
| 199 |
media_type: media_type, |
| 200 |
viewport_size: viewport_size, |
| 201 |
default_values: default_values.clone(), |
| 202 |
} |
| 203 |
} |
| 204 |
|
| 205 |
#[cfg(feature = "gecko")] |
| 206 |
pub fn default_values(&self) -> &ComputedValues { |
| 207 |
&*self.default_values |
| 208 |
} |
| 209 |
|
| 177 |
#[inline] |
210 |
#[inline] |
| 178 |
pub fn au_viewport_size(&self) -> Size2D<Au> { |
211 |
pub fn au_viewport_size(&self) -> Size2D<Au> { |
| 179 |
Size2D::new(Au::from_f32_px(self.viewport_size.width), |
212 |
Size2D::new(Au::from_f32_px(self.viewport_size.width), |
| 180 |
Au::from_f32_px(self.viewport_size.height)) |
213 |
Au::from_f32_px(self.viewport_size.height)) |
| 181 |
} |
214 |
} |
| 182 |
|
215 |
|
| 183 |
} |
216 |
} |
| 184 |
|
217 |
|
|
|
| 281 |
MediaQueryType::MediaType(ref media_type) => *media_type == device.media_type, |
314 |
MediaQueryType::MediaType(ref media_type) => *media_type == device.media_type, |
| 282 |
MediaQueryType::All => true, |
315 |
MediaQueryType::All => true, |
| 283 |
}; |
316 |
}; |
| 284 |
|
317 |
|
| 285 |
// Check if all conditions match (AND condition) |
318 |
// Check if all conditions match (AND condition) |
| 286 |
let query_match = media_match && mq.expressions.iter().all(|expression| { |
319 |
let query_match = media_match && mq.expressions.iter().all(|expression| { |
| 287 |
match *expression { |
320 |
match *expression { |
| 288 |
Expression::Width(ref value) => |
321 |
Expression::Width(ref value) => |
| 289 |
value.to_computed_range(viewport_size).evaluate(viewport_size.width), |
322 |
value.to_computed_range(viewport_size, device.default_values()).evaluate(viewport_size.width), |
| 290 |
} |
323 |
} |
| 291 |
}); |
324 |
}); |
| 292 |
|
325 |
|
| 293 |
// Apply the logical NOT qualifier to the result |
326 |
// Apply the logical NOT qualifier to the result |
| 294 |
match mq.qualifier { |
327 |
match mq.qualifier { |
| 295 |
Some(Qualifier::Not) => !query_match, |
328 |
Some(Qualifier::Not) => !query_match, |
| 296 |
_ => query_match, |
329 |
_ => query_match, |
| 297 |
} |
330 |
} |