aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_2020/layout_debug.rs
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2023-04-30 20:21:58 +0200
committerMartin Robinson <mrobinson@igalia.com>2023-05-04 10:46:27 +0200
commit72302e2dae6c4726ae657f7b5b8b048f9f64ccf2 (patch)
tree307e1972dd46de70388bd9cba0f8589f05250226 /components/layout_2020/layout_debug.rs
parent77a184a0e7379a63a0d9d8bf442d8dd5c3b5e307 (diff)
downloadservo-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.rs38
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))
+ }
+}