diff --git a/components/default-resources/resources/debugger.js b/components/default-resources/resources/debugger.js index e595bfd71df..8e65a8b357d 100644 --- a/components/default-resources/resources/debugger.js +++ b/components/default-resources/resources/debugger.js @@ -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 }; diff --git a/components/devtools/actors/console.rs b/components/devtools/actors/console.rs index ba67d9ac45b..327cc5ae52b 100644 --- a/components/devtools/actors/console.rs +++ b/components/devtools/actors/console.rs @@ -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")] diff --git a/components/devtools/actors/object.rs b/components/devtools/actors/object.rs index 22c719bd358..e3e66fa6db6 100644 --- a/components/devtools/actors/object.rs +++ b/components/devtools/actors/object.rs @@ -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 { } } -/// -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::(&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, diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index 88b76394f3d..e6e3a2ca9a5 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -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); } + +/// +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::(&object_name); + let value = serde_json::to_value(object_msg).unwrap_or_default(); + Value::Object(value.as_object().cloned().unwrap_or_default()) + }, + } +}