aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2025-03-13 13:00:31 +0100
committerGitHub <noreply@github.com>2025-03-13 12:00:31 +0000
commit294a649a6c96ea0fba05fad59a41dea6c7f1d66d (patch)
tree5b3de846c3e4954ff7e4d3af666d3c82108b09f9 /components
parent959720db0a15d207e31e44ffd58d76e9e31b18c9 (diff)
downloadservo-294a649a6c96ea0fba05fad59a41dea6c7f1d66d.tar.gz
servo-294a649a6c96ea0fba05fad59a41dea6c7f1d66d.zip
Use `strum` to iterate through enum variants and get their names (#35933)
`strum` allows us to avoid manually listing enum variant names and also to get their names as static strings. We cannot use this for all cases due to https://github.com/Peternator7/strum/issues/152, but we can still use it to remove a lot of code. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Diffstat (limited to 'components')
-rw-r--r--components/profile/time.rs53
-rw-r--r--components/script/Cargo.toml2
-rw-r--r--components/script/task_manager.rs3
-rw-r--r--components/script/task_queue.rs4
-rw-r--r--components/script/task_source.rs28
-rw-r--r--components/shared/compositing/Cargo.toml1
-rw-r--r--components/shared/compositing/constellation_msg.rs40
-rw-r--r--components/shared/compositing/lib.rs24
-rw-r--r--components/shared/embedder/Cargo.toml1
-rw-r--r--components/shared/embedder/lib.rs49
-rw-r--r--components/shared/profile/Cargo.toml1
-rw-r--r--components/shared/profile/time.rs5
-rw-r--r--components/shared/script/Cargo.toml1
-rw-r--r--components/shared/script/lib.rs43
-rw-r--r--components/shared/script/script_msg.rs73
15 files changed, 43 insertions, 285 deletions
diff --git a/components/profile/time.rs b/components/profile/time.rs
index 1e7629a48f7..ce6e6eb90b3 100644
--- a/components/profile/time.rs
+++ b/components/profile/time.rs
@@ -85,57 +85,8 @@ impl Formattable for ProfilerCategory {
ProfilerCategory::LayoutTextShaping => "| + ",
_ => "",
};
- let name = match *self {
- ProfilerCategory::Compositing => "Compositing",
- ProfilerCategory::LayoutPerform => "Layout",
- ProfilerCategory::LayoutStyleRecalc => "Style Recalc",
- ProfilerCategory::LayoutTextShaping => "Text Shaping",
- ProfilerCategory::LayoutRestyleDamagePropagation => "Restyle Damage Propagation",
- ProfilerCategory::LayoutGeneratedContent => "Generated Content Resolution",
- ProfilerCategory::LayoutFloatPlacementSpeculation => "Float Placement Speculation",
- ProfilerCategory::LayoutMain => "Primary Layout Pass",
- ProfilerCategory::LayoutStoreOverflow => "Store Overflow",
- ProfilerCategory::LayoutParallelWarmup => "Parallel Warmup",
- ProfilerCategory::LayoutDispListBuild => "Display List Construction",
- ProfilerCategory::ImageSaving => "Image Saving",
- ProfilerCategory::ScriptAttachLayout => "Script Attach Layout",
- ProfilerCategory::ScriptConstellationMsg => "Script Constellation Msg",
- ProfilerCategory::ScriptDevtoolsMsg => "Script Devtools Msg",
- ProfilerCategory::ScriptDocumentEvent => "Script Document Event",
- ProfilerCategory::ScriptEvaluate => "Script JS Evaluate",
- ProfilerCategory::ScriptFileRead => "Script File Read",
- ProfilerCategory::ScriptFontLoading => "Script Font Loading",
- ProfilerCategory::ScriptHistoryEvent => "Script History Event",
- ProfilerCategory::ScriptImageCacheMsg => "Script Image Cache Msg",
- ProfilerCategory::ScriptInputEvent => "Script Input Event",
- ProfilerCategory::ScriptNetworkEvent => "Script Network Event",
- ProfilerCategory::ScriptParseHTML => "Script Parse HTML",
- ProfilerCategory::ScriptParseXML => "Script Parse XML",
- ProfilerCategory::ScriptPlannedNavigation => "Script Planned Navigation",
- ProfilerCategory::ScriptPortMessage => "Script Port Message",
- ProfilerCategory::ScriptRendering => "Script Rendering",
- ProfilerCategory::ScriptResize => "Script Resize",
- ProfilerCategory::ScriptEvent => "Script Event",
- ProfilerCategory::ScriptUpdateReplacedElement => "Script Update Replaced Element",
- ProfilerCategory::ScriptSetScrollState => "Script Set Scroll State",
- ProfilerCategory::ScriptSetViewport => "Script Set Viewport",
- ProfilerCategory::ScriptTimerEvent => "Script Timer Event",
- ProfilerCategory::ScriptStylesheetLoad => "Script Stylesheet Load",
- ProfilerCategory::ScriptWebSocketEvent => "Script Web Socket Event",
- ProfilerCategory::ScriptWorkerEvent => "Script Worker Event",
- ProfilerCategory::ScriptServiceWorkerEvent => "Script Service Worker Event",
- ProfilerCategory::ScriptEnterFullscreen => "Script Enter Fullscreen",
- ProfilerCategory::ScriptExitFullscreen => "Script Exit Fullscreen",
- ProfilerCategory::ScriptWorkletEvent => "Script Worklet Event",
- ProfilerCategory::ScriptPerformanceEvent => "Script Performance Event",
- ProfilerCategory::ScriptWebGPUMsg => "Script WebGPU Message",
- ProfilerCategory::TimeToFirstPaint => "Time To First Paint",
- ProfilerCategory::TimeToFirstContentfulPaint => "Time To First Contentful Paint",
- ProfilerCategory::TimeToInteractive => "Time to Interactive",
- ProfilerCategory::IpcReceiver => "Blocked at IPC Receive",
- ProfilerCategory::IpcBytesReceiver => "Blocked at IPC Bytes Receive",
- };
- format!("{}{}", padding, name)
+ let name: &'static str = self.into();
+ format!("{padding}{name}")
}
}
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml
index b061afbe86e..2b399e38fb7 100644
--- a/components/script/Cargo.toml
+++ b/components/script/Cargo.toml
@@ -113,6 +113,8 @@ servo_url = { path = "../url" }
smallvec = { workspace = true, features = ["union"] }
style_malloc_size_of = { workspace = true }
glow = { workspace = true }
+strum = { workspace = true }
+strum_macros = { workspace = true }
style = { workspace = true }
stylo_dom = { workspace = true }
style_traits = { workspace = true }
diff --git a/components/script/task_manager.rs b/components/script/task_manager.rs
index 4854ef7cd56..75a9bb8330e 100644
--- a/components/script/task_manager.rs
+++ b/components/script/task_manager.rs
@@ -8,6 +8,7 @@ use std::cell::Ref;
use std::collections::HashMap;
use base::id::PipelineId;
+use strum::VariantArray;
use crate::messaging::ScriptEventLoopSender;
use crate::task::TaskCanceller;
@@ -36,7 +37,7 @@ impl TaskCancellers {
Self::OnePerTaskSource(..) => {
// We must create the canceller if they aren't created because we want future
// tasks to be ignored completely.
- for task_source_name in TaskSourceName::all() {
+ for task_source_name in TaskSourceName::VARIANTS.iter() {
self.get(*task_source_name)
.cancelled
.store(true, Ordering::SeqCst)
diff --git a/components/script/task_queue.rs b/components/script/task_queue.rs
index 5dd6a2f3b01..aad78c5dc1c 100644
--- a/components/script/task_queue.rs
+++ b/components/script/task_queue.rs
@@ -10,6 +10,7 @@ use std::default::Default;
use base::id::PipelineId;
use crossbeam_channel::{self, Receiver, Sender};
+use strum::VariantArray;
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::worker::TrustedWorkerAddress;
@@ -211,8 +212,7 @@ impl<T: QueuedTaskConversion> TaskQueue<T> {
self.process_incoming_tasks(first_msg, &fully_active);
let mut throttled = self.throttled.borrow_mut();
let mut throttled_length: usize = throttled.values().map(|queue| queue.len()).sum();
- let task_source_names = TaskSourceName::all();
- let mut task_source_cycler = task_source_names.iter().cycle();
+ let mut task_source_cycler = TaskSourceName::VARIANTS.iter().cycle();
// "being busy", is defined as having more than x tasks for this loop's iteration.
// As long as we're not busy, and there are throttled tasks left:
loop {
diff --git a/components/script/task_source.rs b/components/script/task_source.rs
index cd36e176181..4f18292693e 100644
--- a/components/script/task_source.rs
+++ b/components/script/task_source.rs
@@ -6,6 +6,7 @@ use std::fmt;
use base::id::PipelineId;
use malloc_size_of_derive::MallocSizeOf;
+use strum_macros::VariantArray;
use stylo_atoms::Atom;
use crate::dom::bindings::refcounted::Trusted;
@@ -19,10 +20,7 @@ use crate::task_manager::TaskManager;
/// The names of all task sources, used to differentiate TaskCancellers. Note: When adding a task
/// source, update this enum. Note: The HistoryTraversalTaskSource is not part of this, because it
/// doesn't implement TaskSource.
-///
-/// Note: When adding or removing a [`TaskSourceName`], be sure to also update the return value of
-/// [`TaskSourceName::all`].
-#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, MallocSizeOf, PartialEq)]
+#[derive(Clone, Copy, Debug, Eq, Hash, JSTraceable, MallocSizeOf, PartialEq, VariantArray)]
pub(crate) enum TaskSourceName {
Canvas,
DOMManipulation,
@@ -68,28 +66,6 @@ impl From<TaskSourceName> for ScriptThreadEventCategory {
}
}
-impl TaskSourceName {
- pub(crate) fn all() -> &'static [TaskSourceName] {
- &[
- TaskSourceName::Canvas,
- TaskSourceName::DOMManipulation,
- TaskSourceName::FileReading,
- TaskSourceName::FontLoading,
- TaskSourceName::HistoryTraversal,
- TaskSourceName::Networking,
- TaskSourceName::PerformanceTimeline,
- TaskSourceName::PortMessage,
- TaskSourceName::UserInteraction,
- TaskSourceName::RemoteEvent,
- TaskSourceName::Rendering,
- TaskSourceName::MediaElement,
- TaskSourceName::WebSocket,
- TaskSourceName::Timer,
- TaskSourceName::Gamepad,
- ]
- }
-}
-
pub(crate) struct TaskSource<'task_manager> {
pub(crate) task_manager: &'task_manager TaskManager,
pub(crate) name: TaskSourceName,
diff --git a/components/shared/compositing/Cargo.toml b/components/shared/compositing/Cargo.toml
index 60fe7f05941..ff4ccb7d723 100644
--- a/components/shared/compositing/Cargo.toml
+++ b/components/shared/compositing/Cargo.toml
@@ -22,6 +22,7 @@ log = { workspace = true }
pixels = { path = '../../pixels' }
script_traits = { workspace = true }
servo_url = { path = "../../url" }
+strum_macros = { workspace = true }
style_traits = { workspace = true }
webrender_api = { workspace = true }
webrender_traits = { workspace = true }
diff --git a/components/shared/compositing/constellation_msg.rs b/components/shared/compositing/constellation_msg.rs
index 9bb93741eb9..b31fdea667f 100644
--- a/components/shared/compositing/constellation_msg.rs
+++ b/components/shared/compositing/constellation_msg.rs
@@ -14,9 +14,11 @@ use embedder_traits::{
use ipc_channel::ipc::IpcSender;
use script_traits::{AnimationTickType, LogEntry, WindowSizeData, WindowSizeType};
use servo_url::ServoUrl;
+use strum_macros::IntoStaticStr;
use webrender_traits::CompositorHitTestResult;
/// Messages to the constellation.
+#[derive(IntoStaticStr)]
pub enum ConstellationMsg {
/// Exit the constellation.
Exit,
@@ -77,41 +79,7 @@ pub enum ConstellationMsg {
impl fmt::Debug for ConstellationMsg {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- write!(formatter, "ConstellationMsg::{}", self.variant_name())
- }
-}
-
-impl ConstellationMsg {
- /// Return the variant name, for error logging that happens after the message is consumed.
- pub fn variant_name(&self) -> &'static str {
- use self::ConstellationMsg::*;
- match *self {
- Exit => "Exit",
- GetBrowsingContext(..) => "GetBrowsingContext",
- GetPipeline(..) => "GetPipeline",
- GetFocusTopLevelBrowsingContext(..) => "GetFocusTopLevelBrowsingContext",
- IsReadyToSaveImage(..) => "IsReadyToSaveImage",
- AllowNavigationResponse(..) => "AllowNavigationResponse",
- LoadUrl(..) => "LoadUrl",
- TraverseHistory(..) => "TraverseHistory",
- WindowSize(..) => "WindowSize",
- ThemeChange(..) => "ThemeChange",
- TickAnimation(..) => "TickAnimation",
- WebDriverCommand(..) => "WebDriverCommand",
- Reload(..) => "Reload",
- LogEntry(..) => "LogEntry",
- NewWebView(..) => "NewWebView",
- CloseWebView(..) => "CloseWebView",
- FocusWebView(..) => "FocusWebView",
- BlurWebView => "BlurWebView",
- SendError(..) => "SendError",
- ForwardInputEvent(..) => "ForwardEvent",
- SetCursor(..) => "SetCursor",
- ToggleProfiler(..) => "EnableProfiler",
- ExitFullScreen(..) => "ExitFullScreen",
- MediaSessionAction(..) => "MediaSessionAction",
- SetWebViewThrottled(..) => "SetWebViewThrottled",
- ClearCache => "ClearCache",
- }
+ let variant_string: &'static str = self.into();
+ write!(formatter, "ConstellationMsg::{variant_string}")
}
}
diff --git a/components/shared/compositing/lib.rs b/components/shared/compositing/lib.rs
index 0cf6d4496c4..71c2ef7a257 100644
--- a/components/shared/compositing/lib.rs
+++ b/components/shared/compositing/lib.rs
@@ -18,6 +18,7 @@ use ipc_channel::ipc::IpcSender;
use log::warn;
use pixels::Image;
use script_traits::{AnimationState, ScriptThreadMessage, TouchEventResult};
+use strum_macros::IntoStaticStr;
use style_traits::CSSPixel;
use webrender_api::DocumentId;
use webrender_traits::{CrossProcessCompositorApi, CrossProcessCompositorMessage};
@@ -57,6 +58,7 @@ impl CompositorReceiver {
}
/// Messages from (or via) the constellation thread to the compositor.
+#[derive(IntoStaticStr)]
pub enum CompositorMsg {
/// Alerts the compositor that the given pipeline has changed whether it is running animations.
ChangeRunningAnimationsState(WebViewId, PipelineId, AnimationState),
@@ -112,24 +114,8 @@ pub struct CompositionPipeline {
}
impl Debug for CompositorMsg {
- fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
- match *self {
- CompositorMsg::ChangeRunningAnimationsState(_, _, state) => {
- write!(f, "ChangeRunningAnimationsState({:?})", state)
- },
- CompositorMsg::CreateOrUpdateWebView(..) => write!(f, "CreateOrUpdateWebView"),
- CompositorMsg::RemoveWebView(..) => write!(f, "RemoveWebView"),
- CompositorMsg::TouchEventProcessed(..) => write!(f, "TouchEventProcessed"),
- CompositorMsg::CreatePng(..) => write!(f, "CreatePng"),
- CompositorMsg::IsReadyToSaveImageReply(..) => write!(f, "IsReadyToSaveImageReply"),
- CompositorMsg::SetThrottled(..) => write!(f, "SetThrottled"),
- CompositorMsg::PipelineExited(..) => write!(f, "PipelineExited"),
- CompositorMsg::NewWebRenderFrameReady(..) => write!(f, "NewWebRenderFrameReady"),
- CompositorMsg::PendingPaintMetric(..) => write!(f, "PendingPaintMetric"),
- CompositorMsg::LoadComplete(..) => write!(f, "LoadComplete"),
- CompositorMsg::WebDriverMouseButtonEvent(..) => write!(f, "WebDriverMouseButtonEvent"),
- CompositorMsg::WebDriverMouseMoveEvent(..) => write!(f, "WebDriverMouseMoveEvent"),
- CompositorMsg::CrossProcess(..) => write!(f, "CrossProcess"),
- }
+ fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> {
+ let string: &'static str = self.into();
+ write!(formatter, "{string}")
}
}
diff --git a/components/shared/embedder/Cargo.toml b/components/shared/embedder/Cargo.toml
index e950e9ff99a..1735a4afe3f 100644
--- a/components/shared/embedder/Cargo.toml
+++ b/components/shared/embedder/Cargo.toml
@@ -32,6 +32,7 @@ num-traits = { workspace = true }
pixels = { path = "../../pixels" }
serde = { workspace = true }
servo_url = { path = "../../url" }
+strum_macros = { workspace = true }
style_traits = { workspace = true }
url = { workspace = true }
webdriver = { workspace = true }
diff --git a/components/shared/embedder/lib.rs b/components/shared/embedder/lib.rs
index a40942500e7..c1c45c52417 100644
--- a/components/shared/embedder/lib.rs
+++ b/components/shared/embedder/lib.rs
@@ -19,6 +19,7 @@ use malloc_size_of_derive::MallocSizeOf;
use num_derive::FromPrimitive;
use serde::{Deserialize, Serialize};
use servo_url::ServoUrl;
+use strum_macros::IntoStaticStr;
use url::Url;
use webrender_api::units::{DeviceIntPoint, DeviceIntRect, DeviceIntSize};
@@ -213,7 +214,7 @@ pub enum AllowOrDeny {
Deny,
}
-#[derive(Deserialize, Serialize)]
+#[derive(Deserialize, IntoStaticStr, Serialize)]
pub enum EmbedderMsg {
/// A status message to be displayed by the browser chrome.
Status(WebViewId, Option<String>),
@@ -322,49 +323,9 @@ pub enum EmbedderMsg {
}
impl Debug for EmbedderMsg {
- fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
- match *self {
- EmbedderMsg::Status(..) => write!(f, "Status"),
- EmbedderMsg::ChangePageTitle(..) => write!(f, "ChangePageTitle"),
- EmbedderMsg::MoveTo(..) => write!(f, "MoveTo"),
- EmbedderMsg::ResizeTo(..) => write!(f, "ResizeTo"),
- EmbedderMsg::ShowSimpleDialog(..) => write!(f, "ShowSimpleDialog"),
- EmbedderMsg::RequestAuthentication(..) => write!(f, "RequestAuthentication"),
- EmbedderMsg::AllowUnload(..) => write!(f, "AllowUnload"),
- EmbedderMsg::AllowNavigationRequest(..) => write!(f, "AllowNavigationRequest"),
- EmbedderMsg::Keyboard(..) => write!(f, "Keyboard"),
- EmbedderMsg::ClearClipboard(..) => write!(f, "ClearClipboard"),
- EmbedderMsg::GetClipboardText(..) => write!(f, "GetClipboardText"),
- EmbedderMsg::SetClipboardText(..) => write!(f, "SetClipboardText"),
- EmbedderMsg::SetCursor(..) => write!(f, "SetCursor"),
- EmbedderMsg::NewFavicon(..) => write!(f, "NewFavicon"),
- EmbedderMsg::HistoryChanged(..) => write!(f, "HistoryChanged"),
- EmbedderMsg::NotifyFullscreenStateChanged(..) => {
- write!(f, "NotifyFullscreenStateChanged")
- },
- EmbedderMsg::NotifyLoadStatusChanged(_, status) => {
- write!(f, "NotifyLoadStatusChanged({status:?})")
- },
- EmbedderMsg::WebResourceRequested(..) => write!(f, "WebResourceRequested"),
- EmbedderMsg::Panic(..) => write!(f, "Panic"),
- EmbedderMsg::GetSelectedBluetoothDevice(..) => write!(f, "GetSelectedBluetoothDevice"),
- EmbedderMsg::SelectFiles(..) => write!(f, "SelectFiles"),
- EmbedderMsg::PromptPermission(..) => write!(f, "PromptPermission"),
- EmbedderMsg::ShowIME(..) => write!(f, "ShowIME"),
- EmbedderMsg::HideIME(..) => write!(f, "HideIME"),
- EmbedderMsg::AllowOpeningWebView(..) => write!(f, "AllowOpeningWebView"),
- EmbedderMsg::WebViewClosed(..) => write!(f, "WebViewClosed"),
- EmbedderMsg::WebViewFocused(..) => write!(f, "WebViewFocused"),
- EmbedderMsg::WebViewBlurred => write!(f, "WebViewBlurred"),
- EmbedderMsg::ReportProfile(..) => write!(f, "ReportProfile"),
- EmbedderMsg::MediaSessionEvent(..) => write!(f, "MediaSessionEvent"),
- EmbedderMsg::OnDevtoolsStarted(..) => write!(f, "OnDevtoolsStarted"),
- EmbedderMsg::RequestDevtoolsConnection(..) => write!(f, "RequestDevtoolsConnection"),
- EmbedderMsg::ShowContextMenu(..) => write!(f, "ShowContextMenu"),
- EmbedderMsg::PlayGamepadHapticEffect(..) => write!(f, "PlayGamepadHapticEffect"),
- EmbedderMsg::StopGamepadHapticEffect(..) => write!(f, "StopGamepadHapticEffect"),
- EmbedderMsg::ShutdownComplete => write!(f, "ShutdownComplete"),
- }
+ fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> {
+ let string: &'static str = self.into();
+ write!(formatter, "{string}")
}
}
diff --git a/components/shared/profile/Cargo.toml b/components/shared/profile/Cargo.toml
index 8f3c4beae5a..ca5213ee451 100644
--- a/components/shared/profile/Cargo.toml
+++ b/components/shared/profile/Cargo.toml
@@ -22,5 +22,6 @@ log = { workspace = true }
serde = { workspace = true }
servo_config = { path = "../../config" }
signpost = { git = "https://github.com/pcwalton/signpost.git" }
+strum_macros = { workspace = true }
time = { workspace = true }
tracing = { workspace = true, optional = true }
diff --git a/components/shared/profile/time.rs b/components/shared/profile/time.rs
index 78c380b70dc..0531b68e09e 100644
--- a/components/shared/profile/time.rs
+++ b/components/shared/profile/time.rs
@@ -7,6 +7,7 @@ use ipc_channel::ipc::IpcSender;
use log::warn;
use serde::{Deserialize, Serialize};
use servo_config::opts;
+use strum_macros::IntoStaticStr;
use time::Duration;
#[derive(Clone, Debug, Deserialize, Eq, Ord, PartialEq, PartialOrd, Serialize)]
@@ -57,7 +58,9 @@ pub enum ProfilerMsg {
/// Usage sites of variants marked “Rust tracing only” are not visible to rust-analyzer.
#[repr(u32)]
-#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
+#[derive(
+ Clone, Copy, Debug, Deserialize, Eq, Hash, IntoStaticStr, Ord, PartialEq, PartialOrd, Serialize,
+)]
pub enum ProfilerCategory {
/// The compositor is rasterising or presenting.
///
diff --git a/components/shared/script/Cargo.toml b/components/shared/script/Cargo.toml
index 34c5e9a6582..3efe597d43f 100644
--- a/components/shared/script/Cargo.toml
+++ b/components/shared/script/Cargo.toml
@@ -39,6 +39,7 @@ net_traits = { workspace = true }
pixels = { path = "../../pixels" }
profile_traits = { workspace = true }
serde = { workspace = true }
+strum_macros = { workspace = true }
stylo_atoms = { workspace = true }
servo_url = { path = "../../url" }
style_traits = { workspace = true }
diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs
index 31ced8764b5..5e0fe996e7a 100644
--- a/components/shared/script/lib.rs
+++ b/components/shared/script/lib.rs
@@ -50,6 +50,7 @@ use pixels::PixelFormat;
use profile_traits::{mem, time as profile_time};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use servo_url::{ImmutableOrigin, ServoUrl};
+use strum_macros::IntoStaticStr;
use style_traits::{CSSPixel, SpeculativePainter};
use stylo_atoms::Atom;
#[cfg(feature = "webgpu")]
@@ -288,7 +289,7 @@ pub enum UpdatePipelineIdReason {
/// Messages sent to the `ScriptThread` event loop from the `Constellation`, `Compositor`, and (for
/// now) `Layout`.
-#[derive(Deserialize, Serialize)]
+#[derive(Deserialize, IntoStaticStr, Serialize)]
pub enum ScriptThreadMessage {
/// Takes the associated window proxy out of "delaying-load-events-mode",
/// used if a scheduled navigated was refused by the embedder.
@@ -408,44 +409,8 @@ pub enum ScriptThreadMessage {
impl fmt::Debug for ScriptThreadMessage {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- use self::ScriptThreadMessage::*;
- let variant = match *self {
- StopDelayingLoadEventsMode(..) => "StopDelayingLoadsEventMode",
- AttachLayout(..) => "AttachLayout",
- Resize(..) => "Resize",
- ThemeChange(..) => "ThemeChange",
- ResizeInactive(..) => "ResizeInactive",
- UnloadDocument(..) => "UnloadDocument",
- ExitPipeline(..) => "ExitPipeline",
- ExitScriptThread => "ExitScriptThread",
- SendInputEvent(..) => "SendInputEvent",
- Viewport(..) => "Viewport",
- GetTitle(..) => "GetTitle",
- SetDocumentActivity(..) => "SetDocumentActivity",
- SetThrottled(..) => "SetThrottled",
- SetThrottledInContainingIframe(..) => "SetThrottledInContainingIframe",
- NavigateIframe(..) => "NavigateIframe",
- PostMessage { .. } => "PostMessage",
- UpdatePipelineId(..) => "UpdatePipelineId",
- UpdateHistoryState(..) => "UpdateHistoryState",
- RemoveHistoryStates(..) => "RemoveHistoryStates",
- FocusIFrame(..) => "FocusIFrame",
- WebDriverScriptCommand(..) => "WebDriverScriptCommand",
- TickAllAnimations(..) => "TickAllAnimations",
- WebFontLoaded(..) => "WebFontLoaded",
- DispatchIFrameLoadEvent { .. } => "DispatchIFrameLoadEvent",
- DispatchStorageEvent(..) => "DispatchStorageEvent",
- ReportCSSError(..) => "ReportCSSError",
- Reload(..) => "Reload",
- PaintMetric(..) => "PaintMetric",
- ExitFullScreen(..) => "ExitFullScreen",
- MediaSessionAction(..) => "MediaSessionAction",
- #[cfg(feature = "webgpu")]
- SetWebGPUPort(..) => "SetWebGPUPort",
- SetScrollStates(..) => "SetScrollStates",
- SetEpochPaintTime(..) => "SetEpochPaintTime",
- };
- write!(formatter, "ConstellationControlMsg::{}", variant)
+ let variant_string: &'static str = self.into();
+ write!(formatter, "ConstellationControlMsg::{variant_string}")
}
}
diff --git a/components/shared/script/script_msg.rs b/components/shared/script/script_msg.rs
index 7af7272c715..c63233cbc3f 100644
--- a/components/shared/script/script_msg.rs
+++ b/components/shared/script/script_msg.rs
@@ -22,6 +22,7 @@ use net_traits::CoreResourceMsg;
use net_traits::storage_thread::StorageType;
use serde::{Deserialize, Serialize};
use servo_url::{ImmutableOrigin, ServoUrl};
+use strum_macros::IntoStaticStr;
use style_traits::CSSPixel;
#[cfg(feature = "webgpu")]
use webgpu::{WebGPU, WebGPUResponse, wgc};
@@ -46,7 +47,7 @@ pub struct IFrameSizeMsg {
}
/// Messages from the layout to the constellation.
-#[derive(Deserialize, Serialize)]
+#[derive(Deserialize, IntoStaticStr, Serialize)]
pub enum LayoutMsg {
/// Requests that the constellation inform the compositor that it needs to record
/// the time when the frame with the given ID (epoch) is painted.
@@ -55,11 +56,8 @@ pub enum LayoutMsg {
impl fmt::Debug for LayoutMsg {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- use self::LayoutMsg::*;
- let variant = match *self {
- PendingPaintMetric(..) => "PendingPaintMetric",
- };
- write!(formatter, "LayoutMsg::{}", variant)
+ let variant_string: &'static str = self.into();
+ write!(formatter, "LayoutMsg::{variant_string}")
}
}
@@ -86,7 +84,7 @@ pub enum LogEntry {
}
/// Messages from the script to the constellation.
-#[derive(Deserialize, Serialize)]
+#[derive(Deserialize, IntoStaticStr, Serialize)]
pub enum ScriptMsg {
/// Request to complete the transfer of a set of ports to a router.
CompleteMessagePortTransfer(MessagePortRouterId, Vec<MessagePortId>),
@@ -252,65 +250,8 @@ pub enum ScriptMsg {
impl fmt::Debug for ScriptMsg {
fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
- use self::ScriptMsg::*;
- let variant = match *self {
- CompleteMessagePortTransfer(..) => "CompleteMessagePortTransfer",
- MessagePortTransferResult(..) => "MessagePortTransferResult",
- NewMessagePortRouter(..) => "NewMessagePortRouter",
- RemoveMessagePortRouter(..) => "RemoveMessagePortRouter",
- NewMessagePort(..) => "NewMessagePort",
- RerouteMessagePort(..) => "RerouteMessagePort",
- RemoveMessagePort(..) => "RemoveMessagePort",
- MessagePortShipped(..) => "MessagePortShipped",
- EntanglePorts(..) => "EntanglePorts",
- NewBroadcastChannelRouter(..) => "NewBroadcastChannelRouter",
- RemoveBroadcastChannelRouter(..) => "RemoveBroadcastChannelRouter",
- RemoveBroadcastChannelNameInRouter(..) => "RemoveBroadcastChannelNameInRouter",
- NewBroadcastChannelNameInRouter(..) => "NewBroadcastChannelNameInRouter",
- ScheduleBroadcast(..) => "ScheduleBroadcast",
- ForwardToEmbedder(..) => "ForwardToEmbedder",
- BroadcastStorageEvent(..) => "BroadcastStorageEvent",
- ChangeRunningAnimationsState(..) => "ChangeRunningAnimationsState",
- CreateCanvasPaintThread(..) => "CreateCanvasPaintThread",
- Focus => "Focus",
- GetBrowsingContextInfo(..) => "GetBrowsingContextInfo",
- GetTopForBrowsingContext(..) => "GetParentBrowsingContext",
- GetChildBrowsingContextId(..) => "GetChildBrowsingContextId",
- LoadComplete => "LoadComplete",
- LoadUrl(..) => "LoadUrl",
- AbortLoadUrl => "AbortLoadUrl",
- PostMessage { .. } => "PostMessage",
- NavigatedToFragment(..) => "NavigatedToFragment",
- TraverseHistory(..) => "TraverseHistory",
- PushHistoryState(..) => "PushHistoryState",
- ReplaceHistoryState(..) => "ReplaceHistoryState",
- JointSessionHistoryLength(..) => "JointSessionHistoryLength",
- RemoveIFrame(..) => "RemoveIFrame",
- SetThrottledComplete(..) => "SetThrottledComplete",
- ScriptLoadedURLInIFrame(..) => "ScriptLoadedURLInIFrame",
- ScriptNewIFrame(..) => "ScriptNewIFrame",
- CreateAuxiliaryWebView(..) => "ScriptNewAuxiliary",
- ActivateDocument => "ActivateDocument",
- SetDocumentState(..) => "SetDocumentState",
- SetLayoutEpoch(..) => "SetLayoutEpoch",
- SetFinalUrl(..) => "SetFinalUrl",
- TouchEventProcessed(..) => "TouchEventProcessed",
- LogEntry(..) => "LogEntry",
- DiscardDocument => "DiscardDocument",
- DiscardTopLevelBrowsingContext => "DiscardTopLevelBrowsingContext",
- PipelineExited => "PipelineExited",
- ForwardDOMMessage(..) => "ForwardDOMMessage",
- ScheduleJob(..) => "ScheduleJob",
- MediaSessionEvent(..) => "MediaSessionEvent",
- #[cfg(feature = "webgpu")]
- RequestAdapter(..) => "RequestAdapter",
- #[cfg(feature = "webgpu")]
- GetWebGPUChan(..) => "GetWebGPUChan",
- TitleChanged(..) => "TitleChanged",
- IFrameSizes(..) => "IFramSizes",
- ReportMemory(..) => "ReportMemory",
- };
- write!(formatter, "ScriptMsg::{}", variant)
+ let variant_string: &'static str = self.into();
+ write!(formatter, "ScriptMsg::{variant_string}")
}
}