aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/style/gecko/data.rs8
-rw-r--r--components/style/stylist.rs43
-rw-r--r--ports/geckolib/glue.rs13
3 files changed, 52 insertions, 12 deletions
diff --git a/components/style/gecko/data.rs b/components/style/gecko/data.rs
index bf71114da37..4108e073945 100644
--- a/components/style/gecko/data.rs
+++ b/components/style/gecko/data.rs
@@ -4,9 +4,11 @@
//! Data needed to style a Gecko document.
+use Atom;
use animation::Animation;
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
use dom::OpaqueNode;
+use gecko::rules::{CounterStyleRule, FontFaceRule};
use gecko_bindings::bindings::RawServoStyleSet;
use gecko_bindings::structs::RawGeckoPresContextOwned;
use gecko_bindings::structs::nsIDocument;
@@ -19,7 +21,7 @@ use std::collections::HashMap;
use std::sync::mpsc::{Receiver, Sender, channel};
use stylearc::Arc;
use stylesheet_set::StylesheetSet;
-use stylesheets::{FontFaceRule, Origin};
+use stylesheets::Origin;
use stylist::{ExtraStyleData, Stylist};
/// The container for data that a Servo-backed Gecko document needs to style
@@ -47,6 +49,8 @@ pub struct PerDocumentStyleDataImpl {
/// List of effective font face rules.
pub font_faces: Vec<(Arc<Locked<FontFaceRule>>, Origin)>,
+ /// Map for effective counter style rules.
+ pub counter_styles: HashMap<Atom, Arc<Locked<CounterStyleRule>>>,
}
/// The data itself is an `AtomicRefCell`, which guarantees the proper semantics
@@ -71,6 +75,7 @@ impl PerDocumentStyleData {
running_animations: Arc::new(RwLock::new(HashMap::new())),
expired_animations: Arc::new(RwLock::new(HashMap::new())),
font_faces: vec![],
+ counter_styles: HashMap::new(),
}))
}
@@ -103,6 +108,7 @@ impl PerDocumentStyleDataImpl {
let mut extra_data = ExtraStyleData {
font_faces: &mut self.font_faces,
+ counter_styles: &mut self.counter_styles,
};
let author_style_disabled = self.stylesheets.author_style_disabled();
diff --git a/components/style/stylist.rs b/components/style/stylist.rs
index 5f64588d186..05ec01cc2bc 100644
--- a/components/style/stylist.rs
+++ b/components/style/stylist.rs
@@ -14,6 +14,8 @@ use dom::{AnimationRules, TElement};
use element_state::ElementState;
use error_reporting::RustLogReporter;
use font_metrics::FontMetricsProvider;
+#[cfg(feature = "gecko")]
+use gecko_bindings::structs::nsIAtom;
use keyframes::KeyframesAnimation;
use media_queries::Device;
use pdqsort::sort_by;
@@ -41,7 +43,10 @@ use std::hash::Hash;
use std::marker::PhantomData;
use style_traits::viewport::ViewportConstraints;
use stylearc::Arc;
-use stylesheets::{CssRule, FontFaceRule, Origin, StyleRule, Stylesheet, UserAgentStylesheets};
+#[cfg(feature = "gecko")]
+use stylesheets::{CounterStyleRule, FontFaceRule};
+use stylesheets::{CssRule, Origin};
+use stylesheets::{StyleRule, Stylesheet, UserAgentStylesheets};
#[cfg(feature = "servo")]
use stylesheets::NestedRulesResult;
use thread_state;
@@ -159,33 +164,44 @@ pub struct Stylist {
/// This struct holds data which user of Stylist may want to extract
/// from stylesheets which can be done at the same time as updating.
+#[cfg(feature = "gecko")]
pub struct ExtraStyleData<'a> {
/// A list of effective font-face rules and their origin.
- #[cfg(feature = "gecko")]
pub font_faces: &'a mut Vec<(Arc<Locked<FontFaceRule>>, Origin)>,
-
- #[allow(missing_docs)]
- #[cfg(feature = "servo")]
- pub marker: PhantomData<&'a usize>,
+ /// A map of effective counter-style rules.
+ pub counter_styles: &'a mut HashMap<Atom, Arc<Locked<CounterStyleRule>>>,
}
#[cfg(feature = "gecko")]
impl<'a> ExtraStyleData<'a> {
- /// Clear the internal @font-face rule list.
- fn clear_font_faces(&mut self) {
+ /// Clear the internal data.
+ fn clear(&mut self) {
self.font_faces.clear();
+ self.counter_styles.clear();
}
/// Add the given @font-face rule.
fn add_font_face(&mut self, rule: &Arc<Locked<FontFaceRule>>, origin: Origin) {
self.font_faces.push((rule.clone(), origin));
}
+
+ /// Add the given @counter-style rule.
+ fn add_counter_style(&mut self, guard: &SharedRwLockReadGuard,
+ rule: &Arc<Locked<CounterStyleRule>>) {
+ let name = rule.read_with(guard).mName.raw::<nsIAtom>().into();
+ self.counter_styles.insert(name, rule.clone());
+ }
+}
+
+#[allow(missing_docs)]
+#[cfg(feature = "servo")]
+pub struct ExtraStyleData<'a> {
+ pub marker: PhantomData<&'a usize>,
}
#[cfg(feature = "servo")]
impl<'a> ExtraStyleData<'a> {
- fn clear_font_faces(&mut self) {}
- fn add_font_face(&mut self, _: &Arc<Locked<FontFaceRule>>, _: Origin) {}
+ fn clear(&mut self) {}
}
impl Stylist {
@@ -334,7 +350,7 @@ impl Stylist {
self.pseudos_map.insert(pseudo, PerPseudoElementSelectorMap::new());
});
- extra_data.clear_font_faces();
+ extra_data.clear();
if let Some(ua_stylesheets) = ua_stylesheets {
for stylesheet in &ua_stylesheets.user_or_user_agent_stylesheets {
@@ -434,9 +450,14 @@ impl Stylist {
self.animations.insert(keyframes_rule.name.as_atom().clone(), animation);
}
}
+ #[cfg(feature = "gecko")]
CssRule::FontFace(ref rule) => {
extra_data.add_font_face(&rule, stylesheet.origin);
}
+ #[cfg(feature = "gecko")]
+ CssRule::CounterStyle(ref rule) => {
+ extra_data.add_counter_style(guard, &rule);
+ }
// We don't care about any other rule.
_ => {}
}
diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs
index ca5a66c5405..f7aca89a524 100644
--- a/ports/geckolib/glue.rs
+++ b/ports/geckolib/glue.rs
@@ -2385,6 +2385,19 @@ pub extern "C" fn Servo_StyleSet_GetFontFaceRules(raw_data: RawServoStyleSetBorr
}
#[no_mangle]
+pub extern "C" fn Servo_StyleSet_GetCounterStyleRule(raw_data: RawServoStyleSetBorrowed,
+ name: *mut nsIAtom) -> *mut nsCSSCounterStyleRule {
+ let data = PerDocumentStyleData::from_ffi(raw_data).borrow();
+ unsafe {
+ Atom::with(name, |name| data.counter_styles.get(name))
+ }.map(|rule| {
+ let global_style_data = &*GLOBAL_STYLE_DATA;
+ let guard = global_style_data.shared_lock.read();
+ rule.read_with(&guard).get()
+ }).unwrap_or(ptr::null_mut())
+}
+
+#[no_mangle]
pub extern "C" fn Servo_StyleSet_ResolveForDeclarations(raw_data: RawServoStyleSetBorrowed,
parent_style_or_null: ServoComputedValuesBorrowedOrNull,
declarations: RawServoDeclarationBlockBorrowed)