diff options
author | Martin Robinson <mrobinson@igalia.com> | 2023-04-30 20:21:58 +0200 |
---|---|---|
committer | Martin Robinson <mrobinson@igalia.com> | 2023-05-04 10:46:27 +0200 |
commit | 72302e2dae6c4726ae657f7b5b8b048f9f64ccf2 (patch) | |
tree | 307e1972dd46de70388bd9cba0f8589f05250226 /components/layout_2020/layout_debug.rs | |
parent | 77a184a0e7379a63a0d9d8bf442d8dd5c3b5e307 (diff) | |
download | servo-72302e2dae6c4726ae657f7b5b8b048f9f64ccf2.tar.gz servo-72302e2dae6c4726ae657f7b5b8b048f9f64ccf2.zip |
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.
Diffstat (limited to 'components/layout_2020/layout_debug.rs')
-rw-r--r-- | components/layout_2020/layout_debug.rs | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/components/layout_2020/layout_debug.rs b/components/layout_2020/layout_debug.rs index 79762f8b757..21636f32a89 100644 --- a/components/layout_2020/layout_debug.rs +++ b/components/layout_2020/layout_debug.rs @@ -6,6 +6,8 @@ //! that can be viewed by an external tool to make layout debugging easier. use crate::flow::{BoxTree, FragmentTree}; +#[cfg(not(debug_assertions))] +use serde::ser::{Serialize, Serializer}; use serde_json::{to_string, to_value, Value}; use std::cell::RefCell; use std::fs; @@ -101,12 +103,6 @@ impl Drop for Scope { } } -/// Generate a unique ID for Fragments. -#[cfg(debug_assertions)] -pub fn generate_unique_debug_id() -> u16 { - DEBUG_ID_COUNTER.fetch_add(1, Ordering::SeqCst) as u16 -} - /// Begin a layout debug trace. If this has not been called, /// creating debug scopes has no effect. pub fn begin_trace(box_tree: Arc<BoxTree>, fragment_tree: Arc<FragmentTree>) { @@ -146,3 +142,33 @@ pub fn end_trace(generation: u32) { ) .unwrap(); } + +#[cfg(not(debug_assertions))] +#[derive(Clone, Debug)] +pub struct DebugId; + +#[cfg(debug_assertions)] +#[derive(Clone, Debug, Serialize)] +#[serde(transparent)] +pub struct DebugId(u16); + +#[cfg(not(debug_assertions))] +impl DebugId { + pub fn new() -> DebugId { + DebugId + } +} + +#[cfg(debug_assertions)] +impl DebugId { + pub fn new() -> DebugId { + DebugId(DEBUG_ID_COUNTER.fetch_add(1, Ordering::SeqCst) as u16) + } +} + +#[cfg(not(debug_assertions))] +impl Serialize for DebugId { + fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> { + serializer.serialize_str(&format!("{:p}", &self)) + } +} |