/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ //! Traits that nodes must implement. Breaks the otherwise-cyclic dependency //! between layout and style. use attr::{AttrSelectorOperation, NamespaceConstraint, CaseSensitivity}; use matching::{ElementSelectorFlags, LocalMatchingContext, MatchingContext, RelevantLinkStatus}; use parser::SelectorImpl; use std::fmt::Debug; pub trait Element: Sized + Debug { type Impl: SelectorImpl; fn parent_element(&self) -> Option; /// The parent of a given pseudo-element, after matching a pseudo-element /// selector. /// /// This is guaranteed to be called in a pseudo-element. fn pseudo_element_originating_element(&self) -> Option { self.parent_element() } /// Skips non-element nodes fn first_child_element(&self) -> Option; /// Skips non-element nodes fn last_child_element(&self) -> Option; /// Skips non-element nodes fn prev_sibling_element(&self) -> Option; /// Skips non-element nodes fn next_sibling_element(&self) -> Option; fn is_html_element_in_html_document(&self) -> bool; fn get_local_name(&self) -> &::BorrowedLocalName; /// Empty string for no namespace fn get_namespace(&self) -> &::BorrowedNamespaceUrl; fn attr_matches(&self, ns: &NamespaceConstraint<&::NamespaceUrl>, local_name: &::LocalName, operation: &AttrSelectorOperation<&::AttrValue>) -> bool; fn match_non_ts_pseudo_class(&self, pc: &::NonTSPseudoClass, context: &mut LocalMatchingContext, relevant_link: &RelevantLinkStatus, flags_setter: &mut F) -> bool where F: FnMut(&Self, ElementSelectorFlags); fn match_pseudo_element(&self, pe: &::PseudoElement, context: &mut MatchingContext) -> bool; /// Whether this element is a `link`. fn is_link(&self) -> bool; fn has_id(&self, id: &::Identifier, case_sensitivity: CaseSensitivity) -> bool; fn has_class(&self, name: &::ClassName, case_sensitivity: CaseSensitivity) -> bool; /// Returns whether this element matches `:empty`. /// /// That is, whether it does not contain any child element or any non-zero-length text node. /// See http://dev.w3.org/csswg/selectors-3/#empty-pseudo fn is_empty(&self) -> bool; /// Returns whether this element matches `:root`, /// i.e. whether it is the root element of a document. /// /// Note: this can be false even if `.parent_element()` is `None` /// if the parent node is a `DocumentFragment`. fn is_root(&self) -> bool; }