diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 034b77498b8..1d3a94d9b6c 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -242,7 +242,7 @@ impl<'ln> LayoutNode<'ln> { } } -impl<'ln> TNode> for LayoutNode<'ln> { +impl<'ln> TNode<'ln, LayoutElement<'ln>> for LayoutNode<'ln> { fn parent_node(&self) -> Option> { unsafe { self.node.parent_node_ref().map(|node| self.new_with_this_lifetime(&node)) @@ -389,7 +389,7 @@ impl<'le> LayoutElement<'le> { } } -impl<'le> TElement for LayoutElement<'le> { +impl<'le> TElement<'le> for LayoutElement<'le> { #[inline] fn get_local_name<'a>(&'a self) -> &'a Atom { &self.element.local_name diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index b09f2a8cd1b..97e841eb80b 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -948,7 +948,7 @@ impl<'a> VirtualMethods for JSRef<'a, Element> { } } -impl<'a> style::TElement for JSRef<'a, Element> { +impl<'a> style::TElement<'a> for JSRef<'a, Element> { fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'static str> { self.get_attribute(namespace.clone(), attr).root().map(|attr| { unsafe { mem::transmute(attr.deref().value().as_slice()) } diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index b9436a0d12e..7e402090e31 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -2033,7 +2033,7 @@ impl<'a> VirtualMethods for JSRef<'a, Node> { } } -impl<'a> style::TNode> for JSRef<'a, Node> { +impl<'a> style::TNode<'a, JSRef<'a, Element>> for JSRef<'a, Node> { fn parent_node(&self) -> Option> { (self as &NodeHelpers).parent_node().map(|node| *node.root()) } diff --git a/components/style/node.rs b/components/style/node.rs index bd71aa6fd79..5179db5f6af 100644 --- a/components/style/node.rs +++ b/components/style/node.rs @@ -10,7 +10,7 @@ use servo_util::atom::Atom; use servo_util::namespace::Namespace; -pub trait TNode : Clone { +pub trait TNode<'a, E: TElement<'a>> : Clone { fn parent_node(&self) -> Option; /// Name is prefixed to avoid a conflict with TLayoutNode. fn tnode_first_child(&self) -> Option; @@ -23,7 +23,7 @@ pub trait TNode : Clone { fn is_html_element_in_html_document(&self) -> bool; } -pub trait TElement { +pub trait TElement<'a> { fn get_attr(&self, namespace: &Namespace, attr: &str) -> Option<&'static str>; fn get_link(&self) -> Option<&'static str>; fn get_local_name<'a>(&'a self) -> &'a Atom; diff --git a/components/style/selector_matching.rs b/components/style/selector_matching.rs index 24abfde8840..3fb90435269 100644 --- a/components/style/selector_matching.rs +++ b/components/style/selector_matching.rs @@ -79,8 +79,9 @@ impl SelectorMap { /// /// Extract matching rules as per node's ID, classes, tag name, etc.. /// Sort the Rules at the end to maintain cascading order. - fn get_all_matching_rules, + fn get_all_matching_rules<'a, + E:TElement<'a>, + N:TNode<'a, E>, V:VecLike>( &self, node: &N, @@ -147,8 +148,9 @@ impl SelectorMap { } } - fn get_matching_rules_from_hash, + fn get_matching_rules_from_hash<'a, + E:TElement<'a>, + N:TNode<'a, E>, V:VecLike>( node: &N, parent_bf: &Option, @@ -165,8 +167,9 @@ impl SelectorMap { } /// Adds rules in `rules` that match `node` to the `matching_rules` list. - fn get_matching_rules, + fn get_matching_rules<'a, + E:TElement<'a>, + N:TNode<'a, E>, V:VecLike>( node: &N, parent_bf: &Option, @@ -344,8 +347,9 @@ impl Stylist { /// The returned boolean indicates whether the style is *shareable*; that is, whether the /// matched selectors are simple enough to allow the matching logic to be reduced to the logic /// in `css::matching::PrivateMatchMethods::candidate_element_allows_for_style_sharing`. - pub fn push_applicable_declarations, + pub fn push_applicable_declarations<'a, + E:TElement<'a>, + N:TNode<'a, E>, V:VecLike>( &self, element: &N, @@ -467,7 +471,7 @@ impl DeclarationBlock { } } -pub fn matches>(selector_list: &SelectorList, element: &N, parent_bf: &Option) -> bool { +pub fn matches<'a, E:TElement<'a>, N:TNode<'a, E>>(selector_list: &SelectorList, element: &N, parent_bf: &Option) -> bool { get_selector_list_selectors(selector_list).iter().any(|selector| selector.pseudo_element.is_none() && matches_compound_selector(&*selector.compound_selectors, element, parent_bf, &mut false)) @@ -479,8 +483,9 @@ pub fn matches>(selector_list: &SelectorList, element: &N /// `shareable` to false unless you are willing to update the style sharing logic. Otherwise things /// will almost certainly break as nodes will start mistakenly sharing styles. (See the code in /// `main/css/matching.rs`.) -fn matches_compound_selector>( +fn matches_compound_selector<'a, + E:TElement<'a>, + N:TNode<'a, E>>( selector: &CompoundSelector, element: &N, parent_bf: &Option, @@ -544,7 +549,7 @@ enum SelectorMatchingResult { /// Quickly figures out whether or not the compound selector is worth doing more /// work on. If the simple selectors don't match, or there's a child selector /// that does not appear in the bloom parent bloom filter, we can exit early. -fn can_fast_reject>( +fn can_fast_reject<'a, E: TElement<'a>, N: TNode<'a, E>>( mut selector: &CompoundSelector, element: &N, parent_bf: &Option, @@ -605,8 +610,9 @@ fn can_fast_reject>( return None; } -fn matches_compound_selector_internal>( +fn matches_compound_selector_internal<'a, + E:TElement<'a>, + N:TNode<'a, E>>( selector: &CompoundSelector, element: &N, parent_bf: &Option, @@ -680,8 +686,8 @@ fn matches_compound_selector_internal>( +pub fn matches_simple_selector<'a, E:TElement<'a>, + N:TNode<'a, E>>( selector: &SimpleSelector, element: &N, shareable: &mut bool) @@ -863,8 +869,8 @@ fn url_is_visited(_url: &str) -> bool { #[inline] fn matches_generic_nth_child<'a, - E:TElement, - N:TNode>( + E:TElement<'a>, + N:TNode<'a, E>>( element: &N, a: i32, b: i32, @@ -919,7 +925,7 @@ fn matches_generic_nth_child<'a, } #[inline] -fn matches_root>(element: &N) -> bool { +fn matches_root<'a, E:TElement<'a>,N:TNode<'a, E>>(element: &N) -> bool { match element.parent_node() { Some(parent) => parent.is_document(), None => false @@ -927,7 +933,7 @@ fn matches_root>(element: &N) -> bool { } #[inline] -fn matches_first_child>(element: &N) -> bool { +fn matches_first_child<'a, E:TElement<'a>,N:TNode<'a, E>>(element: &N) -> bool { let mut node = element.clone(); loop { match node.prev_sibling() { @@ -949,7 +955,7 @@ fn matches_first_child>(element: &N) -> bool { } #[inline] -fn matches_last_child>(element: &N) -> bool { +fn matches_last_child<'a, E:TElement<'a>,N:TNode<'a, E>>(element: &N) -> bool { let mut node = element.clone(); loop { match node.next_sibling() {