Skip to content

Commit b4be616

Browse files
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
1 parent d15f63f commit b4be616

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

desktop/src/cef/internal.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ mod render_process_v8_handler;
1010
mod resource_handler;
1111
mod scheme_handler_factory;
1212

13+
mod display_handler;
14+
1315
pub(super) mod render_handler;
1416
pub(super) mod task;
1517

desktop/src/cef/internal/browser_process_client.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,26 @@
11
use cef::rc::{Rc, RcImpl};
22
use cef::sys::{_cef_client_t, cef_base_ref_counted_t};
3-
use cef::{ImplClient, LifeSpanHandler, RenderHandler, WrapClient};
3+
use cef::{DisplayHandler, ImplClient, LifeSpanHandler, RenderHandler, WrapClient};
44

55
use crate::cef::CefEventHandler;
66
use crate::cef::ipc::{MessageType, UnpackMessage, UnpackedMessage};
77

88
use super::browser_process_life_span_handler::BrowserProcessLifeSpanHandlerImpl;
9+
use super::display_handler::DisplayHandlerImpl;
910

1011
pub(crate) struct BrowserProcessClientImpl<H: CefEventHandler> {
1112
object: *mut RcImpl<_cef_client_t, Self>,
1213
render_handler: RenderHandler,
1314
event_handler: H,
15+
display_handler: DisplayHandler,
1416
}
1517
impl<H: CefEventHandler> BrowserProcessClientImpl<H> {
1618
pub(crate) fn new(render_handler: RenderHandler, event_handler: H) -> Self {
1719
Self {
1820
object: std::ptr::null_mut(),
1921
render_handler,
2022
event_handler,
23+
display_handler: DisplayHandler::new(DisplayHandlerImpl::new()),
2124
}
2225
}
2326
}
@@ -57,6 +60,10 @@ impl<H: CefEventHandler> ImplClient for BrowserProcessClientImpl<H> {
5760
Some(LifeSpanHandler::new(BrowserProcessLifeSpanHandlerImpl::new()))
5861
}
5962

63+
fn display_handler(&self) -> Option<cef::DisplayHandler> {
64+
Some(self.display_handler.clone())
65+
}
66+
6067
fn get_raw(&self) -> *mut _cef_client_t {
6168
self.object.cast()
6269
}
@@ -72,6 +79,7 @@ impl<H: CefEventHandler> Clone for BrowserProcessClientImpl<H> {
7279
object: self.object,
7380
render_handler: self.render_handler.clone(),
7481
event_handler: self.event_handler.clone(),
82+
display_handler: self.display_handler.clone(),
7583
}
7684
}
7785
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
use cef::rc::{Rc, RcImpl};
2+
use cef::sys::{_cef_display_handler_t, cef_base_ref_counted_t, cef_log_severity_t::*};
3+
use cef::{CefString, ImplDisplayHandler, WrapDisplayHandler};
4+
5+
pub(crate) struct DisplayHandlerImpl {
6+
object: *mut RcImpl<_cef_display_handler_t, Self>,
7+
}
8+
9+
impl DisplayHandlerImpl {
10+
pub fn new() -> Self {
11+
Self { object: std::ptr::null_mut() }
12+
}
13+
}
14+
15+
impl ImplDisplayHandler for DisplayHandlerImpl {
16+
fn on_console_message(
17+
&self,
18+
_browser: Option<&mut cef::Browser>,
19+
level: cef::LogSeverity,
20+
message: Option<&CefString>,
21+
source: Option<&CefString>,
22+
line: ::std::os::raw::c_int,
23+
) -> ::std::os::raw::c_int {
24+
let message = message.map(|m| m.to_string()).unwrap_or_default();
25+
let source = source.map(|s| s.to_string()).unwrap_or_default();
26+
let line = line as i64;
27+
let browser_source = format!("{source}:{line}");
28+
static BROWSER: &str = "browser";
29+
match level.as_ref() {
30+
LOGSEVERITY_FATAL | LOGSEVERITY_ERROR => tracing::error!(target: BROWSER, "{browser_source} {message}"),
31+
LOGSEVERITY_WARNING => tracing::warn!(target: BROWSER, "{browser_source} {message}"),
32+
LOGSEVERITY_INFO => tracing::info!(target: BROWSER, "{browser_source} {message}"),
33+
LOGSEVERITY_DEFAULT | LOGSEVERITY_VERBOSE => tracing::debug!(target: BROWSER, "{browser_source} {message}"),
34+
_ => tracing::trace!(target: BROWSER, "{browser_source} {message}"),
35+
}
36+
0
37+
}
38+
39+
fn get_raw(&self) -> *mut _cef_display_handler_t {
40+
self.object.cast()
41+
}
42+
}
43+
44+
impl Clone for DisplayHandlerImpl {
45+
fn clone(&self) -> Self {
46+
unsafe {
47+
let rc_impl = &mut *self.object;
48+
rc_impl.interface.add_ref();
49+
}
50+
Self { object: self.object }
51+
}
52+
}
53+
impl Rc for DisplayHandlerImpl {
54+
fn as_base(&self) -> &cef_base_ref_counted_t {
55+
unsafe {
56+
let base = &*self.object;
57+
std::mem::transmute(&base.cef_object)
58+
}
59+
}
60+
}
61+
impl WrapDisplayHandler for DisplayHandlerImpl {
62+
fn wrap_rc(&mut self, object: *mut RcImpl<_cef_display_handler_t, Self>) {
63+
self.object = object;
64+
}
65+
}

desktop/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ fn main() {
2727
// We are in a CEF subprocess
2828
// This will block until the CEF subprocess quits
2929
let error = cef_context_builder.execute_sub_process();
30-
tracing::error!("Cef subprocess failed with error: {error}");
30+
tracing::warn!("Cef subprocess failed with error: {error}");
3131
return;
3232
}
3333

0 commit comments

Comments
 (0)