servoshell: allow event tracing to be configured with RUST_LOG (#31657)

* servoshell: allow event tracing to be configured with RUST_LOG

* Move docs to same file as target prefixes

* Avoid requiring macro callers to use LogTarget trait

* Clean up macro call in app.rs

* Rename macros to reflect value types
This commit is contained in:
Delan Azabani 2024-03-14 17:27:18 +08:00 committed by GitHub
parent f3a73dbed3
commit eaa800c8dd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 239 additions and 19 deletions

View file

@ -140,19 +140,7 @@ impl App {
let ev_waker = events_loop.create_event_loop_waker();
events_loop.run_forever(move |event, w, control_flow| {
let now = Instant::now();
match event {
// Uncomment to filter out logging of common events, which can be very noisy.
// winit::event::Event::DeviceEvent { .. } => {},
// winit::event::Event::WindowEvent {
// event: WindowEvent::CursorMoved { .. },
// ..
// } => {},
// winit::event::Event::MainEventsCleared => {},
// winit::event::Event::RedrawEventsCleared => {},
// winit::event::Event::UserEvent(..) => {},
// winit::event::Event::NewEvents(..) => {},
_ => trace!("@{:?} (+{:?}) {:?}", now - t_start, now - t, event),
}
trace_winit_event!(event, "@{:?} (+{:?}) {event:?}", now - t_start, now - t);
t = now;
match event {
winit::event::Event::NewEvents(winit::event::StartCause::Init) => {

View file

@ -9,6 +9,9 @@
#[macro_use]
extern crate sig;
#[macro_use]
mod tracing;
#[cfg(test)]
mod test;

229
ports/servoshell/tracing.rs Normal file
View file

@ -0,0 +1,229 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
/// Log an event from winit ([winit::event::Event]) at trace level.
/// - To disable tracing: RUST_LOG='servoshell<winit@=off'
/// - To enable tracing: RUST_LOG='servoshell<winit@'
/// - Recommended filters when tracing is enabled:
/// - servoshell<winit@DeviceEvent=off
/// - servoshell<winit@MainEventsCleared=off
/// - servoshell<winit@NewEvents(WaitCancelled)=off
/// - servoshell<winit@RedrawEventsCleared=off
/// - servoshell<winit@RedrawRequested=off
/// - servoshell<winit@UserEvent(WakerEvent)=off
/// - servoshell<winit@WindowEvent(AxisMotion)=off
/// - servoshell<winit@WindowEvent(CursorMoved)=off
macro_rules! trace_winit_event {
// This macro only exists to put the docs in the same file as the target prefix,
// so the macro definition is always the same.
($event:expr, $($rest:tt)+) => {
::log::trace!(target: $crate::tracing::LogTarget::log_target(&$event), $($rest)+)
};
}
/// Log an event from servo ([servo::embedder_traits::EmbedderMsg]) at trace level.
/// - To disable tracing: RUST_LOG='servoshell<servo@=off'
/// - To enable tracing: RUST_LOG='servoshell<servo@'
/// - Recommended filters when tracing is enabled:
/// - servoshell<servo@EventDelivered=off
/// - servoshell<servo@ReadyToPresent=off
macro_rules! trace_embedder_msg {
// This macro only exists to put the docs in the same file as the target prefix,
// so the macro definition is always the same.
($event:expr, $($rest:tt)+) => {
::log::trace!(target: $crate::tracing::LogTarget::log_target(&$event), $($rest)+)
};
}
/// Log an event to servo ([servo::compositing::windowing::EmbedderEvent]) at trace level.
/// - To disable tracing: RUST_LOG='servoshell>servo@=off'
/// - To enable tracing: RUST_LOG='servoshell>servo@'
/// - Recommended filters when tracing is enabled:
/// - servoshell>servo@Idle=off
/// - servoshell>servo@MouseWindowMoveEventClass=off
macro_rules! trace_embedder_event {
// This macro only exists to put the docs in the same file as the target prefix,
// so the macro definition is always the same.
($event:expr, $($rest:tt)+) => {
::log::trace!(target: $crate::tracing::LogTarget::log_target(&$event), $($rest)+)
};
}
/// Get the log target for an event, as a static string.
pub(crate) trait LogTarget {
fn log_target(&self) -> &'static str;
}
mod from_winit {
use super::LogTarget;
use crate::events_loop::WakerEvent;
macro_rules! target {
($($name:literal)+) => {
concat!("servoshell<winit@", $($name),+)
};
}
impl LogTarget for winit::event::Event<'_, WakerEvent> {
fn log_target(&self) -> &'static str {
use winit::event::StartCause;
match self {
Self::NewEvents(start_cause) => match start_cause {
StartCause::ResumeTimeReached { .. } => target!("NewEvents(ResumeTimeReached)"),
StartCause::WaitCancelled { .. } => target!("NewEvents(WaitCancelled)"),
StartCause::Poll => target!("NewEvents(Poll)"),
StartCause::Init => target!("NewEvents(Init)"),
},
Self::WindowEvent { event, .. } => event.log_target(),
Self::DeviceEvent { .. } => target!("DeviceEvent"),
Self::UserEvent(WakerEvent) => target!("UserEvent(WakerEvent)"),
Self::Suspended => target!("Suspended"),
Self::Resumed => target!("Resumed"),
Self::MainEventsCleared => target!("MainEventsCleared"),
Self::RedrawRequested(_) => target!("RedrawRequested"),
Self::RedrawEventsCleared => target!("RedrawEventsCleared"),
Self::LoopDestroyed => target!("LoopDestroyed"),
}
}
}
impl LogTarget for winit::event::WindowEvent<'_> {
fn log_target(&self) -> &'static str {
macro_rules! target_variant {
($name:literal) => {
target!("WindowEvent(" $name ")")
};
}
match self {
Self::Resized(_) => target_variant!("Resized"),
Self::Moved(_) => target_variant!("Moved"),
Self::CloseRequested => target_variant!("CloseRequested"),
Self::Destroyed => target_variant!("Destroyed"),
Self::DroppedFile(_) => target_variant!("DroppedFile"),
Self::HoveredFile(_) => target_variant!("HoveredFile"),
Self::HoveredFileCancelled => target_variant!("HoveredFileCancelled"),
Self::ReceivedCharacter(_) => target_variant!("ReceivedCharacter"),
Self::Focused(_) => target_variant!("Focused"),
Self::KeyboardInput { .. } => target_variant!("KeyboardInput"),
Self::ModifiersChanged(_) => target_variant!("ModifiersChanged"),
Self::Ime(_) => target_variant!("Ime"),
Self::CursorMoved { .. } => target_variant!("CursorMoved"),
Self::CursorEntered { .. } => target_variant!("CursorEntered"),
Self::CursorLeft { .. } => target_variant!("CursorLeft"),
Self::MouseWheel { .. } => target_variant!("MouseWheel"),
Self::MouseInput { .. } => target_variant!("MouseInput"),
Self::TouchpadMagnify { .. } => target_variant!("TouchpadMagnify"),
Self::SmartMagnify { .. } => target_variant!("SmartMagnify"),
Self::TouchpadRotate { .. } => target_variant!("TouchpadRotate"),
Self::TouchpadPressure { .. } => target_variant!("TouchpadPressure"),
Self::AxisMotion { .. } => target_variant!("AxisMotion"),
Self::Touch(_) => target_variant!("Touch"),
Self::ScaleFactorChanged { .. } => target_variant!("ScaleFactorChanged"),
Self::ThemeChanged(_) => target_variant!("ThemeChanged"),
Self::Occluded(_) => target_variant!("Occluded"),
}
}
}
}
mod from_servo {
use super::LogTarget;
macro_rules! target {
($($name:literal)+) => {
concat!("servoshell<servo@", $($name),+)
};
}
impl LogTarget for servo::embedder_traits::EmbedderMsg {
fn log_target(&self) -> &'static str {
match self {
Self::Status(_) => target!("Status"),
Self::ChangePageTitle(_) => target!("ChangePageTitle"),
Self::MoveTo(_) => target!("MoveTo"),
Self::ResizeTo(_) => target!("ResizeTo"),
Self::Prompt(_, _) => target!("Prompt"),
Self::ShowContextMenu(_, _, _) => target!("ShowContextMenu"),
Self::AllowNavigationRequest(_, _) => target!("AllowNavigationRequest"),
Self::AllowOpeningWebView(_) => target!("AllowOpeningWebView"),
Self::WebViewOpened(_) => target!("WebViewOpened"),
Self::WebViewClosed(_) => target!("WebViewClosed"),
Self::WebViewFocused(_) => target!("WebViewFocused"),
Self::WebViewBlurred => target!("WebViewBlurred"),
Self::AllowUnload(_) => target!("AllowUnload"),
Self::Keyboard(_) => target!("Keyboard"),
Self::GetClipboardContents(_) => target!("GetClipboardContents"),
Self::SetClipboardContents(_) => target!("SetClipboardContents"),
Self::SetCursor(_) => target!("SetCursor"),
Self::NewFavicon(_) => target!("NewFavicon"),
Self::HeadParsed => target!("HeadParsed"),
Self::HistoryChanged(_, _) => target!("HistoryChanged"),
Self::SetFullscreenState(_) => target!("SetFullscreenState"),
Self::LoadStart => target!("LoadStart"),
Self::LoadComplete => target!("LoadComplete"),
Self::Panic(_, _) => target!("Panic"),
Self::GetSelectedBluetoothDevice(_, _) => target!("GetSelectedBluetoothDevice"),
Self::SelectFiles(_, _, _) => target!("SelectFiles"),
Self::PromptPermission(_, _) => target!("PromptPermission"),
Self::ShowIME(_, _, _, _) => target!("ShowIME"),
Self::HideIME => target!("HideIME"),
Self::Shutdown => target!("Shutdown"),
Self::ReportProfile(_) => target!("ReportProfile"),
Self::MediaSessionEvent(_) => target!("MediaSessionEvent"),
Self::OnDevtoolsStarted(_, _) => target!("OnDevtoolsStarted"),
Self::ReadyToPresent => target!("ReadyToPresent"),
Self::EventDelivered(_) => target!("EventDelivered"),
}
}
}
}
mod to_servo {
use super::LogTarget;
macro_rules! target {
($($name:literal)+) => {
concat!("servoshell>servo@", $($name),+)
};
}
impl LogTarget for servo::compositing::windowing::EmbedderEvent {
fn log_target(&self) -> &'static str {
match self {
Self::Idle => target!("Idle"),
Self::Refresh => target!("Refresh"),
Self::Resize => target!("Resize"),
Self::AllowNavigationResponse(_, _) => target!("AllowNavigationResponse"),
Self::LoadUrl(_, _) => target!("LoadUrl"),
Self::MouseWindowEventClass(_) => target!("MouseWindowEventClass"),
Self::MouseWindowMoveEventClass(_) => target!("MouseWindowMoveEventClass"),
Self::Touch(_, _, _) => target!("Touch"),
Self::Wheel(_, _) => target!("Wheel"),
Self::Scroll(_, _, _) => target!("Scroll"),
Self::Zoom(_) => target!("Zoom"),
Self::PinchZoom(_) => target!("PinchZoom"),
Self::ResetZoom => target!("ResetZoom"),
Self::Navigation(_, _) => target!("Navigation"),
Self::Quit => target!("Quit"),
Self::ExitFullScreen(_) => target!("ExitFullScreen"),
Self::Keyboard(_) => target!("Keyboard"),
Self::Reload(_) => target!("Reload"),
Self::NewWebView(_, _) => target!("NewWebView"),
Self::CloseWebView(_) => target!("CloseWebView"),
Self::SendError(_, _) => target!("SendError"),
Self::FocusWebView(_) => target!("FocusWebView"),
Self::ToggleWebRenderDebug(_) => target!("ToggleWebRenderDebug"),
Self::CaptureWebRender => target!("CaptureWebRender"),
Self::ClearCache => target!("ClearCache"),
Self::ToggleSamplingProfiler(_, _) => target!("ToggleSamplingProfiler"),
Self::MediaSessionAction(_) => target!("MediaSessionAction"),
Self::WebViewVisibilityChanged(_, _) => target!("WebViewVisibilityChanged"),
Self::IMEDismissed => target!("IMEDismissed"),
Self::InvalidateNativeSurface => target!("InvalidateNativeSurface"),
Self::ReplaceNativeSurface(_, _) => target!("ReplaceNativeSurface"),
Self::Gamepad(_) => target!("Gamepad"),
}
}
}
}

View file

@ -112,7 +112,7 @@ where
pub fn handle_window_events(&mut self, events: Vec<EmbedderEvent>) {
for event in events {
trace!("embedder <- window EmbedderEvent {:?}", event);
trace_embedder_event!(event, "{event:?}");
match event {
EmbedderEvent::Keyboard(key_event) => {
self.handle_key_from_window(key_event);
@ -412,11 +412,11 @@ where
let mut need_present = false;
let mut history_changed = false;
for (webview_id, msg) in events {
trace!(
"embedder <- servo EmbedderMsg ({:?}, {:?})",
webview_id.map(|x| format!("{}", x)),
msg
);
if let Some(webview_id) = webview_id {
trace_embedder_msg!(msg, "{webview_id} {msg:?}");
} else {
trace_embedder_msg!(msg, "{msg:?}");
}
match msg {
EmbedderMsg::Status(_status) => {
// FIXME: surface this status string in the UI somehow