mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Make IndependentFormattingContext a struct that owns styles
… and has a private enum for its contents. Privacy forces the rest of the code to go through methods rather than matching on the enum, reducing accidental layout-mode-specific behavior.
This commit is contained in:
parent
799057f1e6
commit
b2b3ea992c
9 changed files with 149 additions and 123 deletions
|
@ -12,16 +12,13 @@
|
|||
#[macro_use]
|
||||
extern crate serde;
|
||||
|
||||
use style::properties::ComputedValues;
|
||||
use style::values::computed::{Length, LengthOrAuto};
|
||||
use style::Zero;
|
||||
|
||||
pub mod context;
|
||||
pub mod data;
|
||||
pub mod display_list;
|
||||
mod dom_traversal;
|
||||
mod element_data;
|
||||
mod flow;
|
||||
mod formatting_contexts;
|
||||
mod fragments;
|
||||
mod geom;
|
||||
mod opaque_node;
|
||||
|
@ -43,87 +40,9 @@ use crate::replaced::ReplacedContent;
|
|||
use crate::style_ext::{ComputedValuesExt, Direction, DisplayInside, Position, WritingMode};
|
||||
use servo_arc::Arc;
|
||||
use std::convert::TryInto;
|
||||
use style::context::SharedStyleContext;
|
||||
|
||||
/// https://drafts.csswg.org/css-display/#independent-formatting-context
|
||||
#[derive(Debug)]
|
||||
enum IndependentFormattingContext {
|
||||
Flow(BlockFormattingContext),
|
||||
|
||||
// Not called FC in specs, but behaves close enough
|
||||
Replaced(ReplacedContent),
|
||||
// Other layout modes go here
|
||||
}
|
||||
|
||||
enum NonReplacedIFC<'a> {
|
||||
Flow(&'a BlockFormattingContext),
|
||||
}
|
||||
|
||||
impl IndependentFormattingContext {
|
||||
fn construct<'dom, 'style>(
|
||||
context: &SharedStyleContext<'style>,
|
||||
style: &Arc<ComputedValues>,
|
||||
display_inside: DisplayInside,
|
||||
contents: Contents<impl NodeExt<'dom>>,
|
||||
) -> Self {
|
||||
match contents.try_into() {
|
||||
Ok(non_replaced) => match display_inside {
|
||||
DisplayInside::Flow | DisplayInside::FlowRoot => {
|
||||
IndependentFormattingContext::Flow(BlockFormattingContext::construct(
|
||||
context,
|
||||
style,
|
||||
non_replaced,
|
||||
))
|
||||
},
|
||||
},
|
||||
Err(replaced) => IndependentFormattingContext::Replaced(replaced),
|
||||
}
|
||||
}
|
||||
|
||||
fn as_replaced(&self) -> Result<&ReplacedContent, NonReplacedIFC> {
|
||||
match self {
|
||||
IndependentFormattingContext::Replaced(r) => Ok(r),
|
||||
IndependentFormattingContext::Flow(f) => Err(NonReplacedIFC::Flow(f)),
|
||||
}
|
||||
}
|
||||
|
||||
fn layout<'a>(
|
||||
&'a self,
|
||||
layout_context: &LayoutContext,
|
||||
containing_block: &ContainingBlock,
|
||||
tree_rank: usize,
|
||||
absolutely_positioned_fragments: &mut Vec<AbsolutelyPositionedFragment<'a>>,
|
||||
) -> FlowChildren {
|
||||
match self.as_replaced() {
|
||||
Ok(replaced) => match *replaced {},
|
||||
Err(ifc) => ifc.layout(
|
||||
layout_context,
|
||||
containing_block,
|
||||
tree_rank,
|
||||
absolutely_positioned_fragments,
|
||||
),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> NonReplacedIFC<'a> {
|
||||
fn layout(
|
||||
&self,
|
||||
layout_context: &LayoutContext,
|
||||
containing_block: &ContainingBlock,
|
||||
tree_rank: usize,
|
||||
absolutely_positioned_fragments: &mut Vec<AbsolutelyPositionedFragment<'a>>,
|
||||
) -> FlowChildren {
|
||||
match self {
|
||||
NonReplacedIFC::Flow(bfc) => bfc.layout(
|
||||
layout_context,
|
||||
containing_block,
|
||||
tree_rank,
|
||||
absolutely_positioned_fragments,
|
||||
),
|
||||
}
|
||||
}
|
||||
}
|
||||
use style::properties::ComputedValues;
|
||||
use style::values::computed::{Length, LengthOrAuto};
|
||||
use style::Zero;
|
||||
|
||||
struct ContainingBlock {
|
||||
inline_size: Length,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue