diff options
author | Astraea Quinn S <52372765+PartiallyUntyped@users.noreply.github.com> | 2025-04-15 12:19:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-15 10:19:13 +0000 |
commit | 064f82d0a3ccc5f964e0a161d891b53a692d0729 (patch) | |
tree | 2c879e13791bf69c72b594d717dc79daf222557c | |
parent | 1ea80c4335f7858f0550832e92635e3682ac5b0e (diff) | |
download | servo-064f82d0a3ccc5f964e0a161d891b53a692d0729.tar.gz servo-064f82d0a3ccc5f964e0a161d891b53a692d0729.zip |
[OHOS] Allow setting the log-filter via cli arguments (#36444)
This PR allows setting the log-filter according to the env_filter spec
via CLI arguments.
Testing is currently in progress, will be done on machines running OHOS.
---------
Signed-off-by: Astraea Quinn Skoutelli <astraea.quinn.skoutelli@huawei.com>
Co-authored-by: Jonathan Schwender <schwenderjonathan@gmail.com>
-rw-r--r-- | ports/servoshell/egl/ohos.rs | 75 | ||||
-rw-r--r-- | ports/servoshell/egl/ohos/simpleservo.rs | 2 | ||||
-rw-r--r-- | ports/servoshell/prefs.rs | 27 |
3 files changed, 75 insertions, 29 deletions
diff --git a/ports/servoshell/egl/ohos.rs b/ports/servoshell/egl/ohos.rs index 1153ad80de9..fbdbe5395a1 100644 --- a/ports/servoshell/egl/ohos.rs +++ b/ports/servoshell/egl/ohos.rs @@ -7,7 +7,7 @@ use std::cell::RefCell; use std::mem::MaybeUninit; use std::os::raw::c_void; use std::sync::mpsc::{Receiver, Sender}; -use std::sync::{Once, OnceLock, mpsc}; +use std::sync::{LazyLock, Once, OnceLock, mpsc}; use std::thread; use std::thread::sleep; use std::time::Duration; @@ -386,32 +386,38 @@ extern "C" fn on_dispatch_key_event(xc: *mut OH_NativeXComponent, _window: *mut } } +static LOGGER: LazyLock<hilog::Logger> = LazyLock::new(|| { + let mut builder = hilog::Builder::new(); + let filters = [ + "fonts", + "servo", + "servoshell", + "servoshell::egl:gl_glue", + // Show redirected stdout / stderr by default + "servoshell::egl::log", + // Show JS errors by default. + "script::dom::bindings::error", + // Show GL errors by default. + "canvas::webgl_thread", + "compositing::compositor", + "compositing::touch", + "constellation::constellation", + "ohos_ime", + ]; + for &module in &filters { + builder.filter_module(module, log::LevelFilter::Debug); + } + + builder.filter_level(LevelFilter::Warn).build() +}); + fn initialize_logging_once() { static ONCE: Once = Once::new(); ONCE.call_once(|| { - let mut builder = hilog::Builder::new(); - let filters = [ - "fonts", - "servo", - "servoshell", - "servoshell::egl:gl_glue", - // Show redirected stdout / stderr by default - "servoshell::egl::log", - // Show JS errors by default. - "script::dom::bindings::error", - // Show GL errors by default. - "canvas::webgl_thread", - "compositing::compositor", - "compositing::touch", - "constellation::constellation", - "ohos_ime", - ]; - for &module in &filters { - builder.filter_module(module, log::LevelFilter::Debug); - } - - builder.filter_level(LevelFilter::Warn).init(); - + let logger: &'static hilog::Logger = &LOGGER; + let max_level = logger.filter(); + let r = log::set_logger(logger).and_then(|()| Ok(log::set_max_level(max_level))); + debug!("Attempted to register the logger: {r:?} and set max level to: {max_level}"); info!("Servo Register callback called!"); std::panic::set_hook(Box::new(|info| { @@ -447,7 +453,26 @@ fn initialize_logging_once() { if let Err(e) = super::log::redirect_stdout_and_stderr() { error!("Failed to redirect stdout and stderr to hilog due to: {e:?}"); } - }) + }); +} + +pub fn set_log_filter(filter: Option<&str>) { + let Some(filter) = filter else { + debug!("Called ohos::set_log_filter without providing a filter"); + return; + }; + + debug!("Updating log filter to {filter}"); + let mut builder = env_filter::Builder::new(); + let filter = match builder.try_parse(filter) { + Result::Ok(filter) => filter, + Result::Err(err) => { + error!("Failed to parse log filter: {err}"); + return; + }, + }; + let filter = filter.build(); + (*LOGGER).set_filter(filter); } fn register_xcomponent_callbacks(env: &Env, xcomponent: &JsObject) -> napi_ohos::Result<()> { diff --git a/ports/servoshell/egl/ohos/simpleservo.rs b/ports/servoshell/egl/ohos/simpleservo.rs index 49c684627c3..3bb1191f3f6 100644 --- a/ports/servoshell/egl/ohos/simpleservo.rs +++ b/ports/servoshell/egl/ohos/simpleservo.rs @@ -97,6 +97,8 @@ pub fn init( }; crate::init_tracing(servoshell_preferences.tracing_filter.as_deref()); + #[cfg(target_env = "ohos")] + crate::egl::ohos::set_log_filter(servoshell_preferences.log_filter.as_deref()); let Ok(window_size) = (unsafe { super::get_xcomponent_size(xcomponent, native_window) }) else { return Err("Failed to get xcomponent size"); diff --git a/ports/servoshell/prefs.rs b/ports/servoshell/prefs.rs index 2bd95398f63..7eae7a3850c 100644 --- a/ports/servoshell/prefs.rs +++ b/ports/servoshell/prefs.rs @@ -57,6 +57,11 @@ pub(crate) struct ServoShellPreferences { /// Where to load userscripts from, if any. /// and if the option isn't passed userscripts won't be loaded. pub userscripts_directory: Option<PathBuf>, + + /// Log filter given in the `log_filter` spec as a String, if any. + /// If a filter is passed, the logger should adjust accordingly. + #[cfg(target_env = "ohos")] + pub log_filter: Option<String>, } impl Default for ServoShellPreferences { @@ -75,6 +80,8 @@ impl Default for ServoShellPreferences { output_image_path: None, exit_after_stable_image: false, userscripts_directory: None, + #[cfg(target_env = "ohos")] + log_filter: None, } } } @@ -348,6 +355,14 @@ pub(crate) fn parse_command_line_arguments(args: Vec<String>) -> ArgumentParsing "FILTER", ); + #[cfg(target_env = "ohos")] + opts.optmulti( + "", + "log-filter", + "Define a custom filter for logging.", + "FILTER", + ); + opts.optflag( "", "enable-experimental-web-platform-features", @@ -408,10 +423,12 @@ pub(crate) fn parse_command_line_arguments(args: Vec<String>) -> ArgumentParsing } // Env-Filter directives are comma seperated. let filters = opt_match.opt_strs("tracing-filter").join(","); - let tracing_filter = if filters.is_empty() { - None - } else { - Some(filters) + let tracing_filter = (!filters.is_empty()).then_some(filters); + + #[cfg(target_env = "ohos")] + let log_filter = { + let filters = opt_match.opt_strs("log-filter").join(","); + (!filters.is_empty()).then_some(filters) }; let mut debug_options = DebugOptions::default(); @@ -626,6 +643,8 @@ pub(crate) fn parse_command_line_arguments(args: Vec<String>) -> ArgumentParsing userscripts_directory: opt_match .opt_default("userscripts", "resources/user-agent-js") .map(PathBuf::from), + #[cfg(target_env = "ohos")] + log_filter, ..Default::default() }; |