Struct layout_2013::construct::Legalizer
source · struct Legalizer {
stack: Vec<FlowRef>,
}
Expand description
Maintains a stack of anonymous boxes needed to ensure that the flow tree is legal. The tree is legal if it follows the rules in CSS 2.1 § 17.2.1.
As an example, the legalizer makes sure that table row flows contain only table cells. If the flow constructor attempts to place, say, a block flow directly underneath the table row, the legalizer generates an anonymous table cell in between to hold the block.
Generally, the flow constructor should use Legalizer::add_child()
instead of calling
Flow::add_new_child()
directly. This ensures that the flow tree remains legal at all times
and centralizes the anonymous flow generation logic in one place.
Fields§
§stack: Vec<FlowRef>
A stack of anonymous flows that have yet to be finalized (i.e. that still could acquire new children).
Implementations§
source§impl Legalizer
impl Legalizer
sourcefn add_child<E>(
&mut self,
context: &SharedStyleContext<'_>,
parent: &mut FlowRef,
child: FlowRef,
)where
E: TElement,
fn add_child<E>(
&mut self,
context: &SharedStyleContext<'_>,
parent: &mut FlowRef,
child: FlowRef,
)where
E: TElement,
Makes the child
flow a new child of parent
. Anonymous flows are automatically inserted
to keep the tree legal.
sourcefn try_to_add_child<E>(
&mut self,
context: &SharedStyleContext<'_>,
parent: &mut FlowRef,
child: &mut FlowRef,
) -> boolwhere
E: TElement,
fn try_to_add_child<E>(
&mut self,
context: &SharedStyleContext<'_>,
parent: &mut FlowRef,
child: &mut FlowRef,
) -> boolwhere
E: TElement,
Attempts to make child
a child of parent
. On success, this returns true. If this would
make the tree illegal, this method does nothing and returns false.
This method attempts to create anonymous blocks in between parent
and child
if and only
if those blocks will only ever have child
as their sole child. At present, this is only
true for anonymous block children of flex flows.
sourcefn flush_top_of_stack(&mut self, parent: &mut FlowRef)
fn flush_top_of_stack(&mut self, parent: &mut FlowRef)
Finalizes the flow on the top of the stack.
sourcefn push_next_anonymous_flow<E>(
&mut self,
context: &SharedStyleContext<'_>,
parent: &FlowRef,
)where
E: TElement,
fn push_next_anonymous_flow<E>(
&mut self,
context: &SharedStyleContext<'_>,
parent: &FlowRef,
)where
E: TElement,
Adds the anonymous flow that would be necessary to make an illegal child of parent
legal
to the stack.
sourcefn push_new_anonymous_flow<E, F>(
&mut self,
context: &SharedStyleContext<'_>,
reference: &FlowRef,
pseudos: &[PseudoElement],
specific_fragment_info: SpecificFragmentInfo,
constructor: fn(_: Fragment) -> F,
)
fn push_new_anonymous_flow<E, F>( &mut self, context: &SharedStyleContext<'_>, reference: &FlowRef, pseudos: &[PseudoElement], specific_fragment_info: SpecificFragmentInfo, constructor: fn(_: Fragment) -> F, )
Creates an anonymous flow and pushes it onto the stack.
sourcefn create_anonymous_flow<E, F>(
context: &SharedStyleContext<'_>,
reference: &FlowRef,
pseudos: &[PseudoElement],
specific_fragment_info: SpecificFragmentInfo,
constructor: fn(_: Fragment) -> F,
) -> FlowRef
fn create_anonymous_flow<E, F>( context: &SharedStyleContext<'_>, reference: &FlowRef, pseudos: &[PseudoElement], specific_fragment_info: SpecificFragmentInfo, constructor: fn(_: Fragment) -> F, ) -> FlowRef
Creates a new anonymous flow. The new flow is identical to reference
except with all
styles applying to every pseudo-element in pseudos
applied.
This method invokes the supplied constructor function on the given specific fragment info in order to actually generate the flow.
Auto Trait Implementations§
impl Freeze for Legalizer
impl !RefUnwindSafe for Legalizer
impl Send for Legalizer
impl Sync for Legalizer
impl Unpin for Legalizer
impl !UnwindSafe for Legalizer
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more