mirror of
https://github.com/servo/servo.git
synced 2025-06-22 08:08:59 +01:00
Enable querying counter-style rule on Servo backend.
This commit is contained in:
parent
0667287bf6
commit
3e00a91e20
3 changed files with 52 additions and 12 deletions
|
@ -4,9 +4,11 @@
|
||||||
|
|
||||||
//! Data needed to style a Gecko document.
|
//! Data needed to style a Gecko document.
|
||||||
|
|
||||||
|
use Atom;
|
||||||
use animation::Animation;
|
use animation::Animation;
|
||||||
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
use atomic_refcell::{AtomicRef, AtomicRefCell, AtomicRefMut};
|
||||||
use dom::OpaqueNode;
|
use dom::OpaqueNode;
|
||||||
|
use gecko::rules::{CounterStyleRule, FontFaceRule};
|
||||||
use gecko_bindings::bindings::RawServoStyleSet;
|
use gecko_bindings::bindings::RawServoStyleSet;
|
||||||
use gecko_bindings::structs::RawGeckoPresContextOwned;
|
use gecko_bindings::structs::RawGeckoPresContextOwned;
|
||||||
use gecko_bindings::structs::nsIDocument;
|
use gecko_bindings::structs::nsIDocument;
|
||||||
|
@ -19,7 +21,7 @@ use std::collections::HashMap;
|
||||||
use std::sync::mpsc::{Receiver, Sender, channel};
|
use std::sync::mpsc::{Receiver, Sender, channel};
|
||||||
use stylearc::Arc;
|
use stylearc::Arc;
|
||||||
use stylesheet_set::StylesheetSet;
|
use stylesheet_set::StylesheetSet;
|
||||||
use stylesheets::{FontFaceRule, Origin};
|
use stylesheets::Origin;
|
||||||
use stylist::{ExtraStyleData, Stylist};
|
use stylist::{ExtraStyleData, Stylist};
|
||||||
|
|
||||||
/// The container for data that a Servo-backed Gecko document needs to style
|
/// 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.
|
/// List of effective font face rules.
|
||||||
pub font_faces: Vec<(Arc<Locked<FontFaceRule>>, Origin)>,
|
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
|
/// 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())),
|
running_animations: Arc::new(RwLock::new(HashMap::new())),
|
||||||
expired_animations: Arc::new(RwLock::new(HashMap::new())),
|
expired_animations: Arc::new(RwLock::new(HashMap::new())),
|
||||||
font_faces: vec![],
|
font_faces: vec![],
|
||||||
|
counter_styles: HashMap::new(),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,6 +108,7 @@ impl PerDocumentStyleDataImpl {
|
||||||
|
|
||||||
let mut extra_data = ExtraStyleData {
|
let mut extra_data = ExtraStyleData {
|
||||||
font_faces: &mut self.font_faces,
|
font_faces: &mut self.font_faces,
|
||||||
|
counter_styles: &mut self.counter_styles,
|
||||||
};
|
};
|
||||||
|
|
||||||
let author_style_disabled = self.stylesheets.author_style_disabled();
|
let author_style_disabled = self.stylesheets.author_style_disabled();
|
||||||
|
|
|
@ -14,6 +14,8 @@ use dom::{AnimationRules, TElement};
|
||||||
use element_state::ElementState;
|
use element_state::ElementState;
|
||||||
use error_reporting::RustLogReporter;
|
use error_reporting::RustLogReporter;
|
||||||
use font_metrics::FontMetricsProvider;
|
use font_metrics::FontMetricsProvider;
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
|
use gecko_bindings::structs::nsIAtom;
|
||||||
use keyframes::KeyframesAnimation;
|
use keyframes::KeyframesAnimation;
|
||||||
use media_queries::Device;
|
use media_queries::Device;
|
||||||
use pdqsort::sort_by;
|
use pdqsort::sort_by;
|
||||||
|
@ -41,7 +43,10 @@ use std::hash::Hash;
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use style_traits::viewport::ViewportConstraints;
|
use style_traits::viewport::ViewportConstraints;
|
||||||
use stylearc::Arc;
|
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")]
|
#[cfg(feature = "servo")]
|
||||||
use stylesheets::NestedRulesResult;
|
use stylesheets::NestedRulesResult;
|
||||||
use thread_state;
|
use thread_state;
|
||||||
|
@ -159,33 +164,44 @@ pub struct Stylist {
|
||||||
|
|
||||||
/// This struct holds data which user of Stylist may want to extract
|
/// This struct holds data which user of Stylist may want to extract
|
||||||
/// from stylesheets which can be done at the same time as updating.
|
/// from stylesheets which can be done at the same time as updating.
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
pub struct ExtraStyleData<'a> {
|
pub struct ExtraStyleData<'a> {
|
||||||
/// A list of effective font-face rules and their origin.
|
/// A list of effective font-face rules and their origin.
|
||||||
#[cfg(feature = "gecko")]
|
|
||||||
pub font_faces: &'a mut Vec<(Arc<Locked<FontFaceRule>>, Origin)>,
|
pub font_faces: &'a mut Vec<(Arc<Locked<FontFaceRule>>, Origin)>,
|
||||||
|
/// A map of effective counter-style rules.
|
||||||
#[allow(missing_docs)]
|
pub counter_styles: &'a mut HashMap<Atom, Arc<Locked<CounterStyleRule>>>,
|
||||||
#[cfg(feature = "servo")]
|
|
||||||
pub marker: PhantomData<&'a usize>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "gecko")]
|
#[cfg(feature = "gecko")]
|
||||||
impl<'a> ExtraStyleData<'a> {
|
impl<'a> ExtraStyleData<'a> {
|
||||||
/// Clear the internal @font-face rule list.
|
/// Clear the internal data.
|
||||||
fn clear_font_faces(&mut self) {
|
fn clear(&mut self) {
|
||||||
self.font_faces.clear();
|
self.font_faces.clear();
|
||||||
|
self.counter_styles.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add the given @font-face rule.
|
/// Add the given @font-face rule.
|
||||||
fn add_font_face(&mut self, rule: &Arc<Locked<FontFaceRule>>, origin: Origin) {
|
fn add_font_face(&mut self, rule: &Arc<Locked<FontFaceRule>>, origin: Origin) {
|
||||||
self.font_faces.push((rule.clone(), 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")]
|
#[cfg(feature = "servo")]
|
||||||
impl<'a> ExtraStyleData<'a> {
|
impl<'a> ExtraStyleData<'a> {
|
||||||
fn clear_font_faces(&mut self) {}
|
fn clear(&mut self) {}
|
||||||
fn add_font_face(&mut self, _: &Arc<Locked<FontFaceRule>>, _: Origin) {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Stylist {
|
impl Stylist {
|
||||||
|
@ -334,7 +350,7 @@ impl Stylist {
|
||||||
self.pseudos_map.insert(pseudo, PerPseudoElementSelectorMap::new());
|
self.pseudos_map.insert(pseudo, PerPseudoElementSelectorMap::new());
|
||||||
});
|
});
|
||||||
|
|
||||||
extra_data.clear_font_faces();
|
extra_data.clear();
|
||||||
|
|
||||||
if let Some(ua_stylesheets) = ua_stylesheets {
|
if let Some(ua_stylesheets) = ua_stylesheets {
|
||||||
for stylesheet in &ua_stylesheets.user_or_user_agent_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);
|
self.animations.insert(keyframes_rule.name.as_atom().clone(), animation);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "gecko")]
|
||||||
CssRule::FontFace(ref rule) => {
|
CssRule::FontFace(ref rule) => {
|
||||||
extra_data.add_font_face(&rule, stylesheet.origin);
|
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.
|
// We don't care about any other rule.
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2384,6 +2384,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]
|
#[no_mangle]
|
||||||
pub extern "C" fn Servo_StyleSet_ResolveForDeclarations(raw_data: RawServoStyleSetBorrowed,
|
pub extern "C" fn Servo_StyleSet_ResolveForDeclarations(raw_data: RawServoStyleSetBorrowed,
|
||||||
parent_style_or_null: ServoComputedValuesBorrowedOrNull,
|
parent_style_or_null: ServoComputedValuesBorrowedOrNull,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue