diff --git a/components/style/gecko/wrapper.rs b/components/style/gecko/wrapper.rs index bcdd2755519..c8fc86a5063 100644 --- a/components/style/gecko/wrapper.rs +++ b/components/style/gecko/wrapper.rs @@ -148,6 +148,12 @@ impl<'ln> GeckoNode<'ln> { (self.0).mBoolFlags } + /// Owner document quirks mode getter. + #[inline] + pub fn owner_document_quirks_mode(&self) -> QuirksMode { + self.owner_doc().mCompatMode.into() + } + #[inline] fn get_bool_flag(&self, flag: nsINode_BooleanFlag) -> bool { self.bool_flags() & (1u32 << flag as u32) != 0 @@ -625,8 +631,9 @@ impl<'le> GeckoElement<'le> { } /// Owner document quirks mode getter. + #[inline] pub fn owner_document_quirks_mode(&self) -> QuirksMode { - self.as_node().owner_doc().mCompatMode.into() + self.as_node().owner_document_quirks_mode() } /// Only safe to call on the main thread, with exclusive access to the element and diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index e5a21612dfb..b793c7d24e5 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -29,9 +29,9 @@ use style::gecko::global_style_data::{GLOBAL_STYLE_DATA, GlobalStyleData, STYLE_ use style::gecko::restyle_damage::GeckoRestyleDamage; use style::gecko::selector_parser::PseudoElement; use style::gecko::traversal::RecalcStyleOnly; -use style::gecko::wrapper::GeckoElement; +use style::gecko::wrapper::{GeckoElement, GeckoNode}; use style::gecko_bindings::bindings; -use style::gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoElementBorrowedOrNull}; +use style::gecko_bindings::bindings::{RawGeckoElementBorrowed, RawGeckoElementBorrowedOrNull, RawGeckoNodeBorrowed}; use style::gecko_bindings::bindings::{RawGeckoKeyframeListBorrowed, RawGeckoKeyframeListBorrowedMut}; use style::gecko_bindings::bindings::{RawServoDeclarationBlockBorrowed, RawServoDeclarationBlockStrong}; use style::gecko_bindings::bindings::{RawServoDocumentRule, RawServoDocumentRuleBorrowed}; @@ -1614,6 +1614,29 @@ pub unsafe extern "C" fn Servo_SelectorList_Matches( ) } +#[no_mangle] +pub unsafe extern "C" fn Servo_SelectorList_QueryFirst( + node: RawGeckoNodeBorrowed, + selectors: RawServoSelectorListBorrowed, +) -> *const structs::RawGeckoElement { + use std::borrow::Borrow; + use style::dom_apis::{self, QuerySelectorResult, QuerySelectorKind}; + + let node = GeckoNode(node); + let selectors = ::selectors::SelectorList::from_ffi(selectors).borrow(); + let mut result = QuerySelectorResult::new(); + dom_apis::query_selector::( + node, + &selectors, + &mut result, + QuerySelectorKind::First, + node.owner_document_quirks_mode(), + ); + + result.first() + .map_or(ptr::null(), |e| e.0) +} + #[no_mangle] pub extern "C" fn Servo_ImportRule_GetHref(rule: RawServoImportRuleBorrowed, result: *mut nsAString) { read_locked_arc(rule, |rule: &ImportRule| {