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:
parent
d15f63f4fd
commit
b4be616de0
|
|
@ -10,6 +10,8 @@ mod render_process_v8_handler;
|
||||||
mod resource_handler;
|
mod resource_handler;
|
||||||
mod scheme_handler_factory;
|
mod scheme_handler_factory;
|
||||||
|
|
||||||
|
mod display_handler;
|
||||||
|
|
||||||
pub(super) mod render_handler;
|
pub(super) mod render_handler;
|
||||||
pub(super) mod task;
|
pub(super) mod task;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,18 @@
|
||||||
use cef::rc::{Rc, RcImpl};
|
use cef::rc::{Rc, RcImpl};
|
||||||
use cef::sys::{_cef_client_t, cef_base_ref_counted_t};
|
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::CefEventHandler;
|
||||||
use crate::cef::ipc::{MessageType, UnpackMessage, UnpackedMessage};
|
use crate::cef::ipc::{MessageType, UnpackMessage, UnpackedMessage};
|
||||||
|
|
||||||
use super::browser_process_life_span_handler::BrowserProcessLifeSpanHandlerImpl;
|
use super::browser_process_life_span_handler::BrowserProcessLifeSpanHandlerImpl;
|
||||||
|
use super::display_handler::DisplayHandlerImpl;
|
||||||
|
|
||||||
pub(crate) struct BrowserProcessClientImpl<H: CefEventHandler> {
|
pub(crate) struct BrowserProcessClientImpl<H: CefEventHandler> {
|
||||||
object: *mut RcImpl<_cef_client_t, Self>,
|
object: *mut RcImpl<_cef_client_t, Self>,
|
||||||
render_handler: RenderHandler,
|
render_handler: RenderHandler,
|
||||||
event_handler: H,
|
event_handler: H,
|
||||||
|
display_handler: DisplayHandler,
|
||||||
}
|
}
|
||||||
impl<H: CefEventHandler> BrowserProcessClientImpl<H> {
|
impl<H: CefEventHandler> BrowserProcessClientImpl<H> {
|
||||||
pub(crate) fn new(render_handler: RenderHandler, event_handler: H) -> Self {
|
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(),
|
object: std::ptr::null_mut(),
|
||||||
render_handler,
|
render_handler,
|
||||||
event_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()))
|
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 {
|
fn get_raw(&self) -> *mut _cef_client_t {
|
||||||
self.object.cast()
|
self.object.cast()
|
||||||
}
|
}
|
||||||
|
|
@ -72,6 +79,7 @@ impl<H: CefEventHandler> Clone for BrowserProcessClientImpl<H> {
|
||||||
object: self.object,
|
object: self.object,
|
||||||
render_handler: self.render_handler.clone(),
|
render_handler: self.render_handler.clone(),
|
||||||
event_handler: self.event_handler.clone(),
|
event_handler: self.event_handler.clone(),
|
||||||
|
display_handler: self.display_handler.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -27,7 +27,7 @@ fn main() {
|
||||||
// We are in a CEF subprocess
|
// We are in a CEF subprocess
|
||||||
// This will block until the CEF subprocess quits
|
// This will block until the CEF subprocess quits
|
||||||
let error = cef_context_builder.execute_sub_process();
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue