Skip to content

Commit

Permalink
stylo: Implement GetSpecificity for ServoStyleRule
Browse files Browse the repository at this point in the history
  • Loading branch information
ferjm committed Jun 12, 2017
1 parent 8714064 commit 2cc9403
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 26 deletions.
27 changes: 9 additions & 18 deletions components/selectors/parser.rs
Expand Up @@ -201,23 +201,6 @@ impl<Impl: SelectorImpl> SelectorList<Impl> {
pub fn from_vec(v: Vec<Selector<Impl>>) -> Self {
SelectorList(v.into_iter().map(SelectorAndHashes::new).collect())
}

pub fn to_css_from_index<W>(&self, from_index: usize, dest: &mut W)
-> fmt::Result where W: fmt::Write {
let mut iter = self.0.iter().skip(from_index);

let first = match iter.next() {
Some(f) => f,
None => return Ok(()),
};

first.selector.to_css(dest)?;
for selector_and_hashes in iter {
dest.write_str(", ")?;
selector_and_hashes.selector.to_css(dest)?;
}
Ok(())
}
}

/// Copied from Gecko, who copied it from WebKit. Note that increasing the
Expand Down Expand Up @@ -714,7 +697,15 @@ impl<Impl: SelectorImpl> Debug for LocalName<Impl> {

impl<Impl: SelectorImpl> ToCss for SelectorList<Impl> {
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
self.to_css_from_index(/* from_index = */ 0, dest)
let mut iter = self.0.iter();
let first = iter.next()
.expect("Empty SelectorList, should contain at least one selector");
first.selector.to_css(dest)?;
for selector_and_hashes in iter {
dest.write_str(", ")?;
selector_and_hashes.selector.to_css(dest)?;
}
Ok(())
}
}

Expand Down
8 changes: 7 additions & 1 deletion components/style/gecko/generated/bindings.rs
Expand Up @@ -2112,11 +2112,17 @@ extern "C" {
result: *mut nsAString);
}
extern "C" {
pub fn Servo_StyleRule_GetSelectorTextFromIndex(rule:
pub fn Servo_StyleRule_GetSelectorTextAtIndex(rule:
RawServoStyleRuleBorrowed,
index: u32,
result: *mut nsAString);
}
extern "C" {
pub fn Servo_StyleRule_GetSpecificityAtIndex(rule:
RawServoStyleRuleBorrowed,
index: u32,
specificity: *mut u64);
}
extern "C" {
pub fn Servo_StyleRule_GetSelectorCount(rule: RawServoStyleRuleBorrowed,
count: *mut u32);
Expand Down
30 changes: 23 additions & 7 deletions ports/geckolib/glue.rs
Expand Up @@ -1187,14 +1187,15 @@ pub extern "C" fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowe
}

#[no_mangle]
pub extern "C" fn Servo_StyleRule_GetSelectorTextFromIndex(rule: RawServoStyleRuleBorrowed,
aSelectorIndex: u32,
result: *mut nsAString) {
pub extern "C" fn Servo_StyleRule_GetSelectorTextAtIndex(rule: RawServoStyleRuleBorrowed,
index: u32,
result: *mut nsAString) {
read_locked_arc(rule, |rule: &StyleRule| {
rule.selectors.to_css_from_index(
aSelectorIndex as usize,
unsafe { result.as_mut().unwrap() }
).unwrap();
let index = index as usize;
if index >= rule.selectors.0.len() {
return;
}
rule.selectors.0[index].selector.to_css(unsafe { result.as_mut().unwrap() }).unwrap();
})
}

Expand All @@ -1205,6 +1206,21 @@ pub extern "C" fn Servo_StyleRule_GetSelectorCount(rule: RawServoStyleRuleBorrow
})
}

#[no_mangle]
pub extern "C" fn Servo_StyleRule_GetSpecificityAtIndex(rule: RawServoStyleRuleBorrowed,
index: u32,
specificity: *mut u64) {
read_locked_arc(rule, |rule: &StyleRule| {
let mut specificity = unsafe { specificity.as_mut().unwrap() };
let index = index as usize;
if index >= rule.selectors.0.len() {
*specificity = 0;
return;
}
*specificity = rule.selectors.0[index].selector.specificity() as u64;
})
}

#[no_mangle]
pub extern "C" fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString) {
read_locked_arc(rule, |rule: &ImportRule| {
Expand Down

0 comments on commit 2cc9403

Please sign in to comment.