diff options
author | Till Schneidereit <till@tillschneidereit.net> | 2015-10-05 17:18:17 +0200 |
---|---|---|
committer | Till Schneidereit <till@tillschneidereit.net> | 2015-11-07 16:19:13 +0100 |
commit | f1b6c7cc99d0804daa52753d02368927176b6c05 (patch) | |
tree | 80710cdea6ed3abce35ade23a8fc781ae0ab45fa | |
parent | f173504ded726ddecf7a92f1864ba6e9662d9eae (diff) | |
download | servo-f1b6c7cc99d0804daa52753d02368927176b6c05.tar.gz servo-f1b6c7cc99d0804daa52753d02368927176b6c05.zip |
Let Stylist compute and store viewport constraints when setting the device
-rw-r--r-- | components/layout/layout_task.rs | 4 | ||||
-rw-r--r-- | components/style/selector_matching.rs | 31 | ||||
-rw-r--r-- | components/style_traits/viewport.rs | 2 |
3 files changed, 24 insertions, 13 deletions
diff --git a/components/layout/layout_task.rs b/components/layout/layout_task.rs index cb3fe04eb57..46f889de0a3 100644 --- a/components/layout/layout_task.rs +++ b/components/layout/layout_task.rs @@ -1077,7 +1077,7 @@ impl LayoutTask { flow_ref::deref_mut(layout_root)); let root_size = { let root_flow = flow::base(&**layout_root); - if rw_data.stylist.constrain_viewport().is_some() { + if rw_data.stylist.get_viewport_constraints().is_some() { root_flow.position.size.to_physical(root_flow.writing_mode) } else { root_flow.overflow.size @@ -1164,7 +1164,7 @@ impl LayoutTask { let device = Device::new(MediaType::Screen, initial_viewport); rw_data.stylist.set_device(device); - let constraints = rw_data.stylist.constrain_viewport(); + let constraints = rw_data.stylist.get_viewport_constraints(); rw_data.viewport_size = match constraints { Some(ref constraints) => { debug!("Viewport constraints: {:?}", constraints); diff --git a/components/style/selector_matching.rs b/components/style/selector_matching.rs index 4ceedb1f51e..5c66a05aa1d 100644 --- a/components/style/selector_matching.rs +++ b/components/style/selector_matching.rs @@ -3,7 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use legacy::PresentationalHintSynthesis; -use media_queries::Device; +use media_queries::{Device, MediaType}; use node::TElementAttributes; use properties::{PropertyDeclaration, PropertyDeclarationBlock}; use restyle_hints::{RestyleHint, StateDependencySet}; @@ -63,6 +63,9 @@ pub struct Stylist { // Device that the stylist is currently evaluating against. pub device: Device, + // Viewport constraints based on the current device. + viewport_constraints: Option<ViewportConstraints>, + // If true, a stylesheet has been added or the device has // changed, and the stylist needs to be updated. is_dirty: bool, @@ -83,6 +86,7 @@ impl Stylist { pub fn new(device: Device) -> Stylist { let stylist = Stylist { stylesheets: vec!(), + viewport_constraints: None, device: device, is_dirty: true, @@ -101,14 +105,6 @@ impl Stylist { &self.stylesheets } - pub fn constrain_viewport(&self) -> Option<ViewportConstraints> { - let cascaded_rule = self.stylesheets.iter() - .flat_map(|s| s.effective_rules(&self.device).viewport()) - .cascade(); - - ViewportConstraints::maybe_new(self.device.viewport_size, &cascaded_rule) - } - pub fn update(&mut self) -> bool { if self.is_dirty { self.element_map = PerPseudoElementSelectorMap::new(); @@ -187,7 +183,15 @@ impl Stylist { self.state_deps.compute_hint(element, current_state, state_change) } - pub fn set_device(&mut self, device: Device) { + pub fn set_device(&mut self, mut device: Device) { + let cascaded_rule = self.stylesheets.iter() + .flat_map(|s| s.effective_rules(&self.device).viewport()) + .cascade(); + + self.viewport_constraints = ViewportConstraints::maybe_new(self.device.viewport_size, &cascaded_rule); + if let Some(ref constraints) = self.viewport_constraints { + device = Device::new(MediaType::Screen, constraints.size); + } let is_dirty = self.is_dirty || self.stylesheets.iter() .flat_map(|stylesheet| stylesheet.rules().media()) .any(|media_rule| media_rule.evaluate(&self.device) != media_rule.evaluate(&device)); @@ -196,6 +200,13 @@ impl Stylist { self.is_dirty |= is_dirty; } + pub fn get_viewport_constraints(&self) -> Option<ViewportConstraints> { + match self.viewport_constraints { + Some(ref constraints) => Some(constraints.clone()), + None => None + } + } + pub fn add_quirks_mode_stylesheet(&mut self) { match read_resource_file(&["quirks-mode.css"]) { Ok(res) => { diff --git a/components/style_traits/viewport.rs b/components/style_traits/viewport.rs index e08fc3909c6..186fc6f2f17 100644 --- a/components/style_traits/viewport.rs +++ b/components/style_traits/viewport.rs @@ -20,7 +20,7 @@ define_css_keyword_enum!(Orientation: "landscape" => Landscape); -#[derive(Debug, PartialEq, Deserialize, Serialize)] +#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)] pub struct ViewportConstraints { pub size: TypedSize2D<ViewportPx, f32>, |