aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/flow/root.rs
diff options
context:
space:
mode:
authorbors-servo <infra@servo.org>2023-05-04 11:35:25 +0200
committerGitHub <noreply@github.com>2023-05-04 11:35:25 +0200
commit4e37d07ea4f2bba124f78f17873fbb02c66d1cdb (patch)
tree7dc272f33fa36faf34423d42dfa2e4654be09843 /components/layout_2020/flow/root.rs
parentf29834608aee21c1845737067c16f92adfb77f08 (diff)
parent72302e2dae6c4726ae657f7b5b8b048f9f64ccf2 (diff)
downloadservo-4e37d07ea4f2bba124f78f17873fbb02c66d1cdb.tar.gz
servo-4e37d07ea4f2bba124f78f17873fbb02c66d1cdb.zip
Auto merge of #29699 - mrobinson:add-html-body-tag, r=mukilan
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. <!-- Please describe your changes on the following line: --> --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: --> - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes do not require tests because it does not change behavior. <!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.--> <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
Diffstat (limited to 'components/layout_2020/flow/root.rs')
-rw-r--r--components/layout_2020/flow/root.rs32
1 files changed, 13 insertions, 19 deletions
diff --git a/components/layout_2020/flow/root.rs b/components/layout_2020/flow/root.rs
index e76f1b8da78..c0ca277167c 100644
--- a/components/layout_2020/flow/root.rs
+++ b/components/layout_2020/flow/root.rs
@@ -15,7 +15,8 @@ use crate::flow::float::FloatBox;
use crate::flow::inline::InlineLevelBox;
use crate::flow::{BlockContainer, BlockFormattingContext, BlockLevelBox};
use crate::formatting_contexts::IndependentFormattingContext;
-use crate::fragments::{Fragment, Tag};
+use crate::fragment_tree::Tag;
+use crate::fragments::Fragment;
use crate::geom::flow_relative::Vec2;
use crate::geom::{PhysicalPoint, PhysicalRect, PhysicalSize};
use crate::positioned::AbsolutelyPositionedBox;
@@ -36,7 +37,6 @@ use servo_arc::Arc;
use style::animation::AnimationSetKey;
use style::dom::OpaqueNode;
use style::properties::ComputedValues;
-use style::selector_parser::PseudoElement;
use style::values::computed::Length;
use style_traits::CSSPixel;
use webrender_api::{ClipId, SpaceAndClipInfo, SpatialId};
@@ -466,19 +466,15 @@ impl FragmentTree {
pub fn remove_nodes_in_fragment_tree_from_set(&self, set: &mut FxHashSet<AnimationSetKey>) {
self.find(|fragment, _, _| {
- let (node, pseudo) = match fragment.tag()? {
- Tag::Node(node) => (node, None),
- Tag::BeforePseudo(node) => (node, Some(PseudoElement::Before)),
- Tag::AfterPseudo(node) => (node, Some(PseudoElement::After)),
- };
- set.remove(&AnimationSetKey::new(node, pseudo));
+ let tag = fragment.tag()?;
+ set.remove(&AnimationSetKey::new(tag.node, tag.pseudo));
None::<()>
});
}
pub fn get_content_box_for_node(&self, requested_node: OpaqueNode) -> Rect<Au> {
let mut bounding_box = PhysicalRect::zero();
- let tag_to_find = Tag::Node(requested_node);
+ let tag_to_find = Tag::new(requested_node);
self.find(|fragment, _, containing_block| {
if fragment.tag() != Some(tag_to_find) {
return None::<()>;
@@ -516,17 +512,15 @@ impl FragmentTree {
}
pub fn get_border_dimensions_for_node(&self, requested_node: OpaqueNode) -> Rect<i32> {
+ let tag_to_find = Tag::new(requested_node);
self.find(|fragment, _, containing_block| {
+ if fragment.tag() != Some(tag_to_find) {
+ return None;
+ }
+
let (style, padding_rect) = match fragment {
- Fragment::Box(fragment) if fragment.tag.node() == requested_node => {
- (&fragment.style, fragment.padding_rect())
- },
- Fragment::AbsoluteOrFixedPositioned(_) |
- Fragment::Box(_) |
- Fragment::Text(_) |
- Fragment::Image(_) |
- Fragment::IFrame(_) |
- Fragment::Anonymous(_) => return None,
+ Fragment::Box(fragment) => (&fragment.style, fragment.padding_rect()),
+ _ => return None,
};
// https://drafts.csswg.org/cssom-view/#dom-element-clienttop
@@ -559,7 +553,7 @@ impl FragmentTree {
pub fn get_scroll_area_for_node(&self, requested_node: OpaqueNode) -> Rect<i32> {
let mut scroll_area: PhysicalRect<Length> = PhysicalRect::zero();
- let tag_to_find = Tag::Node(requested_node);
+ let tag_to_find = Tag::new(requested_node);
self.find(|fragment, _, containing_block| {
if fragment.tag() != Some(tag_to_find) {
return None::<()>;