mirror of
https://github.com/servo/servo.git
synced 2025-08-04 21:20:23 +01:00
Detect body elements during layout
During layout it is often useful, for various specification reasons, to know if an element is the `<body>` element of an `<html>` element root. There are a couple places where a brittle heuristic is used to detect `<body>` elements. This information is going to be even more important to properly handle `<html>` elements that inherit their overflow property from their `<body>` children. Implementing this properly requires updating the DOM wrapper interface. This check does reach up to the parent of thread-safe nodes, but this is essentially the same kind of operation that `parent_style()` does, so is ostensibly safe. This change should not change any behavior and is just a preparation step for properly handle `<body>` overflow.
This commit is contained in:
parent
77a184a0e7
commit
72302e2dae
26 changed files with 487 additions and 277 deletions
|
@ -12,7 +12,6 @@ use crate::flow::float::FloatBox;
|
|||
use crate::flow::inline::{InlineBox, InlineFormattingContext, InlineLevelBox, TextRun};
|
||||
use crate::flow::{BlockContainer, BlockFormattingContext, BlockLevelBox};
|
||||
use crate::formatting_contexts::IndependentFormattingContext;
|
||||
use crate::fragments::Tag;
|
||||
use crate::positioned::AbsolutelyPositionedBox;
|
||||
use crate::style_ext::{DisplayGeneratingBox, DisplayInside, DisplayOutside};
|
||||
use rayon::iter::{IntoParallelIterator, ParallelIterator};
|
||||
|
@ -384,7 +383,7 @@ where
|
|||
|
||||
if let Some(text) = new_text_run_contents {
|
||||
inlines.push(ArcRefCell::new(InlineLevelBox::TextRun(TextRun {
|
||||
tag: Tag::from_node_and_style_info(info),
|
||||
base_fragment_info: info.into(),
|
||||
parent_style: Arc::clone(&info.style),
|
||||
text,
|
||||
})))
|
||||
|
@ -495,7 +494,7 @@ where
|
|||
// Whatever happened before, all we need to do before recurring
|
||||
// is to remember this ongoing inline level box.
|
||||
self.ongoing_inline_boxes_stack.push(InlineBox {
|
||||
tag: Tag::from_node_and_style_info(info),
|
||||
base_fragment_info: info.into(),
|
||||
style: info.style.clone(),
|
||||
first_fragment: true,
|
||||
last_fragment: false,
|
||||
|
@ -556,7 +555,7 @@ where
|
|||
.rev()
|
||||
.map(|ongoing| {
|
||||
let fragmented = InlineBox {
|
||||
tag: ongoing.tag,
|
||||
base_fragment_info: ongoing.base_fragment_info,
|
||||
style: ongoing.style.clone(),
|
||||
first_fragment: ongoing.first_fragment,
|
||||
// The fragmented boxes before the block level element
|
||||
|
@ -755,7 +754,7 @@ where
|
|||
BlockLevelCreator::SameFormattingContextBlock(contents) => {
|
||||
let (contents, contains_floats) = contents.finish(context, info);
|
||||
let block_level_box = ArcRefCell::new(BlockLevelBox::SameFormattingContextBlock {
|
||||
tag: Tag::from_node_and_style_info(info),
|
||||
base_fragment_info: info.into(),
|
||||
contents,
|
||||
style: Arc::clone(&info.style),
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue