aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAstraea Quinn S <52372765+PartiallyUntyped@users.noreply.github.com>2025-04-15 12:19:13 +0200
committerGitHub <noreply@github.com>2025-04-15 10:19:13 +0000
commit064f82d0a3ccc5f964e0a161d891b53a692d0729 (patch)
tree2c879e13791bf69c72b594d717dc79daf222557c
parent1ea80c4335f7858f0550832e92635e3682ac5b0e (diff)
downloadservo-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.rs75
-rw-r--r--ports/servoshell/egl/ohos/simpleservo.rs2
-rw-r--r--ports/servoshell/prefs.rs27
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()
};