diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-07-04 05:08:03 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-07-04 05:08:03 -0700 |
commit | c44b5993ebc9a24241ac443d52a1900c7f79acef (patch) | |
tree | 5e3a1f81da64ed283638be6e4f8ad22442915952 | |
parent | f380d1cfc1cd747d68747f30da3bdd2b1673751f (diff) | |
parent | fc8d0eeae0b1e6bcaef59a63c62c2dcaf36b1f2b (diff) | |
download | servo-c44b5993ebc9a24241ac443d52a1900c7f79acef.tar.gz servo-c44b5993ebc9a24241ac443d52a1900c7f79acef.zip |
Auto merge of #17601 - ferjm:bug1370502.selector.matches.element, r=emilio
stylo: Implement ServoStyleRule::SelectorMatchesElement
from https://bugzilla.mozilla.org/show_bug.cgi?id=1370502
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/17601)
<!-- Reviewable:end -->
-rw-r--r-- | components/style/gecko/generated/bindings.rs | 10 | ||||
-rw-r--r-- | components/style/gecko/wrapper.rs | 5 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 42 |
3 files changed, 57 insertions, 0 deletions
diff --git a/components/style/gecko/generated/bindings.rs b/components/style/gecko/generated/bindings.rs index 96d9b3f9dd3..84e4c69cba6 100644 --- a/components/style/gecko/generated/bindings.rs +++ b/components/style/gecko/generated/bindings.rs @@ -2145,6 +2145,16 @@ extern "C" { count: *mut u32); } extern "C" { + pub fn Servo_StyleRule_SelectorMatchesElement(arg1: + RawServoStyleRuleBorrowed, + arg2: + RawGeckoElementBorrowed, + index: u32, + pseudo_type: + CSSPseudoElementType) + -> bool; +} +extern "C" { pub fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString); } diff --git a/components/style/gecko/wrapper.rs b/components/style/gecko/wrapper.rs index a7aff7f3a73..3af035cd208 100644 --- a/components/style/gecko/wrapper.rs +++ b/components/style/gecko/wrapper.rs @@ -694,6 +694,11 @@ impl<'le> GeckoElement<'le> { let node = self.as_node(); unsafe { Gecko_GetDocumentLWTheme(node.owner_doc()) } } + + /// Owner document quirks mode getter. + pub fn owner_document_quirks_mode(&self) -> QuirksMode { + self.as_node().owner_doc().mCompatMode.into() + } } /// Converts flags from the layout used by rust-selectors to the layout used diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index 4f47df2ebc0..2b023147b02 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -7,6 +7,7 @@ use cssparser::{Parser, ParserInput}; use cssparser::ToCss as ParserToCss; use env_logger::LogBuilder; use selectors::Element; +use selectors::matching::{MatchingContext, MatchingMode, matches_selector}; use std::env; use std::fmt::Write; use std::ptr; @@ -1256,6 +1257,47 @@ pub extern "C" fn Servo_StyleRule_GetSpecificityAtIndex( } #[no_mangle] +pub extern "C" fn Servo_StyleRule_SelectorMatchesElement(rule: RawServoStyleRuleBorrowed, + element: RawGeckoElementBorrowed, + index: u32, + pseudo_type: CSSPseudoElementType) -> bool { + read_locked_arc(rule, |rule: &StyleRule| { + let index = index as usize; + if index >= rule.selectors.0.len() { + return false; + } + + let selector_and_hashes = &rule.selectors.0[index]; + let mut matching_mode = MatchingMode::Normal; + + match PseudoElement::from_pseudo_type(pseudo_type) { + Some(pseudo) => { + // We need to make sure that the requested pseudo element type + // matches the selector pseudo element type before proceeding. + match selector_and_hashes.selector.pseudo_element() { + Some(selector_pseudo) if *selector_pseudo == pseudo => { + matching_mode = MatchingMode::ForStatelessPseudoElement + }, + _ => return false, + }; + }, + None => { + // Do not attempt to match if a pseudo element is requested and + // this is not a pseudo element selector, or vice versa. + if selector_and_hashes.selector.has_pseudo_element() { + return false; + } + }, + }; + + let element = GeckoElement(element); + let mut ctx = MatchingContext::new(matching_mode, None, element.owner_document_quirks_mode()); + matches_selector(&selector_and_hashes.selector, 0, &selector_and_hashes.hashes, + &element, &mut ctx, &mut |_, _| {}) + }) +} + +#[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(); |