/* 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 https://mozilla.org/MPL/2.0/. */ use bitflags::bitflags; use malloc_size_of::malloc_size_of_is_0; use malloc_size_of_derive::MallocSizeOf; use script_layout_interface::combine_id_with_fragment_type; use style::dom::OpaqueNode; use style::selector_parser::PseudoElement; /// This data structure stores fields that are common to all non-base /// Fragment types and should generally be the first member of all /// concrete fragments. #[derive(Clone, Debug, MallocSizeOf)] pub(crate) struct BaseFragment { /// A tag which identifies the DOM node and pseudo element of this /// Fragment's content. If this fragment is for an anonymous box, /// the tag will be None. pub tag: Option, /// Flags which various information about this fragment used during /// layout. pub flags: FragmentFlags, } impl BaseFragment { pub(crate) fn anonymous() -> Self { BaseFragment { tag: None, flags: FragmentFlags::empty(), } } /// Returns true if this fragment is non-anonymous and it is for the given /// OpaqueNode, regardless of the pseudo element. pub(crate) fn is_for_node(&self, node: OpaqueNode) -> bool { self.tag.map(|tag| tag.node == node).unwrap_or(false) } } /// Information necessary to construct a new BaseFragment. #[derive(Clone, Copy, Debug, MallocSizeOf)] pub(crate) struct BaseFragmentInfo { /// The tag to use for the new BaseFragment, if it is not an anonymous Fragment. pub tag: Option, /// The flags to use for the new BaseFragment. pub flags: FragmentFlags, } impl BaseFragmentInfo { pub(crate) fn new_for_node(node: OpaqueNode) -> Self { Self { tag: Some(Tag::new(node)), flags: FragmentFlags::empty(), } } pub(crate) fn anonymous() -> Self { Self { tag: None, flags: FragmentFlags::empty(), } } } impl From for BaseFragment { fn from(info: BaseFragmentInfo) -> Self { Self { tag: info.tag, flags: info.flags, } } } bitflags! { /// Flags used to track various information about a DOM node during layout. #[derive(Clone, Copy, Debug)] pub(crate) struct FragmentFlags: u16 { /// Whether or not the node that created this fragment is a `` element on an HTML document. const IS_BODY_ELEMENT_OF_HTML_ELEMENT_ROOT = 1 << 0; /// Whether or not the node that created this Fragment is a `
` element. const IS_BR_ELEMENT = 1 << 1; /// Whether or not the node that created this Fragment is a `` or `