Support syntax highlighting of arguments in the devtools console (#34810)

* Implement Builder struct for console messages

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Support integer arguments for console methods

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Support floating point arguments to console methods in devtools

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Fix warnings

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

* Tidy

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>

---------

Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
Simon Wülker 2025-01-02 19:47:52 +01:00 committed by GitHub
parent 7c023ee02a
commit b252f238d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 242 additions and 95 deletions

View file

@ -12,7 +12,7 @@
use std::collections::HashMap;
use std::net::TcpStream;
use std::time::{Duration, SystemTime};
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use base::cross_process_instant::CrossProcessInstant;
use base::id::{BrowsingContextId, PipelineId};
@ -283,15 +283,23 @@ pub enum LogLevel {
Trace,
}
/// A console message as it is sent from script to the constellation
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ConsoleMessage {
pub message: String,
pub log_level: LogLevel,
pub filename: String,
pub line_number: usize,
pub column_number: usize,
pub stacktrace: Vec<StackFrame>,
pub arguments: Vec<ConsoleMessageArgument>,
pub stacktrace: Option<Vec<StackFrame>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum ConsoleMessageArgument {
String(String),
Integer(i32),
Number(f64),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
@ -335,6 +343,7 @@ pub struct PageError {
pub private: bool,
}
/// Represents a console message as it is sent to the devtools
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ConsoleLog {
pub level: String,
@ -342,8 +351,39 @@ pub struct ConsoleLog {
pub line_number: u32,
pub column_number: u32,
pub time_stamp: u64,
pub arguments: Vec<String>,
pub stacktrace: Vec<StackFrame>,
pub arguments: Vec<ConsoleArgument>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stacktrace: Option<Vec<StackFrame>>,
}
impl From<ConsoleMessage> for ConsoleLog {
fn from(value: ConsoleMessage) -> Self {
let level = match value.log_level {
LogLevel::Debug => "debug",
LogLevel::Info => "info",
LogLevel::Warn => "warn",
LogLevel::Error => "error",
LogLevel::Clear => "clear",
LogLevel::Trace => "trace",
LogLevel::Log => "log",
}
.to_owned();
let time_stamp = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_millis() as u64;
Self {
level,
filename: value.filename,
line_number: value.line_number as u32,
column_number: value.column_number as u32,
time_stamp,
arguments: value.arguments.into_iter().map(|arg| arg.into()).collect(),
stacktrace: value.stacktrace,
}
}
}
#[derive(Debug, Deserialize, Serialize)]
@ -412,3 +452,70 @@ pub struct CssDatabaseProperty {
pub supports: Vec<String>,
pub subproperties: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(untagged)]
pub enum ConsoleArgument {
String(String),
Integer(i32),
Number(f64),
}
impl From<ConsoleMessageArgument> for ConsoleArgument {
fn from(value: ConsoleMessageArgument) -> Self {
match value {
ConsoleMessageArgument::String(string) => Self::String(string),
ConsoleMessageArgument::Integer(integer) => Self::Integer(integer),
ConsoleMessageArgument::Number(number) => Self::Number(number),
}
}
}
impl From<String> for ConsoleMessageArgument {
fn from(value: String) -> Self {
Self::String(value)
}
}
pub struct ConsoleMessageBuilder {
level: LogLevel,
filename: String,
line_number: u32,
column_number: u32,
arguments: Vec<ConsoleMessageArgument>,
stack_trace: Option<Vec<StackFrame>>,
}
impl ConsoleMessageBuilder {
pub fn new(level: LogLevel, filename: String, line_number: u32, column_number: u32) -> Self {
Self {
level,
filename,
line_number,
column_number,
arguments: vec![],
stack_trace: None,
}
}
pub fn attach_stack_trace(&mut self, stack_trace: Vec<StackFrame>) -> &mut Self {
self.stack_trace = Some(stack_trace);
self
}
pub fn add_argument(&mut self, argument: ConsoleMessageArgument) -> &mut Self {
self.arguments.push(argument);
self
}
pub fn finish(self) -> ConsoleMessage {
ConsoleMessage {
log_level: self.level,
filename: self.filename,
line_number: self.line_number as usize,
column_number: self.column_number as usize,
arguments: self.arguments,
stacktrace: self.stack_trace,
}
}
}