From 2c8bf8544582c0578f261f0ab381fcbec2b1bdd0 Mon Sep 17 00:00:00 2001 From: Peter Van der Beken Date: Sat, 2 Mar 2024 07:50:22 +0000 Subject: [PATCH] Bug 1640839 - Add IPC serializer for WebIDL enums. r=mccr8,jgilbert,media-playback-reviewers,dom-storage-reviewers,janv,padenot Differential Revision: https://phabricator.services.mozilla.com/D201339 --- docshell/base/BrowsingContext.cpp | 23 +++++-------- docshell/shistory/SessionHistoryEntry.cpp | 8 ++--- dom/bindings/BindingIPCUtils.h | 9 +++++ dom/canvas/WebGLIpdl.h | 4 ++- dom/clients/manager/ClientIPCUtils.h | 14 +++----- dom/docs/webIdlBindings/index.md | 7 ++++ dom/fetch/FetchIPCTypes.h | 34 +++++++------------ dom/gamepad/ipc/GamepadMessageUtils.h | 18 ++++------ dom/indexedDB/SerializationHelpers.h | 7 ++-- dom/media/ipc/MFCDMSerializers.h | 16 +++------ dom/media/mediasession/MediaSessionIPCUtils.h | 13 +++---- dom/media/webrtc/WebrtcGlobal.h | 33 ++++++------------ dom/media/webrtc/WebrtcIPCTraits.h | 11 +++--- dom/serviceworkers/ServiceWorkerIPCUtils.h | 13 +++---- dom/webgpu/ipc/WebGPUSerialize.h | 5 ++- dom/workers/WorkerIPCUtils.h | 6 ++-- 16 files changed, 93 insertions(+), 128 deletions(-) diff --git a/docshell/base/BrowsingContext.cpp b/docshell/base/BrowsingContext.cpp index 141036a86c2a..3c0723a27da3 100644 --- a/docshell/base/BrowsingContext.cpp +++ b/docshell/base/BrowsingContext.cpp @@ -20,6 +20,7 @@ #endif #include "mozilla/AppShutdown.h" #include "mozilla/dom/CanonicalBrowsingContext.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/BrowserHost.h" #include "mozilla/dom/BrowserChild.h" #include "mozilla/dom/BrowserParent.h" @@ -96,23 +97,17 @@ namespace IPC { // Allow serialization and deserialization of OrientationType over IPC template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::OrientationType, - mozilla::dom::OrientationType::Portrait_primary, - mozilla::dom::OrientationType::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer { +}; template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::PrefersColorSchemeOverride, - mozilla::dom::PrefersColorSchemeOverride::None, - mozilla::dom::PrefersColorSchemeOverride::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::PrefersColorSchemeOverride> {}; template <> struct ParamTraits @@ -124,10 +119,8 @@ struct ParamTraits // Allow serialization and deserialization of TouchEventsOverride over IPC template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::TouchEventsOverride, - mozilla::dom::TouchEventsOverride::Disabled, - mozilla::dom::TouchEventsOverride::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::TouchEventsOverride> {}; template <> struct ParamTraits { diff --git a/docshell/shistory/SessionHistoryEntry.cpp b/docshell/shistory/SessionHistoryEntry.cpp index 692ab4fe4411..4f5b760c8a1c 100644 --- a/docshell/shistory/SessionHistoryEntry.cpp +++ b/docshell/shistory/SessionHistoryEntry.cpp @@ -20,7 +20,7 @@ #include "nsXULAppAPI.h" #include "mozilla/PresState.h" #include "mozilla/StaticPrefs_fission.h" - +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/BrowserParent.h" #include "mozilla/dom/CanonicalBrowsingContext.h" #include "mozilla/dom/ContentChild.h" @@ -1797,10 +1797,8 @@ namespace IPC { // Allow sending mozilla::dom::WireframeRectType enums over IPC. template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::WireframeRectType, - mozilla::dom::WireframeRectType::Image, - mozilla::dom::WireframeRectType::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::WireframeRectType> {}; template <> struct ParamTraits { diff --git a/dom/bindings/BindingIPCUtils.h b/dom/bindings/BindingIPCUtils.h index 5598e5896b71..5cf6edb7a7fe 100644 --- a/dom/bindings/BindingIPCUtils.h +++ b/dom/bindings/BindingIPCUtils.h @@ -6,9 +6,18 @@ #ifndef _mozilla_dom_BindingIPCUtils_h #define _mozilla_dom_BindingIPCUtils_h +#include "mozilla/EnumTypeTraits.h" #include "mozilla/dom/BindingDeclarations.h" #include "ipc/EnumSerializer.h" +namespace mozilla::dom { + +template +using WebIDLEnumSerializer = IPC::ContiguousEnumSerializerInclusive< + Enum, ContiguousEnumValues::min, ContiguousEnumValues::max>; + +} // namespace mozilla::dom + namespace IPC { template <> struct ParamTraits diff --git a/dom/canvas/WebGLIpdl.h b/dom/canvas/WebGLIpdl.h index 748c1a30a68e..af2777605a03 100644 --- a/dom/canvas/WebGLIpdl.h +++ b/dom/canvas/WebGLIpdl.h @@ -323,7 +323,9 @@ struct ParamTraits final mozilla::dom::PredefinedColorSpace> { using T = mozilla::dom::PredefinedColorSpace; - static bool Validate(const T& val) { return val < T::EndGuard_; } + static bool Validate(const T& val) { + return val <= mozilla::ContiguousEnumValues::max; + } }; template <> diff --git a/dom/clients/manager/ClientIPCUtils.h b/dom/clients/manager/ClientIPCUtils.h index 7f8cf35c1bb2..5718234084dc 100644 --- a/dom/clients/manager/ClientIPCUtils.h +++ b/dom/clients/manager/ClientIPCUtils.h @@ -9,6 +9,7 @@ #include "ipc/EnumSerializer.h" #include "X11UndefineNone.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/ClientBinding.h" #include "mozilla/dom/ClientsBinding.h" #include "mozilla/dom/DocumentBinding.h" @@ -17,21 +18,16 @@ namespace IPC { template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::VisibilityState, mozilla::dom::VisibilityState::Hidden, - mozilla::dom::VisibilityState::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer { +}; template <> struct ParamTraits diff --git a/dom/docs/webIdlBindings/index.md b/dom/docs/webIdlBindings/index.md index c3ce696c5a9a..6fa12a00466c 100644 --- a/dom/docs/webIdlBindings/index.md +++ b/dom/docs/webIdlBindings/index.md @@ -938,6 +938,13 @@ value passed to it as an argument is not one of the string values for the enum then it returns `mozilla::Nothing()`, else it returns the right enum value in the `mozilla::Maybe`. +`mozilla::dom::WebIDLEnumSerializer` is a templated alias in +[`BindingIPCUtils.h`](https://searchfox.org/mozilla-central/source/dom/bindings/BindingIPCUtils.h) +exported to `mozilla/dom/BindingIPCUtils.h` to implement an IPC serializer with +the right validation for WebIDL enums. It uses a +`mozilla::MaxContinuousEnumValue` that is generated for every WebIDL enum to +implement the validation. + #### Callback function types Callback functions are represented as an object, inheriting from diff --git a/dom/fetch/FetchIPCTypes.h b/dom/fetch/FetchIPCTypes.h index 343a5acb3fd9..66d183ec37b3 100644 --- a/dom/fetch/FetchIPCTypes.h +++ b/dom/fetch/FetchIPCTypes.h @@ -9,6 +9,7 @@ #include "ipc/EnumSerializer.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/HeadersBinding.h" #include "mozilla/dom/RequestBinding.h" #include "mozilla/dom/ResponseBinding.h" @@ -17,41 +18,30 @@ namespace IPC { template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::HeadersGuardEnum, mozilla::dom::HeadersGuardEnum::None, - mozilla::dom::HeadersGuardEnum::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::HeadersGuardEnum> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer { + : public mozilla::dom::WebIDLEnumSerializer { }; template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::RequestCredentials, - mozilla::dom::RequestCredentials::Omit, - mozilla::dom::RequestCredentials::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::RequestCredentials> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::RequestRedirect, mozilla::dom::RequestRedirect::Follow, - mozilla::dom::RequestRedirect::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer { +}; template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; + template <> struct ParamTraits : public ContiguousEnumSerializerInclusive< diff --git a/dom/gamepad/ipc/GamepadMessageUtils.h b/dom/gamepad/ipc/GamepadMessageUtils.h index c29293d3a5b0..53b3e5f4c978 100644 --- a/dom/gamepad/ipc/GamepadMessageUtils.h +++ b/dom/gamepad/ipc/GamepadMessageUtils.h @@ -8,6 +8,7 @@ #define mozilla_dom_gamepad_GamepadMessageUtils_h #include "ipc/EnumSerializer.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/GamepadBinding.h" #include "mozilla/dom/GamepadHandle.h" #include "mozilla/dom/GamepadLightIndicatorBinding.h" @@ -18,24 +19,17 @@ namespace IPC { template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::GamepadLightIndicatorType, - mozilla::dom::GamepadLightIndicatorType(0), - mozilla::dom::GamepadLightIndicatorType( - mozilla::dom::GamepadLightIndicatorType::EndGuard_)> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::GamepadLightIndicatorType> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::GamepadMappingType, mozilla::dom::GamepadMappingType(0), - mozilla::dom::GamepadMappingType( - mozilla::dom::GamepadMappingType::EndGuard_)> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::GamepadMappingType> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::GamepadHand, mozilla::dom::GamepadHand(0), - mozilla::dom::GamepadHand(mozilla::dom::GamepadHand::EndGuard_)> {}; + : public mozilla::dom::WebIDLEnumSerializer {}; template <> struct ParamTraits diff --git a/dom/indexedDB/SerializationHelpers.h b/dom/indexedDB/SerializationHelpers.h index 7bc05720d485..488c1eb044b9 100644 --- a/dom/indexedDB/SerializationHelpers.h +++ b/dom/indexedDB/SerializationHelpers.h @@ -10,6 +10,7 @@ #include "ipc/EnumSerializer.h" #include "ipc/IPCMessageUtilsSpecializations.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/indexedDB/Key.h" #include "mozilla/dom/indexedDB/KeyPath.h" #include "mozilla/dom/IDBCursor.h" @@ -61,10 +62,8 @@ struct ParamTraits { template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::IDBCursor::Direction, - mozilla::dom::IDBCursor::Direction::Next, - mozilla::dom::IDBCursor::Direction::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::IDBCursor::Direction> {}; template <> struct ParamTraits diff --git a/dom/media/ipc/MFCDMSerializers.h b/dom/media/ipc/MFCDMSerializers.h index 587f30ae095e..64867f4dbb73 100644 --- a/dom/media/ipc/MFCDMSerializers.h +++ b/dom/media/ipc/MFCDMSerializers.h @@ -5,9 +5,9 @@ #ifndef DOM_MEDIA_IPC_MFCDMSERIALIZERS_H_ #define DOM_MEDIA_IPC_MFCDMSERIALIZERS_H_ -#include "ipc/EnumSerializer.h" #include "MediaData.h" #include "mozilla/KeySystemConfig.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/MediaKeyMessageEventBinding.h" #include "mozilla/dom/MediaKeyStatusMapBinding.h" @@ -35,23 +35,17 @@ struct ParamTraits template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::MediaKeyMessageType, - mozilla::dom::MediaKeyMessageType::License_request, - mozilla::dom::MediaKeyMessageType::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::MediaKeyMessageType> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer { + : public mozilla::dom::WebIDLEnumSerializer { }; template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; } // namespace IPC diff --git a/dom/media/mediasession/MediaSessionIPCUtils.h b/dom/media/mediasession/MediaSessionIPCUtils.h index 1b0eba8996a3..610b123b6cb9 100644 --- a/dom/media/mediasession/MediaSessionIPCUtils.h +++ b/dom/media/mediasession/MediaSessionIPCUtils.h @@ -6,6 +6,7 @@ #define DOM_MEDIA_MEDIASESSION_MEDIASESSIONIPCUTILS_H_ #include "ipc/EnumSerializer.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "MediaMetadata.h" #include "mozilla/dom/MediaSession.h" #include "mozilla/dom/MediaSessionBinding.h" @@ -87,17 +88,13 @@ struct ParamTraits { template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::MediaSessionPlaybackState, - mozilla::dom::MediaSessionPlaybackState::None, - mozilla::dom::MediaSessionPlaybackState::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::MediaSessionPlaybackState> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::MediaSessionAction, - mozilla::dom::MediaSessionAction::Play, - mozilla::dom::MediaSessionAction::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::MediaSessionAction> {}; } // namespace IPC diff --git a/dom/media/webrtc/WebrtcGlobal.h b/dom/media/webrtc/WebrtcGlobal.h index d610ee5d10ff..e9ec2ced516b 100644 --- a/dom/media/webrtc/WebrtcGlobal.h +++ b/dom/media/webrtc/WebrtcGlobal.h @@ -8,6 +8,7 @@ #include "WebrtcIPCTraits.h" #include "ipc/EnumSerializer.h" #include "ipc/IPCMessageUtilsSpecializations.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/BindingDeclarations.h" #include "mozilla/dom/RTCDataChannelBinding.h" #include "mozilla/dom/RTCStatsReportBinding.h" @@ -62,30 +63,22 @@ namespace IPC { template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::RTCStatsIceCandidatePairState, - mozilla::dom::RTCStatsIceCandidatePairState::Frozen, - mozilla::dom::RTCStatsIceCandidatePairState::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::RTCStatsIceCandidatePairState> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::RTCIceCandidateType, - mozilla::dom::RTCIceCandidateType::Host, - mozilla::dom::RTCIceCandidateType::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::RTCIceCandidateType> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::RTCBundlePolicy, - mozilla::dom::RTCBundlePolicy::Balanced, - mozilla::dom::RTCBundlePolicy::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer { +}; DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCIceServerInternal, mUrls, mCredentialProvided, mUserNameProvided); @@ -218,10 +211,8 @@ DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCDataChannelStats, mId, template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::RTCDataChannelState, - mozilla::dom::RTCDataChannelState::Connecting, - mozilla::dom::RTCDataChannelState::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::RTCDataChannelState> {}; DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCCodecStats, mTimestamp, mType, mId, mPayloadType, mCodecType, @@ -230,9 +221,7 @@ DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCCodecStats, mTimestamp, template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; } // namespace IPC #endif // _WEBRTC_GLOBAL_H_ diff --git a/dom/media/webrtc/WebrtcIPCTraits.h b/dom/media/webrtc/WebrtcIPCTraits.h index b076745608c7..5b526da67f9a 100644 --- a/dom/media/webrtc/WebrtcIPCTraits.h +++ b/dom/media/webrtc/WebrtcIPCTraits.h @@ -9,6 +9,7 @@ #include "ipc/IPCMessageUtils.h" #include "ipc/IPCMessageUtilsSpecializations.h" #include "mozilla/dom/BindingDeclarations.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/RTCConfigurationBinding.h" #include "mozilla/media/webrtc/WebrtcGlobal.h" #include "mozilla/dom/CandidateInfo.h" @@ -62,17 +63,15 @@ struct ParamTraits { } }; -template -struct WebidlEnumSerializer - : public ContiguousEnumSerializer {}; - template <> struct ParamTraits - : public WebidlEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::RTCIceCredentialType> {}; template <> struct ParamTraits - : public WebidlEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::RTCIceTransportPolicy> {}; DEFINE_IPC_SERIALIZER_WITH_FIELDS(mozilla::dom::RTCIceServer, mCredential, mCredentialType, mUrl, mUrls, mUsername) diff --git a/dom/serviceworkers/ServiceWorkerIPCUtils.h b/dom/serviceworkers/ServiceWorkerIPCUtils.h index bd867f877ae9..9931af94e7d9 100644 --- a/dom/serviceworkers/ServiceWorkerIPCUtils.h +++ b/dom/serviceworkers/ServiceWorkerIPCUtils.h @@ -11,6 +11,7 @@ // Undo X11/X.h's definition of None #undef None +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/ServiceWorkerBinding.h" #include "mozilla/dom/ServiceWorkerRegistrationBinding.h" @@ -18,17 +19,13 @@ namespace IPC { template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::ServiceWorkerState, - mozilla::dom::ServiceWorkerState::Parsed, - mozilla::dom::ServiceWorkerState::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::ServiceWorkerState> {}; template <> struct ParamTraits - : public ContiguousEnumSerializer< - mozilla::dom::ServiceWorkerUpdateViaCache, - mozilla::dom::ServiceWorkerUpdateViaCache::Imports, - mozilla::dom::ServiceWorkerUpdateViaCache::EndGuard_> {}; + : public mozilla::dom::WebIDLEnumSerializer< + mozilla::dom::ServiceWorkerUpdateViaCache> {}; } // namespace IPC diff --git a/dom/webgpu/ipc/WebGPUSerialize.h b/dom/webgpu/ipc/WebGPUSerialize.h index 8d78d784cb66..03f9ee16760c 100644 --- a/dom/webgpu/ipc/WebGPUSerialize.h +++ b/dom/webgpu/ipc/WebGPUSerialize.h @@ -9,6 +9,7 @@ #include "WebGPUTypes.h" #include "ipc/EnumSerializer.h" #include "ipc/IPCMessageUtils.h" +#include "mozilla/dom/BindingIPCUtils.h" #include "mozilla/dom/WebGPUBinding.h" #include "mozilla/webgpu/ffi/wgpu.h" @@ -20,7 +21,9 @@ namespace IPC { : public ContiguousEnumSerializer {} #define DEFINE_IPC_SERIALIZER_DOM_ENUM(something) \ - DEFINE_IPC_SERIALIZER_ENUM_GUARD(something, something::EndGuard_) + template <> \ + struct ParamTraits \ + : public mozilla::dom::WebIDLEnumSerializer {} #define DEFINE_IPC_SERIALIZER_FFI_ENUM(something) \ DEFINE_IPC_SERIALIZER_ENUM_GUARD(something, something##_Sentinel) diff --git a/dom/workers/WorkerIPCUtils.h b/dom/workers/WorkerIPCUtils.h index 0be45b307f9d..a93fad5b02d3 100644 --- a/dom/workers/WorkerIPCUtils.h +++ b/dom/workers/WorkerIPCUtils.h @@ -6,7 +6,7 @@ #ifndef _mozilla_dom_WorkerIPCUtils_h #define _mozilla_dom_WorkerIPCUtils_h -#include "ipc/EnumSerializer.h" +#include "mozilla/dom/BindingIPCUtils.h" // Undo X11/X.h's definition of None #undef None @@ -17,9 +17,7 @@ namespace IPC { template <> struct ParamTraits - : public ContiguousEnumSerializer {}; + : public mozilla::dom::WebIDLEnumSerializer {}; } // namespace IPC