diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-08-04 21:33:59 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-04 21:33:59 -0500 |
commit | ac37f81c1f70f6994444ca0c40ad9d91a228ec87 (patch) | |
tree | 738bf433e7115f2320e4126d3602297e1268ec07 | |
parent | 49615284d0f45646da917f7dda22a1103d12974d (diff) | |
parent | bb44c0a6bcc5e2c4be26d8187769de875b4326da (diff) | |
download | servo-ac37f81c1f70f6994444ca0c40ad9d91a228ec87.tar.gz servo-ac37f81c1f70f6994444ca0c40ad9d91a228ec87.zip |
Auto merge of #17972 - heycam:ignore-existing, r=bholley
style: Allow styles to be computed ignoring existing element data.
From https://bugzilla.mozilla.org/show_bug.cgi?id=1384824.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/17972)
<!-- Reviewable:end -->
-rw-r--r-- | components/layout/query.rs | 2 | ||||
-rw-r--r-- | components/style/gecko/generated/bindings.rs | 3 | ||||
-rw-r--r-- | components/style/properties/gecko.mako.rs | 20 | ||||
-rw-r--r-- | components/style/properties/longhand/font.mako.rs | 46 | ||||
-rw-r--r-- | components/style/traversal.rs | 4 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 10 | ||||
-rw-r--r-- | tests/unit/gfx/font_cache_thread.rs | 6 | ||||
-rw-r--r-- | tests/unit/style/stylesheets.rs | 4 |
8 files changed, 64 insertions, 31 deletions
diff --git a/components/layout/query.rs b/components/layout/query.rs index 252071e9bcd..fd9a97f44cc 100644 --- a/components/layout/query.rs +++ b/components/layout/query.rs @@ -702,7 +702,7 @@ pub fn process_resolved_style_request<'a, N>(context: &LayoutContext, thread_local: &mut tlc, }; - let styles = resolve_style(&mut context, element, RuleInclusion::All); + let styles = resolve_style(&mut context, element, RuleInclusion::All, false); let style = styles.primary(); let longhand_id = match *property { PropertyId::Longhand(id) => id, diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index b6703ab95bf..68036f26e89 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -2827,7 +2827,8 @@ extern "C" { rule_inclusion: StyleRuleInclusion, snapshots: *const ServoElementSnapshotTable, - set: RawServoStyleSetBorrowed) + set: RawServoStyleSetBorrowed, + ignore_existing_styles: bool) -> ServoStyleContextStrong; } extern "C" { diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 839fdeb1dc7..11beac20070 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -2181,7 +2181,7 @@ fn static_assert() { } pub fn set_font_family(&mut self, v: longhands::font_family::computed_value::T) { - use properties::longhands::font_family::computed_value::FontFamily; + use properties::longhands::font_family::computed_value::{FontFamily, FamilyNameSyntax}; let list = &mut self.gecko.mFont.fontlist; unsafe { Gecko_FontFamilyList_Clear(list); } @@ -2191,7 +2191,8 @@ fn static_assert() { for family in &v.0 { match *family { FontFamily::FamilyName(ref f) => { - unsafe { Gecko_FontFamilyList_AppendNamed(list, f.name.as_ptr(), f.quoted); } + let quoted = matches!(f.syntax, FamilyNameSyntax::Quoted); + unsafe { Gecko_FontFamilyList_AppendNamed(list, f.name.as_ptr(), quoted); } } FontFamily::Generic(ref name) => { let (family_type, generic) = FontFamily::generic(name); @@ -2222,7 +2223,7 @@ fn static_assert() { } pub fn clone_font_family(&self) -> longhands::font_family::computed_value::T { - use properties::longhands::font_family::computed_value::{FontFamily, FamilyName}; + use properties::longhands::font_family::computed_value::{FontFamily, FamilyName, FamilyNameSyntax}; use gecko_bindings::structs::FontFamilyType; use gecko_string_cache::Atom; @@ -2235,13 +2236,16 @@ fn static_assert() { FontFamilyType::eFamily_cursive => FontFamily::Generic(atom!("cursive")), FontFamilyType::eFamily_fantasy => FontFamily::Generic(atom!("fantasy")), FontFamilyType::eFamily_moz_fixed => FontFamily::Generic(Atom::from("-moz-fixed")), - FontFamilyType::eFamily_named => FontFamily::FamilyName(FamilyName { - name: (&*gecko_font_family_name.mName).into(), - quoted: false - }), + FontFamilyType::eFamily_named => { + let name = Atom::from(&*gecko_font_family_name.mName); + FontFamily::FamilyName(FamilyName { + name: name.clone(), + syntax: FamilyNameSyntax::Identifiers(vec![name]), + }) + }, FontFamilyType::eFamily_named_quoted => FontFamily::FamilyName(FamilyName { name: (&*gecko_font_family_name.mName).into(), - quoted: true + syntax: FamilyNameSyntax::Quoted, }), x => panic!("Found unexpected font FontFamilyType: {:?}", x), } diff --git a/components/style/properties/longhand/font.mako.rs b/components/style/properties/longhand/font.mako.rs index cbf6df1f44e..aa12419248c 100644 --- a/components/style/properties/longhand/font.mako.rs +++ b/components/style/properties/longhand/font.mako.rs @@ -96,7 +96,14 @@ macro_rules! impl_gecko_keyword_conversions { #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] pub struct FamilyName { pub name: Atom, - pub quoted: bool, + pub syntax: FamilyNameSyntax, + } + + #[derive(Debug, PartialEq, Eq, Clone, Hash)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf, Deserialize, Serialize))] + pub enum FamilyNameSyntax { + Quoted, + Identifiers(Vec<Atom>), } impl FontFamily { @@ -139,7 +146,7 @@ macro_rules! impl_gecko_keyword_conversions { // quoted by default. FontFamily::FamilyName(FamilyName { name: input, - quoted: true, + syntax: FamilyNameSyntax::Quoted, }) } @@ -148,10 +155,14 @@ macro_rules! impl_gecko_keyword_conversions { if let Ok(value) = input.try(|i| i.expect_string_cloned()) { return Ok(FontFamily::FamilyName(FamilyName { name: Atom::from(&*value), - quoted: true, + syntax: FamilyNameSyntax::Quoted, })) } + + let mut identifiers = vec![]; + let first_ident = input.expect_ident()?.clone(); + identifiers.push(Atom::from(&*first_ident)); // FIXME(bholley): The fast thing to do here would be to look up the // string (as lowercase) in the static atoms table. We don't have an @@ -188,14 +199,16 @@ macro_rules! impl_gecko_keyword_conversions { let ident = input.expect_ident()?; value.push_str(" "); value.push_str(&ident); + identifiers.push(Atom::from(&*ident.clone())); } while let Ok(ident) = input.try(|i| i.expect_ident_cloned()) { value.push_str(" "); value.push_str(&ident); + identifiers.push(Atom::from(&*ident)); } Ok(FontFamily::FamilyName(FamilyName { name: Atom::from(value), - quoted: false, + syntax: FamilyNameSyntax::Identifiers(identifiers), })) } @@ -229,12 +242,23 @@ macro_rules! impl_gecko_keyword_conversions { impl ToCss for FamilyName { fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - if self.quoted { - dest.write_char('"')?; - write!(CssStringWriter::new(dest), "{}", self.name)?; - dest.write_char('"') - } else { - serialize_identifier(&*self.name.to_string(), dest) + match self.syntax { + FamilyNameSyntax::Quoted => { + dest.write_char('"')?; + write!(CssStringWriter::new(dest), "{}", self.name)?; + dest.write_char('"') + } + FamilyNameSyntax::Identifiers(ref identifiers) => { + let mut first = true; + for identifier in identifiers { + if !first { + dest.write_char(' ')?; + } + serialize_identifier(&*identifier.to_string(), dest)?; + first = false; + } + Ok(()) + } } } } @@ -2508,7 +2532,7 @@ ${helpers.single_keyword("-moz-math-variant", use properties::longhands::font_family::computed_value::*; FontFamily::FamilyName(FamilyName { name: (&*font.mName).into(), - quoted: true + syntax: FamilyNameSyntax::Quoted, }) }).collect::<Vec<_>>(); let weight = longhands::font_weight::computed_value::T::from_gecko_weight(system.weight); diff --git a/components/style/traversal.rs b/components/style/traversal.rs index 4640f7c9e0f..39206303ae3 100644 --- a/components/style/traversal.rs +++ b/components/style/traversal.rs @@ -391,6 +391,7 @@ pub fn resolve_style<E>( context: &mut StyleContext<E>, element: E, rule_inclusion: RuleInclusion, + ignore_existing_style: bool, ) -> ElementStyles where E: TElement, @@ -398,6 +399,7 @@ where use style_resolver::StyleResolverForElement; debug_assert!(rule_inclusion == RuleInclusion::DefaultOnly || + ignore_existing_style || element.borrow_data().map_or(true, |d| !d.has_styles()), "Why are we here?"); let mut ancestors_requiring_style_resolution = SmallVec::<[E; 16]>::new(); @@ -408,7 +410,7 @@ where let mut style = None; let mut ancestor = element.traversal_parent(); while let Some(current) = ancestor { - if rule_inclusion == RuleInclusion::All { + if rule_inclusion == RuleInclusion::All && !ignore_existing_style { if let Some(data) = current.borrow_data() { if let Some(ancestor_style) = data.styles.get_primary() { style = Some(ancestor_style.clone()); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index e69959f3710..1fa8516acc9 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -2831,7 +2831,8 @@ pub extern "C" fn Servo_ResolveStyleLazily(element: RawGeckoElementBorrowed, pseudo_type: CSSPseudoElementType, rule_inclusion: StyleRuleInclusion, snapshots: *const ServoElementSnapshotTable, - raw_data: RawServoStyleSetBorrowed) + raw_data: RawServoStyleSetBorrowed, + ignore_existing_styles: bool) -> ServoStyleContextStrong { debug_assert!(!snapshots.is_null()); @@ -2862,8 +2863,9 @@ pub extern "C" fn Servo_ResolveStyleLazily(element: RawGeckoElementBorrowed, // In the common case we already have the style. Check that before setting // up all the computation machinery. (Don't use it when we're getting - // default styles, though.) - if rule_inclusion == RuleInclusion::All { + // default styles or in a bfcached document (as indicated by + // ignore_existing_styles), though.) + if rule_inclusion == RuleInclusion::All && !ignore_existing_styles { let styles = element.mutate_data().and_then(|d| { if d.has_styles() { Some(finish(&d.styles)) @@ -2888,7 +2890,7 @@ pub extern "C" fn Servo_ResolveStyleLazily(element: RawGeckoElementBorrowed, thread_local: &mut tlc, }; - let styles = resolve_style(&mut context, element, rule_inclusion); + let styles = resolve_style(&mut context, element, rule_inclusion, ignore_existing_styles); finish(&styles).into() } diff --git a/tests/unit/gfx/font_cache_thread.rs b/tests/unit/gfx/font_cache_thread.rs index 91e5b712dc7..e60ca8b9ba4 100644 --- a/tests/unit/gfx/font_cache_thread.rs +++ b/tests/unit/gfx/font_cache_thread.rs @@ -5,7 +5,7 @@ use cssparser::SourceLocation; use gfx::font_cache_thread::FontCacheThread; use ipc_channel::ipc; -use style::computed_values::font_family::FamilyName; +use style::computed_values::font_family::{FamilyName, FamilyNameSyntax}; use style::font_face::{FontFaceRuleData, Source}; #[test] @@ -15,11 +15,11 @@ fn test_local_web_font() { let font_cache_thread = FontCacheThread::new(inp_chan, None); let family_name = FamilyName { name: From::from("test family"), - quoted: true, + syntax: FamilyNameSyntax::Quoted, }; let variant_name = FamilyName { name: From::from("test font face"), - quoted: true, + syntax: FamilyNameSyntax::Quoted, }; let font_face_rule = FontFaceRuleData { family: Some(family_name.clone()), diff --git a/tests/unit/style/stylesheets.rs b/tests/unit/style/stylesheets.rs index 16a9eca1a10..4577869b65f 100644 --- a/tests/unit/style/stylesheets.rs +++ b/tests/unit/style/stylesheets.rs @@ -14,7 +14,7 @@ use servo_url::ServoUrl; use std::borrow::ToOwned; use std::sync::Mutex; use std::sync::atomic::AtomicBool; -use style::computed_values::font_family::FamilyName; +use style::computed_values::font_family::{FamilyName, FamilyNameSyntax}; use style::context::QuirksMode; use style::error_reporting::{ParseErrorReporter, ContextualParseError}; use style::media_queries::MediaList; @@ -254,7 +254,7 @@ fn test_parse_stylesheet() { CssRule::FontFeatureValues(Arc::new(stylesheet.shared_lock.wrap(FontFeatureValuesRule { family_names: vec![FamilyName { name: Atom::from("test"), - quoted: false, + syntax: FamilyNameSyntax::Identifiers(vec![Atom::from("test")]), }], swash: vec![ FFVDeclaration { |