From 36f32554842225a42be3b672b85c45d130a65165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Jim=C3=A9nez=20Moreno?= Date: Wed, 7 Jun 2017 17:41:24 +0200 Subject: [PATCH] Bug 1367615 - Stylo: implement inIDOMUtils.getSelectorCount and inIDOMUtils.getSelectorTextFromIndex --- components/selectors/parser.rs | 27 +++++++++++++------- components/style/gecko/generated/bindings.rs | 10 ++++++++ ports/geckolib/glue.rs | 19 ++++++++++++++ 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index c613d741eb6e..92ba8c176015 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -167,6 +167,23 @@ 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 @@ -638,15 +655,7 @@ impl Debug for LocalName { impl ToCss for SelectorList { fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { - 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(()) + self.to_css_from_index(/* from_index = */ 0, dest) } } diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 7054148ba70f..3eed899e5380 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -2050,6 +2050,16 @@ extern "C" { pub fn Servo_StyleRule_GetSelectorText(rule: RawServoStyleRuleBorrowed, result: *mut nsAString); } +extern "C" { + pub fn Servo_StyleRule_GetSelectorTextFromIndex(rule: + RawServoStyleRuleBorrowed, + index: u32, + result: *mut nsAString); +} +extern "C" { + pub fn Servo_StyleRule_GetSelectorCount(rule: RawServoStyleRuleBorrowed, + count: *mut u32); +} extern "C" { pub fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 07ae5a8c2b94..6363e38deb12 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -1156,6 +1156,25 @@ 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) { + read_locked_arc(rule, |rule: &StyleRule| { + rule.selectors.to_css_from_index( + aSelectorIndex as usize, + unsafe { result.as_mut().unwrap() } + ).unwrap(); + }) +} + +#[no_mangle] +pub extern "C" fn Servo_StyleRule_GetSelectorCount(rule: RawServoStyleRuleBorrowed, count: *mut u32) { + read_locked_arc(rule, |rule: &StyleRule| { + *unsafe { count.as_mut().unwrap() } = rule.selectors.0.len() as u32; + }) +} + #[no_mangle] pub extern "C" fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString) { read_locked_arc(rule, |rule: &ImportRule| {