Desktop: Browser console message forwarding (#3193)

* browser console message forwarding

* replace target to make it easy to identify browser console messages

* use warn as per review comment
This commit is contained in:
Timon 2025-09-25 10:42:07 +00:00 committed by GitHub
parent d15f63f4fd
commit b4be616de0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 77 additions and 2 deletions

View file

@ -10,6 +10,8 @@ mod render_process_v8_handler;
mod resource_handler;
mod scheme_handler_factory;
mod display_handler;
pub(super) mod render_handler;
pub(super) mod task;

View file

@ -1,16 +1,18 @@
use cef::rc::{Rc, RcImpl};
use cef::sys::{_cef_client_t, cef_base_ref_counted_t};
use cef::{ImplClient, LifeSpanHandler, RenderHandler, WrapClient};
use cef::{DisplayHandler, ImplClient, LifeSpanHandler, RenderHandler, WrapClient};
use crate::cef::CefEventHandler;
use crate::cef::ipc::{MessageType, UnpackMessage, UnpackedMessage};
use super::browser_process_life_span_handler::BrowserProcessLifeSpanHandlerImpl;
use super::display_handler::DisplayHandlerImpl;
pub(crate) struct BrowserProcessClientImpl<H: CefEventHandler> {
object: *mut RcImpl<_cef_client_t, Self>,
render_handler: RenderHandler,
event_handler: H,
display_handler: DisplayHandler,
}
impl<H: CefEventHandler> BrowserProcessClientImpl<H> {
pub(crate) fn new(render_handler: RenderHandler, event_handler: H) -> Self {
@ -18,6 +20,7 @@ impl<H: CefEventHandler> BrowserProcessClientImpl<H> {
object: std::ptr::null_mut(),
render_handler,
event_handler,
display_handler: DisplayHandler::new(DisplayHandlerImpl::new()),
}
}
}
@ -57,6 +60,10 @@ impl<H: CefEventHandler> ImplClient for BrowserProcessClientImpl<H> {
Some(LifeSpanHandler::new(BrowserProcessLifeSpanHandlerImpl::new()))
}
fn display_handler(&self) -> Option<cef::DisplayHandler> {
Some(self.display_handler.clone())
}
fn get_raw(&self) -> *mut _cef_client_t {
self.object.cast()
}
@ -72,6 +79,7 @@ impl<H: CefEventHandler> Clone for BrowserProcessClientImpl<H> {
object: self.object,
render_handler: self.render_handler.clone(),
event_handler: self.event_handler.clone(),
display_handler: self.display_handler.clone(),
}
}
}

View file

@ -0,0 +1,65 @@
use cef::rc::{Rc, RcImpl};
use cef::sys::{_cef_display_handler_t, cef_base_ref_counted_t, cef_log_severity_t::*};
use cef::{CefString, ImplDisplayHandler, WrapDisplayHandler};
pub(crate) struct DisplayHandlerImpl {
object: *mut RcImpl<_cef_display_handler_t, Self>,
}
impl DisplayHandlerImpl {
pub fn new() -> Self {
Self { object: std::ptr::null_mut() }
}
}
impl ImplDisplayHandler for DisplayHandlerImpl {
fn on_console_message(
&self,
_browser: Option<&mut cef::Browser>,
level: cef::LogSeverity,
message: Option<&CefString>,
source: Option<&CefString>,
line: ::std::os::raw::c_int,
) -> ::std::os::raw::c_int {
let message = message.map(|m| m.to_string()).unwrap_or_default();
let source = source.map(|s| s.to_string()).unwrap_or_default();
let line = line as i64;
let browser_source = format!("{source}:{line}");
static BROWSER: &str = "browser";
match level.as_ref() {
LOGSEVERITY_FATAL | LOGSEVERITY_ERROR => tracing::error!(target: BROWSER, "{browser_source} {message}"),
LOGSEVERITY_WARNING => tracing::warn!(target: BROWSER, "{browser_source} {message}"),
LOGSEVERITY_INFO => tracing::info!(target: BROWSER, "{browser_source} {message}"),
LOGSEVERITY_DEFAULT | LOGSEVERITY_VERBOSE => tracing::debug!(target: BROWSER, "{browser_source} {message}"),
_ => tracing::trace!(target: BROWSER, "{browser_source} {message}"),
}
0
}
fn get_raw(&self) -> *mut _cef_display_handler_t {
self.object.cast()
}
}
impl Clone for DisplayHandlerImpl {
fn clone(&self) -> Self {
unsafe {
let rc_impl = &mut *self.object;
rc_impl.interface.add_ref();
}
Self { object: self.object }
}
}
impl Rc for DisplayHandlerImpl {
fn as_base(&self) -> &cef_base_ref_counted_t {
unsafe {
let base = &*self.object;
std::mem::transmute(&base.cef_object)
}
}
}
impl WrapDisplayHandler for DisplayHandlerImpl {
fn wrap_rc(&mut self, object: *mut RcImpl<_cef_display_handler_t, Self>) {
self.object = object;
}
}

View file

@ -27,7 +27,7 @@ fn main() {
// We are in a CEF subprocess
// This will block until the CEF subprocess quits
let error = cef_context_builder.execute_sub_process();
tracing::error!("Cef subprocess failed with error: {error}");
tracing::warn!("Cef subprocess failed with error: {error}");
return;
}