From c65e7d607a605ec0c8db1538d786d8d3b69d0bc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 2 Oct 2017 12:07:11 +0200 Subject: [PATCH 1/2] stylo: Add bindings to Servo selector lists. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: 1404897 Reviewed-by: heycam MozReview-Commit-ID: 4ZrWawDwuNe Signed-off-by: Emilio Cobos Álvarez --- ports/geckolib/glue.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index bbbacc27595..d9830844bb8 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -122,7 +122,7 @@ use style::properties::animated_properties::compare_property_priority; use style::properties::parse_one_declaration_into; use style::rule_cache::RuleCacheConditions; use style::rule_tree::{CascadeLevel, StyleSource}; -use style::selector_parser::PseudoElementCascadeType; +use style::selector_parser::{PseudoElementCascadeType, SelectorImpl}; use style::shared_lock::{SharedRwLockReadGuard, StylesheetGuards, ToCssWithGuard, Locked}; use style::string_cache::Atom; use style::style_adjuster::StyleAdjuster; @@ -4102,3 +4102,23 @@ pub extern "C" fn Servo_CorruptRuleHashAndCrash(set: RawServoStyleSetBorrowed, i let per_doc_data = PerDocumentStyleData::from_ffi(set).borrow(); per_doc_data.stylist.corrupt_rule_hash_and_crash(index); } + +#[no_mangle] +pub unsafe extern "C" fn Servo_SelectorList_Parse(selector_list: *const nsACString) -> *mut ::selectors::SelectorList { + use style::selector_parser::SelectorParser; + + debug_assert!(!selector_list.is_null()); + + let input = ::std::str::from_utf8_unchecked(&**selector_list); + let selector_list = match SelectorParser::parse_author_origin_no_namespace(&input) { + Ok(selector_list) => selector_list, + Err(..) => return ptr::null_mut(), + }; + + Box::into_raw(Box::new(selector_list)) +} + +#[no_mangle] +pub unsafe extern "C" fn Servo_SelectorList_Drop(list: *mut ::selectors::SelectorList) { + let _ = Box::from_raw(list); +} From 6fc967f3f9d117379fd85e64b6cf978975669ff4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Mon, 2 Oct 2017 18:14:15 +0200 Subject: [PATCH 2/2] stylo: Implement Element.matches using stylo. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: 1404897 Reviewed-by: heycam MozReview-Commit-ID: 7nxYVcweu0W Signed-off-by: Emilio Cobos Álvarez --- ports/geckolib/glue.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index d9830844bb8..f87b8c1487e 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -6,7 +6,7 @@ use cssparser::{Parser, ParserInput}; use cssparser::ToCss as ParserToCss; use env_logger::LogBuilder; use malloc_size_of::MallocSizeOfOps; -use selectors::Element; +use selectors::{self, Element}; use selectors::matching::{MatchingContext, MatchingMode, matches_selector}; use servo_arc::{Arc, ArcBorrow, RawOffsetArc}; use std::cell::RefCell; @@ -1522,6 +1522,22 @@ pub extern "C" fn Servo_StyleRule_SelectorMatchesElement(rule: RawServoStyleRule }) } +#[no_mangle] +pub unsafe extern "C" fn Servo_SelectorList_Matches( + element: RawGeckoElementBorrowed, + selectors: &::selectors::SelectorList, +) -> bool { + let element = GeckoElement(element); + let mut context = MatchingContext::new( + MatchingMode::Normal, + None, + None, + element.owner_document_quirks_mode(), + ); + + selectors::matching::matches_selector_list(selectors, &element, &mut context) +} + #[no_mangle] pub extern "C" fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString) { read_locked_arc(rule, |rule: &ImportRule| { @@ -4104,7 +4120,9 @@ pub extern "C" fn Servo_CorruptRuleHashAndCrash(set: RawServoStyleSetBorrowed, i } #[no_mangle] -pub unsafe extern "C" fn Servo_SelectorList_Parse(selector_list: *const nsACString) -> *mut ::selectors::SelectorList { +pub unsafe extern "C" fn Servo_SelectorList_Parse( + selector_list: *const nsACString, +) -> *mut ::selectors::SelectorList { use style::selector_parser::SelectorParser; debug_assert!(!selector_list.is_null());