script: Tell devtools whether a node is displayed or not (#38575)

Doing so makes the devtools inspector display the nodes in gray, as it
is the case in firefox.
The relevant node parameter already exists but is hardcoded.

Before:
<img width="1108" height="408" alt="image"
src="https://github.com/user-attachments/assets/4a442fc9-92db-4a97-9e70-3b02f994a9d1"
/>


After:
<img width="1169" height="404" alt="image"
src="https://github.com/user-attachments/assets/ec1674a4-c025-4ceb-93c8-0cc3f695ddc7"
/>


Testing: We don't have tests for the devtools inspector.

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
Simon Wülker 2025-08-09 20:12:20 +02:00 committed by GitHub
parent c4044e17bb
commit 4d7a0d3863
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 16 additions and 15 deletions

View file

@ -92,13 +92,8 @@ impl Actor for InspectorActor {
.clone()
.unwrap_or_else(|| registry.new_name("walker"));
let root = root_info.encode(
registry,
false,
self.script_chan.clone(),
pipeline,
name.clone(),
);
let root =
root_info.encode(registry, self.script_chan.clone(), pipeline, name.clone());
if self.walker.borrow().is_none() {
let walker = WalkerActor {

View file

@ -59,6 +59,9 @@ pub struct NodeActorMsg {
is_anonymous: bool,
is_before_pseudo_element: bool,
is_direct_shadow_host_child: Option<bool>,
/// Whether or not this node is displayed.
///
/// Setting this value to `false` will cause the devtools to render the node name in gray.
is_displayed: bool,
#[serde(rename = "isInHTMLDocument")]
is_in_html_document: Option<bool>,
@ -158,7 +161,6 @@ impl Actor for NodeActor {
.ok_or(ActorError::Internal)?;
let node = doc_elem_info.encode(
registry,
true,
self.script_chan.clone(),
self.pipeline,
self.walker.clone(),
@ -181,7 +183,6 @@ pub trait NodeInfoToProtocol {
fn encode(
self,
actors: &ActorRegistry,
display: bool,
script_chan: IpcSender<DevtoolScriptControlMsg>,
pipeline: PipelineId,
walker: String,
@ -192,7 +193,6 @@ impl NodeInfoToProtocol for NodeInfo {
fn encode(
self,
actors: &ActorRegistry,
display: bool,
script_chan: IpcSender<DevtoolScriptControlMsg>,
pipeline: PipelineId,
walker: String,
@ -239,7 +239,7 @@ impl NodeInfoToProtocol for NodeInfo {
let mut children = rx.recv().ok()??;
let child = children.pop()?;
let msg = child.encode(actors, true, script_chan.clone(), pipeline, walker);
let msg = child.encode(actors, script_chan.clone(), pipeline, walker);
// If the node child is not a text node, do not represent it inline.
if msg.node_type != TEXT_NODE {
@ -267,7 +267,7 @@ impl NodeInfoToProtocol for NodeInfo {
is_anonymous: false,
is_before_pseudo_element: false,
is_direct_shadow_host_child: None,
is_displayed: display,
is_displayed: self.is_displayed,
is_in_html_document: Some(true),
is_marker_pseudo_element: false,
is_native_anonymous: false,

View file

@ -156,7 +156,6 @@ impl Actor for WalkerActor {
.map(|child| {
child.encode(
registry,
true,
self.script_chan.clone(),
self.pipeline,
self.name(),
@ -182,7 +181,6 @@ impl Actor for WalkerActor {
.ok_or(ActorError::Internal)?;
let node = doc_elem_info.encode(
registry,
true,
self.script_chan.clone(),
self.pipeline,
self.name(),
@ -319,7 +317,7 @@ pub fn find_child(
let children = rx.recv().unwrap().ok_or(vec![])?;
for child in children {
let msg = child.encode(registry, true, script_chan.clone(), pipeline, name.into());
let msg = child.encode(registry, script_chan.clone(), pipeline, name.into());
if compare_fn(&msg) {
hierarchy.push(msg);
return Ok(hierarchy);

View file

@ -1320,6 +1320,10 @@ impl Node {
is_shadow_host,
shadow_root_mode,
display,
// It is not entirely clear when this should be set to false.
// Firefox considers nodes with "display: contents" to be displayed.
// The doctype node is displayed despite being `display: none`.
is_displayed: !self.is_display_none() || self.is::<DocumentType>(),
doctype_name: self
.downcast::<DocumentType>()
.map(DocumentType::name)

View file

@ -149,6 +149,10 @@ pub struct NodeInfo {
pub shadow_root_mode: Option<ShadowRootMode>,
pub is_shadow_host: bool,
pub display: Option<String>,
/// Whether this node is currently displayed.
///
/// For example, the node might have `display: none`.
pub is_displayed: bool,
/// The `DOCTYPE` name if this is a `DocumentType` node, `None` otherwise
pub doctype_name: Option<String>,