From 6b3821ae278d7b47879f0e932b6f478aa1cdc748 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Sun, 22 Oct 2017 02:19:14 +0200 Subject: [PATCH] stylo: Integrate QuerySelectorAll in Gecko. Bug: 1410624 Reviewed-by: heycam MozReview-Commit-ID: 2Jf3Z6ikjXB --- ports/geckolib/glue.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 7bedd0cea68..f0f1baaf661 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -1635,6 +1635,38 @@ pub unsafe extern "C" fn Servo_SelectorList_QueryFirst( result.map_or(ptr::null(), |e| e.0) } +#[no_mangle] +pub unsafe extern "C" fn Servo_SelectorList_QueryAll( + node: RawGeckoNodeBorrowed, + selectors: RawServoSelectorListBorrowed, + content_list: *mut structs::nsSimpleContentList, +) { + use smallvec::SmallVec; + use std::borrow::Borrow; + use style::dom_apis::{self, QueryAll}; + + let node = GeckoNode(node); + let selectors = ::selectors::SelectorList::from_ffi(selectors).borrow(); + let mut result = SmallVec::new(); + + dom_apis::query_selector::( + node, + &selectors, + &mut result, + node.owner_document_quirks_mode(), + ); + + if !result.is_empty() { + // NOTE(emilio): This relies on a slice of GeckoElement having the same + // memory representation than a slice of element pointers. + bindings::Gecko_ContentList_AppendAll( + content_list, + result.as_ptr() as *mut *const _, + result.len(), + ) + } +} + #[no_mangle] pub extern "C" fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString) { read_locked_arc(rule, |rule: &ImportRule| {