diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2017-06-07 17:41:24 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2017-06-07 17:42:29 +0200 |
commit | 36f32554842225a42be3b672b85c45d130a65165 (patch) | |
tree | 57a825929ee9589223ae511d57327f4ad98dd743 | |
parent | 7e273d6c9b86d6ffbf216e84ae7326976888e5ef (diff) | |
download | servo-36f32554842225a42be3b672b85c45d130a65165.tar.gz servo-36f32554842225a42be3b672b85c45d130a65165.zip |
Bug 1367615 - Stylo: implement inIDOMUtils.getSelectorCount and inIDOMUtils.getSelectorTextFromIndex
-rw-r--r-- | components/selectors/parser.rs | 27 | ||||
-rw-r--r-- | components/style/gecko/generated/bindings.rs | 10 | ||||
-rw-r--r-- | 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 c613d741eb6..92ba8c17601 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -167,6 +167,23 @@ 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 @@ -638,15 +655,7 @@ 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 { - 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 7054148ba70..3eed899e538 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -2051,6 +2051,16 @@ extern "C" { 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 07ae5a8c2b9..6363e38deb1 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -1157,6 +1157,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| { write!(unsafe { &mut *result }, "{}", rule.url.as_str()).unwrap(); |