aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flexbox.rs
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2020-06-05 12:06:25 +0200
committerMartin Robinson <mrobinson@igalia.com>2020-06-06 17:25:08 +0200
commit89855afa4daed56907b84daeb674066524e4352c (patch)
treea80dfbaa99b44bfcb049cd6182d70bf397ac04d0 /components/layout_2020/flexbox.rs
parent7df4655b604683aee5763696589b041024b264ce (diff)
downloadservo-89855afa4daed56907b84daeb674066524e4352c.tar.gz
servo-89855afa4daed56907b84daeb674066524e4352c.zip
layout_2020: Tag fragments with their pseudo content type
This will allow us to answer queries and properly handle animations in the future for fragments generated for pseudo content.
Diffstat (limited to 'components/layout_2020/flexbox.rs')
-rw-r--r--components/layout_2020/flexbox.rs58
1 files changed, 25 insertions, 33 deletions
diff --git a/components/layout_2020/flexbox.rs b/components/layout_2020/flexbox.rs
index fd0dd519c2d..c0d852ff47c 100644
--- a/components/layout_2020/flexbox.rs
+++ b/components/layout_2020/flexbox.rs
@@ -4,9 +4,12 @@
use crate::cell::ArcRefCell;
use crate::context::LayoutContext;
-use crate::dom_traversal::{BoxSlot, Contents, NodeExt, NonReplacedContents, TraversalHandler};
+use crate::dom_traversal::{
+ BoxSlot, Contents, NodeAndStyleInfo, NodeExt, NonReplacedContents, TraversalHandler,
+};
use crate::element_data::LayoutBox;
use crate::formatting_contexts::{IndependentFormattingContext, IndependentLayout};
+use crate::fragments::Tag;
use crate::positioned::{AbsolutelyPositionedBox, PositioningContext};
use crate::sizing::{BoxContentSizes, ContentSizes, ContentSizesRequest};
use crate::style_ext::DisplayGeneratingBox;
@@ -14,7 +17,6 @@ use crate::ContainingBlock;
use rayon::iter::{IntoParallelIterator, ParallelIterator};
use servo_arc::Arc;
use std::borrow::Cow;
-use style::properties::ComputedValues;
use style::values::computed::Length;
use style::values::specified::text::TextDecorationLine;
use style::Zero;
@@ -35,24 +37,22 @@ pub(crate) enum FlexLevelBox {
impl FlexContainer {
pub fn construct<'dom>(
context: &LayoutContext,
- node: impl NodeExt<'dom>,
- style: &Arc<ComputedValues>,
+ info: &NodeAndStyleInfo<impl NodeExt<'dom>>,
contents: NonReplacedContents,
content_sizes: ContentSizesRequest,
propagated_text_decoration_line: TextDecorationLine,
) -> (Self, BoxContentSizes) {
let text_decoration_line =
- propagated_text_decoration_line | style.clone_text_decoration_line();
+ propagated_text_decoration_line | info.style.clone_text_decoration_line();
let mut builder = FlexContainerBuilder {
context,
- node,
- style,
+ info,
text_decoration_line,
contiguous_text_runs: Vec::new(),
jobs: Vec::new(),
has_text_runs: false,
};
- contents.traverse(context, node, style, &mut builder);
+ contents.traverse(context, info, &mut builder);
let content_sizes = content_sizes.compute(|| {
// FIXME
ContentSizes::zero()
@@ -64,8 +64,7 @@ impl FlexContainer {
/// https://drafts.csswg.org/css-flexbox/#flex-items
struct FlexContainerBuilder<'a, 'dom, Node> {
context: &'a LayoutContext<'a>,
- node: Node,
- style: &'a Arc<ComputedValues>,
+ info: &'a NodeAndStyleInfo<Node>,
text_decoration_line: TextDecorationLine,
contiguous_text_runs: Vec<TextRun<'dom, Node>>,
/// To be run in parallel with rayon in `finish`
@@ -76,8 +75,7 @@ struct FlexContainerBuilder<'a, 'dom, Node> {
enum FlexLevelJob<'dom, Node> {
/// Or pseudo-element
Element {
- node: Node,
- style: Arc<ComputedValues>,
+ info: NodeAndStyleInfo<Node>,
display: DisplayGeneratingBox,
contents: Contents,
box_slot: BoxSlot<'dom>,
@@ -86,28 +84,25 @@ enum FlexLevelJob<'dom, Node> {
}
struct TextRun<'dom, Node> {
- node: Node,
+ info: NodeAndStyleInfo<Node>,
text: Cow<'dom, str>,
- parent_style: Arc<ComputedValues>,
}
impl<'a, 'dom, Node: 'dom> TraversalHandler<'dom, Node> for FlexContainerBuilder<'a, 'dom, Node>
where
Node: NodeExt<'dom>,
{
- fn handle_text(&mut self, node: Node, text: Cow<'dom, str>, parent_style: Arc<ComputedValues>) {
+ fn handle_text(&mut self, info: &NodeAndStyleInfo<Node>, text: Cow<'dom, str>) {
self.contiguous_text_runs.push(TextRun {
- node,
+ info: info.clone(),
text,
- parent_style,
})
}
/// Or pseudo-element
fn handle_element(
&mut self,
- node: Node,
- style: Arc<ComputedValues>,
+ info: &NodeAndStyleInfo<Node>,
display: DisplayGeneratingBox,
contents: Contents,
box_slot: BoxSlot<'dom>,
@@ -118,8 +113,7 @@ where
self.wrap_any_text_in_anonymous_block_container();
self.jobs.push(FlexLevelJob::Element {
- node,
- style,
+ info: info.clone(),
display,
contents,
box_slot,
@@ -162,7 +156,7 @@ where
.style_for_anonymous::<Node::ConcreteElement>(
&self.context.shared_context().guards,
&style::selector_parser::PseudoElement::ServoText,
- self.style,
+ &self.info.style,
),
)
} else {
@@ -175,20 +169,20 @@ where
FlexLevelJob::TextRuns(runs) => ArcRefCell::new(FlexLevelBox::FlexItem(
IndependentFormattingContext::construct_for_text_runs(
self.context,
- self.node,
- anonymous_style.clone().unwrap(),
+ &self
+ .info
+ .new_replacing_style(anonymous_style.clone().unwrap()),
runs.into_iter().map(|run| crate::flow::inline::TextRun {
- tag: run.node.as_opaque(),
+ tag: Tag::from_node_and_style_info(&run.info),
text: run.text.into(),
- parent_style: run.parent_style,
+ parent_style: run.info.style,
}),
ContentSizesRequest::None, // FIXME: request sizes when we start using them
self.text_decoration_line,
),
)),
FlexLevelJob::Element {
- node,
- style,
+ info,
display,
contents,
box_slot,
@@ -196,13 +190,12 @@ where
let display_inside = match display {
DisplayGeneratingBox::OutsideInside { inside, .. } => inside,
};
- let box_ = if style.get_box().position.is_absolutely_positioned() {
+ let box_ = if info.style.get_box().position.is_absolutely_positioned() {
// https://drafts.csswg.org/css-flexbox/#abspos-items
ArcRefCell::new(FlexLevelBox::OutOfFlowAbsolutelyPositionedBox(Arc::new(
AbsolutelyPositionedBox::construct(
self.context,
- node,
- style.clone(),
+ &info,
display_inside,
contents,
),
@@ -211,8 +204,7 @@ where
ArcRefCell::new(FlexLevelBox::FlexItem(
IndependentFormattingContext::construct(
self.context,
- node,
- style.clone(),
+ &info,
display_inside,
contents,
ContentSizesRequest::None, // FIXME: request sizes when we start using them