From f5badf5400c226d1c0ab76482512287d30bb0210 Mon Sep 17 00:00:00 2001 From: Kerem Kat Date: Sat, 14 Apr 2018 19:05:44 +0300 Subject: [PATCH] style: Implement ServoStyleRule::SetSelectorText. Bug: 37468 Reviewed-by: xidorn --- ports/geckolib/glue.rs | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 76b3af63780f..ce9573983914 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -6,7 +6,7 @@ use cssparser::{ParseErrorKind, Parser, ParserInput, SourceLocation}; use cssparser::ToCss as ParserToCss; use env_logger::Builder; use malloc_size_of::MallocSizeOfOps; -use selectors::NthIndexCache; +use selectors::{NthIndexCache, SelectorList}; use selectors::matching::{MatchingContext, MatchingMode, matches_selector}; use servo_arc::{Arc, ArcBorrow, RawOffsetArc}; use smallvec::SmallVec; @@ -1902,6 +1902,37 @@ pub extern "C" fn Servo_StyleRule_SelectorMatchesElement( }) } +#[no_mangle] +pub unsafe extern "C" fn Servo_StyleRule_SetSelectorText( + sheet: RawServoStyleSheetContentsBorrowed, + rule: RawServoStyleRuleBorrowed, + text: *const nsAString, +) -> bool { + let value_str = (*text).to_string(); + + write_locked_arc(rule, |rule: &mut StyleRule| { + use style::selector_parser::SelectorParser; + + let contents = StylesheetContents::as_arc(&sheet); + let namespaces = contents.namespaces.read(); + let url_data = contents.url_data.read(); + let parser = SelectorParser { + stylesheet_origin: contents.origin, + namespaces: &namespaces, + url_data: Some(&url_data), + }; + + let mut parser_input = ParserInput::new(&value_str); + match SelectorList::parse(&parser, &mut Parser::new(&mut parser_input)) { + Ok(selectors) => { + rule.selectors = selectors; + true + } + Err(_) => false, + } + }) +} + #[no_mangle] pub unsafe extern "C" fn Servo_SelectorList_Closest( element: RawGeckoElementBorrowed,