aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-08-04 21:33:59 -0500
committerGitHub <noreply@github.com>2017-08-04 21:33:59 -0500
commitac37f81c1f70f6994444ca0c40ad9d91a228ec87 (patch)
tree738bf433e7115f2320e4126d3602297e1268ec07
parent49615284d0f45646da917f7dda22a1103d12974d (diff)
parentbb44c0a6bcc5e2c4be26d8187769de875b4326da (diff)
downloadservo-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.rs2
-rw-r--r--components/style/gecko/generated/bindings.rs3
-rw-r--r--components/style/properties/gecko.mako.rs20
-rw-r--r--components/style/properties/longhand/font.mako.rs46
-rw-r--r--components/style/traversal.rs4
-rw-r--r--ports/geckolib/glue.rs10
-rw-r--r--tests/unit/gfx/font_cache_thread.rs6
-rw-r--r--tests/unit/style/stylesheets.rs4
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 {