diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index b485cae36de..393070ffff2 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -201,23 +201,6 @@ impl SelectorList { pub fn from_vec(v: Vec>) -> Self { SelectorList(v.into_iter().map(SelectorAndHashes::new).collect()) } - - pub fn to_css_from_index(&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 @@ -714,7 +697,15 @@ impl Debug for LocalName { impl ToCss for SelectorList { fn to_css(&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(()) } } diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 4fef8316a70..12fdef2ebad 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -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); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index d25f1fd08af..705bb717804 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -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(); }) } @@ -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| {