devtools: Move debugger_value_to_json to lib.rs (#44160)

Testing: Existing tests pass
Part of: #36027

Signed-off-by: eri <eri@igalia.com>
Co-authored-by: atbrakhi <atbrakhi@igalia.com>
This commit is contained in:
eri
2026-04-13 13:19:19 +02:00
committed by GitHub
parent d58f2d4dd5
commit 38f77f4bfb
4 changed files with 53 additions and 53 deletions

View File

@@ -99,10 +99,9 @@ function createValueGrip(value, depth = 0) {
return { valueType: "-Infinity" };
} else if (Number.isNaN(value)) {
return { valueType: "NaN" };
} else if (!value && 1 / value === -Infinity) {
} else if (Object.is(value, -0)) {
return { valueType: "-0" };
}
return { valueType: "number", numberValue: value };
case "string":
return { valueType: "string", stringValue: value };

View File

@@ -23,11 +23,10 @@ use uuid::Uuid;
use crate::actor::{Actor, ActorError, ActorRegistry};
use crate::actors::browsing_context::BrowsingContextActor;
use crate::actors::object::debugger_value_to_json;
use crate::actors::worker::WorkerTargetActor;
use crate::protocol::{ClientRequest, DevtoolsConnection, JsonPacketStream};
use crate::resource::{ResourceArrayType, ResourceAvailable};
use crate::{EmptyReplyMsg, StreamId, UniqueId};
use crate::{EmptyReplyMsg, StreamId, UniqueId, debugger_value_to_json};
#[derive(Clone, Serialize, MallocSizeOf)]
#[serde(rename_all = "camelCase")]

View File

@@ -2,15 +2,15 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
use devtools_traits::{DebuggerValue, ObjectPreview, PropertyDescriptor};
use devtools_traits::{ObjectPreview, PropertyDescriptor};
use malloc_size_of_derive::MallocSizeOf;
use serde::Serialize;
use serde_json::{Map, Number, Value};
use serde_json::{Map, Value};
use crate::StreamId;
use crate::actor::{Actor, ActorEncode, ActorError, ActorRegistry};
use crate::actors::property_iterator::PropertyIteratorActor;
use crate::protocol::ClientRequest;
use crate::{StreamId, debugger_value_to_json};
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
@@ -77,52 +77,6 @@ impl ObjectPropertyDescriptor {
}
}
/// <https://searchfox.org/mozilla-central/source/devtools/server/actors/object/utils.js#148>
pub(crate) fn debugger_value_to_json(registry: &ActorRegistry, value: DebuggerValue) -> Value {
let mut v = Map::new();
match value {
DebuggerValue::VoidValue => {
v.insert("type".to_owned(), Value::String("undefined".to_owned()));
Value::Object(v)
},
DebuggerValue::NullValue => {
v.insert("type".to_owned(), Value::String("null".to_owned()));
Value::Object(v)
},
DebuggerValue::BooleanValue(boolean) => Value::Bool(boolean),
DebuggerValue::NumberValue(val) => {
if val.is_nan() {
v.insert("type".to_owned(), Value::String("NaN".to_owned()));
Value::Object(v)
} else if val.is_infinite() {
if val < 0. {
v.insert("type".to_owned(), Value::String("-Infinity".to_owned()));
} else {
v.insert("type".to_owned(), Value::String("Infinity".to_owned()));
}
Value::Object(v)
} else if val == 0. && val.is_sign_negative() {
v.insert("type".to_owned(), Value::String("-0".to_owned()));
Value::Object(v)
} else {
Value::Number(Number::from_f64(val).unwrap())
}
},
DebuggerValue::StringValue(str) => Value::String(str),
DebuggerValue::ObjectValue {
uuid,
class,
preview,
..
} => {
let object_name = ObjectActor::register(registry, Some(uuid), class, preview);
let object_msg = registry.encode::<ObjectActor, _>(&object_name);
let value = serde_json::to_value(object_msg).unwrap_or_default();
Value::Object(value.as_object().cloned().unwrap_or_default())
},
}
}
#[derive(MallocSizeOf)]
pub(crate) struct ObjectActor {
name: String,

View File

@@ -35,6 +35,7 @@ use rand::{RngCore, rng};
use resource::{ResourceArrayType, ResourceAvailable};
use rustc_hash::FxHashMap;
use serde::Serialize;
use serde_json::{Map, Number, Value};
use servo_base::generic_channel::{self, GenericSender};
use servo_base::id::{BrowsingContextId, PipelineId, WebViewId};
use servo_config::pref;
@@ -48,6 +49,7 @@ use crate::actors::framerate::FramerateActor;
use crate::actors::inspector::InspectorActor;
use crate::actors::inspector::walker::WalkerActor;
use crate::actors::network_event::NetworkEventActor;
use crate::actors::object::ObjectActor;
use crate::actors::pause::PauseActor;
use crate::actors::root::RootActor;
use crate::actors::source::SourceActor;
@@ -948,3 +950,49 @@ fn handle_client(
registry.cleanup(stream_id);
}
/// <https://searchfox.org/mozilla-central/source/devtools/server/actors/object/utils.js#148>
pub(crate) fn debugger_value_to_json(registry: &ActorRegistry, value: DebuggerValue) -> Value {
let mut v = Map::new();
match value {
DebuggerValue::VoidValue => {
v.insert("type".to_owned(), Value::String("undefined".to_owned()));
Value::Object(v)
},
DebuggerValue::NullValue => {
v.insert("type".to_owned(), Value::String("null".to_owned()));
Value::Object(v)
},
DebuggerValue::BooleanValue(boolean) => Value::Bool(boolean),
DebuggerValue::NumberValue(val) => {
if val.is_nan() {
v.insert("type".to_owned(), Value::String("NaN".to_owned()));
Value::Object(v)
} else if val.is_infinite() {
if val < 0. {
v.insert("type".to_owned(), Value::String("-Infinity".to_owned()));
} else {
v.insert("type".to_owned(), Value::String("Infinity".to_owned()));
}
Value::Object(v)
} else if val == 0. && val.is_sign_negative() {
v.insert("type".to_owned(), Value::String("-0".to_owned()));
Value::Object(v)
} else {
Value::Number(Number::from_f64(val).unwrap())
}
},
DebuggerValue::StringValue(str) => Value::String(str),
DebuggerValue::ObjectValue {
uuid,
class,
preview,
..
} => {
let object_name = ObjectActor::register(registry, Some(uuid), class, preview);
let object_msg = registry.encode::<ObjectActor, _>(&object_name);
let value = serde_json::to_value(object_msg).unwrap_or_default();
Value::Object(value.as_object().cloned().unwrap_or_default())
},
}
}