mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
layout: Share styles to inline box children via SharedInlineStyles
(#36896)
`TextRun`s use their parent style to render. Previously, these styles were cloned and stored directly in the box tree `TextRun` and resulting `TextFragment`s. This presents a problem for incremental layout. Wrapping the style in another layer of shared ownership and mutability will allow updating all `TextFragment`s during repaint-only incremental layout by simply updating the box tree styles of the original text parents. This adds a new set of borrows when accessing text styles, but also makes it so that during box tree block construction `InlineFormattingContext`s are created lazily and now `InlineFormattingContextBuilder::finish` consumes the builder, making the API make a bit more sense. This should also improve performance of box tree block construction slightly. Testing: This should not change observable behavior and thus is covered by existing WPT tests. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Oriol Brufau <obrufau@igalia.com>
This commit is contained in:
parent
db83601b62
commit
a0dd2c1beb
24 changed files with 369 additions and 187 deletions
|
@ -23,6 +23,7 @@ use style::values::specified::Quotes;
|
|||
|
||||
use crate::context::LayoutContext;
|
||||
use crate::dom::{BoxSlot, LayoutBox, NodeExt};
|
||||
use crate::flow::inline::SharedInlineStyles;
|
||||
use crate::fragment_tree::{BaseFragmentInfo, FragmentFlags, Tag};
|
||||
use crate::quotes::quotes_for_lang;
|
||||
use crate::replaced::ReplacedContents;
|
||||
|
@ -185,6 +186,12 @@ pub(super) trait TraversalHandler<'dom> {
|
|||
contents: Contents,
|
||||
box_slot: BoxSlot<'dom>,
|
||||
);
|
||||
|
||||
/// Notify the handler that we are about to recurse into a `display: contents` element.
|
||||
fn enter_display_contents(&mut self, _: SharedInlineStyles) {}
|
||||
|
||||
/// Notify the handler that we have finished a `display: contents` element.
|
||||
fn leave_display_contents(&mut self) {}
|
||||
}
|
||||
|
||||
fn traverse_children_of<'dom>(
|
||||
|
@ -254,8 +261,15 @@ fn traverse_element<'dom>(
|
|||
// <https://drafts.csswg.org/css-display-3/#valdef-display-contents>
|
||||
element.unset_all_boxes()
|
||||
} else {
|
||||
element.element_box_slot().set(LayoutBox::DisplayContents);
|
||||
traverse_children_of(element, context, handler)
|
||||
let shared_inline_styles: SharedInlineStyles =
|
||||
(&NodeAndStyleInfo::new(element, style)).into();
|
||||
element
|
||||
.element_box_slot()
|
||||
.set(LayoutBox::DisplayContents(shared_inline_styles.clone()));
|
||||
|
||||
handler.enter_display_contents(shared_inline_styles);
|
||||
traverse_children_of(element, context, handler);
|
||||
handler.leave_display_contents();
|
||||
}
|
||||
},
|
||||
Display::GeneratingBox(display) => {
|
||||
|
@ -308,8 +322,12 @@ fn traverse_eager_pseudo_element<'dom>(
|
|||
Display::Contents => {
|
||||
let items = generate_pseudo_element_content(&info.style, node, context);
|
||||
let box_slot = node.pseudo_element_box_slot(pseudo_element_type);
|
||||
box_slot.set(LayoutBox::DisplayContents);
|
||||
let shared_inline_styles: SharedInlineStyles = (&info).into();
|
||||
box_slot.set(LayoutBox::DisplayContents(shared_inline_styles.clone()));
|
||||
|
||||
handler.enter_display_contents(shared_inline_styles);
|
||||
traverse_pseudo_element_contents(&info, context, handler, items);
|
||||
handler.leave_display_contents();
|
||||
},
|
||||
Display::GeneratingBox(display) => {
|
||||
let items = generate_pseudo_element_content(&info.style, node, context);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue