diff options
author | eri <eri@inventati.org> | 2024-07-30 12:18:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-30 10:18:21 +0000 |
commit | c06a6a764ea568be5faade665302aa23ca64304c (patch) | |
tree | 9e441120de676fb79b5db20cc0694ecb679d4876 /components/script/devtools.rs | |
parent | e23dc0bf6f5ed6dec0537a3f4f1c668937c87246 (diff) | |
download | servo-c06a6a764ea568be5faade665302aa23ca64304c.tar.gz servo-c06a6a764ea568be5faade665302aa23ca64304c.zip |
DevTools: Inline text and clean whitespace (#32884)
* feat: inline text contents
Signed-off-by: eri <eri@inventati.org>
* feat: filter whitespace only nodes
Signed-off-by: eri <eri@inventati.org>
* chore: cleanup
Signed-off-by: eri <eri@inventati.org>
* fix: url fix
Signed-off-by: eri <eri@inventati.org>
* fix: review fixes
Signed-off-by: eri <eri@inventati.org>
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
---------
Signed-off-by: eri <eri@inventati.org>
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
Diffstat (limited to 'components/script/devtools.rs')
-rw-r--r-- | components/script/devtools.rs | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/components/script/devtools.rs b/components/script/devtools.rs index 597ed25dfd5..14f792555a4 100644 --- a/components/script/devtools.rs +++ b/components/script/devtools.rs @@ -19,6 +19,7 @@ use crate::dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyl use crate::dom::bindings::codegen::Bindings::DOMRectBinding::DOMRectMethods; use crate::dom::bindings::codegen::Bindings::DocumentBinding::DocumentMethods; use crate::dom::bindings::codegen::Bindings::ElementBinding::ElementMethods; +use crate::dom::bindings::codegen::Bindings::NodeBinding::NodeConstants; use crate::dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use crate::dom::bindings::conversions::{jsstring_to_str, ConversionResult, FromJSValConvertible}; use crate::dom::bindings::inheritance::Castable; @@ -125,7 +126,43 @@ pub fn handle_get_children( match find_node_by_unique_id(documents, pipeline, &node_id) { None => reply.send(None).unwrap(), Some(parent) => { - let children = parent.children().map(|child| child.summarize()).collect(); + let is_whitespace = |node: &NodeInfo| { + node.node_type == NodeConstants::TEXT_NODE && + node.node_value + .as_ref() + .map_or(true, |v| v.trim().is_empty()) + }; + + let inline: Vec<_> = parent + .children() + .map(|child| { + let window = window_from_node(&*child); + let Some(elem) = child.downcast::<Element>() else { + return false; + }; + let computed_style = window.GetComputedStyle(elem, None); + let display = computed_style.Display(); + display == "inline" + }) + .collect(); + + let children: Vec<_> = parent + .children() + .enumerate() + .filter_map(|(i, child)| { + // Filter whitespace only text nodes that are not inline level + // https://firefox-source-docs.mozilla.org/devtools-user/page_inspector/how_to/examine_and_edit_html/index.html#whitespace-only-text-nodes + let prev_inline = i > 0 && inline[i - 1]; + let next_inline = i < inline.len() - 1 && inline[i + 1]; + + let info = child.summarize(); + if !is_whitespace(&info) { + return Some(info); + } + + (prev_inline && next_inline).then_some(info) + }) + .collect(); reply.send(Some(children)).unwrap(); }, |