1pub mod embedder_controls;
12pub mod input_events;
13pub mod resources;
14pub mod user_contents;
15pub mod webdriver;
16
17use std::collections::HashMap;
18use std::ffi::c_void;
19use std::fmt::{Debug, Display, Error, Formatter};
20use std::hash::Hash;
21use std::ops::Range;
22use std::path::PathBuf;
23use std::sync::Arc;
24
25use base::generic_channel::{GenericCallback, GenericSender, GenericSharedMemory, SendResult};
26use base::id::{PipelineId, WebViewId};
27use crossbeam_channel::Sender;
28use euclid::{Box2D, Point2D, Scale, Size2D, Vector2D};
29use http::{HeaderMap, Method, StatusCode};
30use log::warn;
31use malloc_size_of::malloc_size_of_is_0;
32use malloc_size_of_derive::MallocSizeOf;
33use pixels::SharedRasterImage;
34use serde::{Deserialize, Deserializer, Serialize, Serializer};
35use servo_geometry::{DeviceIndependentIntRect, DeviceIndependentIntSize};
36use servo_url::ServoUrl;
37use strum::{EnumMessage, IntoStaticStr};
38use style::queries::values::PrefersColorScheme;
39use style_traits::CSSPixel;
40use url::Url;
41use uuid::Uuid;
42use webrender_api::ExternalScrollId;
43use webrender_api::units::{
44 DeviceIntPoint, DeviceIntRect, DeviceIntSize, DevicePixel, DevicePoint, DeviceRect,
45 DeviceVector2D, LayoutPoint, LayoutRect, LayoutSize, LayoutVector2D,
46};
47
48pub use crate::embedder_controls::*;
49pub use crate::input_events::*;
50use crate::user_contents::UserContentManagerId;
51pub use crate::webdriver::*;
52
53#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
57pub enum WebViewPoint {
58 Device(DevicePoint),
59 Page(Point2D<f32, CSSPixel>),
60}
61
62impl WebViewPoint {
63 pub fn as_device_point(&self, scale: Scale<f32, CSSPixel, DevicePixel>) -> DevicePoint {
64 match self {
65 Self::Device(point) => *point,
66 Self::Page(point) => *point * scale,
67 }
68 }
69}
70
71impl From<DevicePoint> for WebViewPoint {
72 fn from(point: DevicePoint) -> Self {
73 Self::Device(point)
74 }
75}
76
77impl From<LayoutPoint> for WebViewPoint {
78 fn from(point: LayoutPoint) -> Self {
79 Self::Page(Point2D::new(point.x, point.y))
80 }
81}
82
83impl From<Point2D<f32, CSSPixel>> for WebViewPoint {
84 fn from(point: Point2D<f32, CSSPixel>) -> Self {
85 Self::Page(point)
86 }
87}
88
89#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
93pub enum WebViewRect {
94 Device(DeviceRect),
95 Page(Box2D<f32, CSSPixel>),
96}
97
98impl WebViewRect {
99 pub fn as_device_rect(&self, scale: Scale<f32, CSSPixel, DevicePixel>) -> DeviceRect {
100 match self {
101 Self::Device(rect) => *rect,
102 Self::Page(rect) => *rect * scale,
103 }
104 }
105}
106
107impl From<DeviceRect> for WebViewRect {
108 fn from(rect: DeviceRect) -> Self {
109 Self::Device(rect)
110 }
111}
112
113impl From<LayoutRect> for WebViewRect {
114 fn from(rect: LayoutRect) -> Self {
115 Self::Page(Box2D::new(
116 Point2D::new(rect.min.x, rect.min.y),
117 Point2D::new(rect.max.x, rect.max.y),
118 ))
119 }
120}
121
122impl From<Box2D<f32, CSSPixel>> for WebViewRect {
123 fn from(rect: Box2D<f32, CSSPixel>) -> Self {
124 Self::Page(rect)
125 }
126}
127
128#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
129pub enum WebViewVector {
130 Device(DeviceVector2D),
131 Page(Vector2D<f32, CSSPixel>),
132}
133
134impl WebViewVector {
135 pub fn as_device_vector(&self, scale: Scale<f32, CSSPixel, DevicePixel>) -> DeviceVector2D {
136 match self {
137 Self::Device(vector) => *vector,
138 Self::Page(vector) => *vector * scale,
139 }
140 }
141}
142
143impl From<DeviceVector2D> for WebViewVector {
144 fn from(vector: DeviceVector2D) -> Self {
145 Self::Device(vector)
146 }
147}
148
149impl From<LayoutVector2D> for WebViewVector {
150 fn from(vector: LayoutVector2D) -> Self {
151 Self::Page(Vector2D::new(vector.x, vector.y))
152 }
153}
154
155impl From<Vector2D<f32, CSSPixel>> for WebViewVector {
156 fn from(vector: Vector2D<f32, CSSPixel>) -> Self {
157 Self::Page(vector)
158 }
159}
160
161#[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)]
162pub enum Scroll {
163 Delta(WebViewVector),
164 Start,
165 End,
166}
167
168#[derive(Clone, Copy, Debug, PartialEq)]
171pub enum ShutdownState {
172 NotShuttingDown,
173 ShuttingDown,
174 FinishedShuttingDown,
175}
176
177#[repr(u8)]
180#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, MallocSizeOf, PartialEq, Serialize)]
181pub enum Cursor {
182 None,
183 #[default]
184 Default,
185 Pointer,
186 ContextMenu,
187 Help,
188 Progress,
189 Wait,
190 Cell,
191 Crosshair,
192 Text,
193 VerticalText,
194 Alias,
195 Copy,
196 Move,
197 NoDrop,
198 NotAllowed,
199 Grab,
200 Grabbing,
201 EResize,
202 NResize,
203 NeResize,
204 NwResize,
205 SResize,
206 SeResize,
207 SwResize,
208 WResize,
209 EwResize,
210 NsResize,
211 NeswResize,
212 NwseResize,
213 ColResize,
214 RowResize,
215 AllScroll,
216 ZoomIn,
217 ZoomOut,
218}
219
220pub trait EventLoopWaker: 'static + Send {
221 fn clone_box(&self) -> Box<dyn EventLoopWaker>;
222 fn wake(&self) {}
223}
224
225impl Clone for Box<dyn EventLoopWaker> {
226 fn clone(&self) -> Self {
227 self.clone_box()
228 }
229}
230pub struct EmbedderProxy {
232 pub sender: Sender<EmbedderMsg>,
233 pub event_loop_waker: Box<dyn EventLoopWaker>,
234}
235
236impl EmbedderProxy {
237 pub fn send(&self, message: EmbedderMsg) {
238 if let Err(err) = self.sender.send(message) {
240 warn!("Failed to send response ({:?}).", err);
241 }
242 self.event_loop_waker.wake();
243 }
244}
245
246impl Clone for EmbedderProxy {
247 fn clone(&self) -> EmbedderProxy {
248 EmbedderProxy {
249 sender: self.sender.clone(),
250 event_loop_waker: self.event_loop_waker.clone(),
251 }
252 }
253}
254
255pub trait RefreshDriver {
260 fn observe_next_frame(&self, start_frame_callback: Box<dyn Fn() + Send + 'static>);
267}
268
269#[derive(Debug, Default, Deserialize, PartialEq, Serialize)]
270pub struct AuthenticationResponse {
271 pub username: String,
273 pub password: String,
275}
276
277#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
279pub enum AllowOrDeny {
280 Allow,
281 Deny,
282}
283
284#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
285pub enum RegisterOrUnregister {
287 Register,
288 Unregister,
289}
290
291#[derive(Clone, Debug, Deserialize, Serialize)]
292pub struct ProtocolHandlerUpdateRegistration {
293 pub scheme: String,
295 pub url: ServoUrl,
297 pub register_or_unregister: RegisterOrUnregister,
299}
300
301#[derive(Clone, Copy, Debug, Default, Deserialize, MallocSizeOf, PartialEq, Serialize)]
304pub struct ViewportDetails {
305 pub size: Size2D<f32, CSSPixel>,
307
308 pub hidpi_scale_factor: Scale<f32, CSSPixel, DevicePixel>,
311}
312
313impl ViewportDetails {
314 pub fn layout_size(&self) -> LayoutSize {
317 Size2D::from_untyped(self.size.to_untyped())
318 }
319}
320
321#[derive(Default, Deserialize, Serialize)]
324pub struct ScreenMetrics {
325 pub screen_size: DeviceIndependentIntSize,
326 pub available_size: DeviceIndependentIntSize,
327}
328
329#[derive(Clone, Deserialize, Eq, Hash, PartialEq, Serialize)]
331pub struct TraversalId(String);
332
333impl TraversalId {
334 #[expect(clippy::new_without_default)]
335 pub fn new() -> Self {
336 Self(Uuid::new_v4().to_string())
337 }
338}
339
340#[derive(Clone, Copy, Deserialize, Eq, Hash, PartialEq, Serialize)]
341pub enum PixelFormat {
342 K8,
344 KA8,
346 RGB8,
348 RGBA8,
350 BGRA8,
352}
353
354#[derive(Clone, Deserialize, Serialize)]
356pub struct Image {
357 pub width: u32,
358 pub height: u32,
359 pub format: PixelFormat,
360 data: Arc<GenericSharedMemory>,
362 range: Range<usize>,
363}
364
365impl Image {
366 pub fn new(
367 width: u32,
368 height: u32,
369 data: Arc<GenericSharedMemory>,
370 range: Range<usize>,
371 format: PixelFormat,
372 ) -> Self {
373 Self {
374 width,
375 height,
376 format,
377 data,
378 range,
379 }
380 }
381
382 pub fn data(&self) -> &[u8] {
384 &self.data[self.range.clone()]
385 }
386}
387
388#[derive(Clone, Debug, Deserialize, Serialize)]
389pub enum ConsoleLogLevel {
390 Log,
391 Debug,
392 Info,
393 Warn,
394 Error,
395 Trace,
396}
397
398impl From<ConsoleLogLevel> for log::Level {
399 fn from(value: ConsoleLogLevel) -> Self {
400 match value {
401 ConsoleLogLevel::Log => log::Level::Info,
402 ConsoleLogLevel::Debug => log::Level::Debug,
403 ConsoleLogLevel::Info => log::Level::Info,
404 ConsoleLogLevel::Warn => log::Level::Warn,
405 ConsoleLogLevel::Error => log::Level::Error,
406 ConsoleLogLevel::Trace => log::Level::Trace,
407 }
408 }
409}
410
411#[derive(Deserialize, IntoStaticStr, Serialize)]
413pub enum EmbedderMsg {
414 Status(WebViewId, Option<String>),
416 ChangePageTitle(WebViewId, Option<String>),
418 MoveTo(WebViewId, DeviceIntPoint),
420 ResizeTo(WebViewId, DeviceIntSize),
422 ShowSimpleDialog(WebViewId, SimpleDialogRequest),
426 RequestAuthentication(
428 WebViewId,
429 ServoUrl,
430 bool, GenericSender<Option<AuthenticationResponse>>,
432 ),
433 AllowNavigationRequest(WebViewId, PipelineId, ServoUrl),
435 AllowProtocolHandlerRequest(
437 WebViewId,
438 ProtocolHandlerUpdateRegistration,
439 GenericSender<AllowOrDeny>,
440 ),
441 AllowOpeningWebView(WebViewId, GenericSender<Option<NewWebViewDetails>>),
443 WebViewClosed(WebViewId),
445 WebViewFocused(WebViewId, bool),
448 WebViewBlurred,
450 AllowUnload(WebViewId, GenericSender<AllowOrDeny>),
452 ClearClipboard(WebViewId),
454 GetClipboardText(WebViewId, GenericCallback<Result<String, String>>),
456 SetClipboardText(WebViewId, String),
458 SetCursor(WebViewId, Cursor),
460 NewFavicon(WebViewId, Image),
462 HistoryChanged(WebViewId, Vec<ServoUrl>, usize),
464 HistoryTraversalComplete(WebViewId, TraversalId),
466 GetWindowRect(WebViewId, GenericSender<DeviceIndependentIntRect>),
468 GetScreenMetrics(WebViewId, GenericSender<ScreenMetrics>),
470 NotifyFullscreenStateChanged(WebViewId, bool),
472 NotifyLoadStatusChanged(WebViewId, LoadStatus),
474 WebResourceRequested(
475 Option<WebViewId>,
476 WebResourceRequest,
477 GenericSender<WebResourceResponseMsg>,
478 ),
479 Panic(WebViewId, String, Option<String>),
481 GetSelectedBluetoothDevice(WebViewId, Vec<String>, GenericSender<Option<String>>),
483 SelectFiles(
485 EmbedderControlId,
486 FilePickerRequest,
487 GenericSender<Option<Vec<PathBuf>>>,
488 ),
489 PromptPermission(WebViewId, PermissionFeature, GenericSender<AllowOrDeny>),
491 ReportProfile(Vec<u8>),
493 MediaSessionEvent(WebViewId, MediaSessionEvent),
496 OnDevtoolsStarted(Result<u16, ()>, String),
498 RequestDevtoolsConnection(GenericSender<AllowOrDeny>),
500 #[cfg(feature = "gamepad")]
502 PlayGamepadHapticEffect(
503 WebViewId,
504 usize,
505 GamepadHapticEffectType,
506 GenericCallback<bool>,
507 ),
508 #[cfg(feature = "gamepad")]
510 StopGamepadHapticEffect(WebViewId, usize, GenericCallback<bool>),
511 ShutdownComplete,
515 ShowNotification(Option<WebViewId>, Notification),
517 ShowConsoleApiMessage(Option<WebViewId>, ConsoleLogLevel, String),
520 ShowEmbedderControl(EmbedderControlId, DeviceIntRect, EmbedderControlRequest),
522 HideEmbedderControl(EmbedderControlId),
524 FinishJavaScriptEvaluation(
527 JavaScriptEvaluationId,
528 Result<JSValue, JavaScriptEvaluationError>,
529 ),
530 InputEventHandled(WebViewId, InputEventId, InputEventResult),
533}
534
535impl Debug for EmbedderMsg {
536 fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> {
537 let string: &'static str = self.into();
538 write!(formatter, "{string}")
539 }
540}
541
542#[derive(Clone, Debug, Deserialize, Serialize)]
544pub struct MediaMetadata {
545 pub title: String,
547 pub artist: String,
549 pub album: String,
551}
552
553impl MediaMetadata {
554 pub fn new(title: String) -> Self {
555 Self {
556 title,
557 artist: "".to_owned(),
558 album: "".to_owned(),
559 }
560 }
561}
562
563#[repr(i32)]
565#[derive(Clone, Debug, Deserialize, Serialize)]
566pub enum MediaSessionPlaybackState {
567 None_ = 1,
569 Playing,
571 Paused,
573}
574
575#[derive(Clone, Debug, Deserialize, Serialize)]
577pub struct MediaPositionState {
578 pub duration: f64,
579 pub playback_rate: f64,
580 pub position: f64,
581}
582
583impl MediaPositionState {
584 pub fn new(duration: f64, playback_rate: f64, position: f64) -> Self {
585 Self {
586 duration,
587 playback_rate,
588 position,
589 }
590 }
591}
592
593#[derive(Clone, Debug, Deserialize, Serialize)]
595pub enum MediaSessionEvent {
596 SetMetadata(MediaMetadata),
598 PlaybackStateChange(MediaSessionPlaybackState),
600 SetPositionState(MediaPositionState),
602}
603
604#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
606pub enum PermissionFeature {
607 Geolocation,
608 Notifications,
609 Push,
610 Midi,
611 Camera,
612 Microphone,
613 Speaker,
614 DeviceInfo,
615 BackgroundSync,
616 Bluetooth,
617 PersistentStorage,
618}
619
620#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
624pub enum InputMethodType {
625 Color,
626 Date,
627 DatetimeLocal,
628 Email,
629 Month,
630 Number,
631 Password,
632 Search,
633 Tel,
634 Text,
635 Time,
636 Url,
637 Week,
638}
639
640#[cfg(feature = "gamepad")]
641#[derive(Clone, Debug, Deserialize, Serialize)]
642pub struct DualRumbleEffectParams {
644 pub duration: f64,
645 pub start_delay: f64,
646 pub strong_magnitude: f64,
647 pub weak_magnitude: f64,
648}
649
650#[cfg(feature = "gamepad")]
651#[derive(Clone, Debug, Deserialize, Serialize)]
652pub enum GamepadHapticEffectType {
654 DualRumble(DualRumbleEffectParams),
655}
656
657#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)]
658pub struct WebResourceRequest {
659 #[serde(
660 deserialize_with = "::hyper_serde::deserialize",
661 serialize_with = "::hyper_serde::serialize"
662 )]
663 #[ignore_malloc_size_of = "Defined in hyper"]
664 pub method: Method,
665 #[serde(
666 deserialize_with = "::hyper_serde::deserialize",
667 serialize_with = "::hyper_serde::serialize"
668 )]
669 #[ignore_malloc_size_of = "Defined in hyper"]
670 pub headers: HeaderMap,
671 pub url: Url,
672 pub is_for_main_frame: bool,
673 pub is_redirect: bool,
674}
675
676#[derive(Clone, Deserialize, Serialize)]
677pub enum WebResourceResponseMsg {
678 Start(WebResourceResponse),
682 SendBodyData(Vec<u8>),
684 FinishLoad,
686 CancelLoad,
688 DoNotIntercept,
690}
691
692#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)]
693pub struct WebResourceResponse {
694 pub url: Url,
695 #[serde(
696 deserialize_with = "::hyper_serde::deserialize",
697 serialize_with = "::hyper_serde::serialize"
698 )]
699 #[ignore_malloc_size_of = "Defined in hyper"]
700 pub headers: HeaderMap,
701 #[serde(
702 deserialize_with = "::hyper_serde::deserialize",
703 serialize_with = "::hyper_serde::serialize"
704 )]
705 #[ignore_malloc_size_of = "Defined in hyper"]
706 pub status_code: StatusCode,
707 pub status_message: Vec<u8>,
708}
709
710impl WebResourceResponse {
711 pub fn new(url: Url) -> WebResourceResponse {
712 WebResourceResponse {
713 url,
714 headers: HeaderMap::new(),
715 status_code: StatusCode::OK,
716 status_message: b"OK".to_vec(),
717 }
718 }
719
720 pub fn headers(mut self, headers: HeaderMap) -> WebResourceResponse {
721 self.headers = headers;
722 self
723 }
724
725 pub fn status_code(mut self, status_code: StatusCode) -> WebResourceResponse {
726 self.status_code = status_code;
727 self
728 }
729
730 pub fn status_message(mut self, status_message: Vec<u8>) -> WebResourceResponse {
731 self.status_message = status_message;
732 self
733 }
734}
735
736#[derive(Clone, Copy, Debug, Deserialize, Eq, MallocSizeOf, PartialEq, Serialize)]
738pub enum Theme {
739 Light,
741 Dark,
743}
744
745impl From<Theme> for PrefersColorScheme {
746 fn from(value: Theme) -> Self {
747 match value {
748 Theme::Light => PrefersColorScheme::Light,
749 Theme::Dark => PrefersColorScheme::Dark,
750 }
751 }
752}
753
754#[derive(Clone, Debug, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)]
757pub enum MediaSessionActionType {
758 Play,
760 Pause,
762 SeekBackward,
765 SeekForward,
768 PreviousTrack,
772 NextTrack,
775 SkipAd,
777 Stop,
779 SeekTo,
781}
782
783#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
785pub enum LoadStatus {
786 Started,
788 HeadParsed,
791 Complete,
795}
796
797#[derive(Clone, Debug, Deserialize, Serialize)]
800pub struct Notification {
801 pub title: String,
803 pub body: String,
805 pub tag: String,
808 pub language: String,
810 pub require_interaction: bool,
813 pub silent: Option<bool>,
816 pub icon_url: Option<ServoUrl>,
818 pub icon_resource: Option<Arc<SharedRasterImage>>,
820 pub badge_url: Option<ServoUrl>,
823 pub badge_resource: Option<Arc<SharedRasterImage>>,
825 pub image_url: Option<ServoUrl>,
827 pub image_resource: Option<Arc<SharedRasterImage>>,
829 pub actions: Vec<NotificationAction>,
831}
832
833#[derive(Clone, Debug, Deserialize, Serialize)]
835pub struct NotificationAction {
836 pub name: String,
838 pub title: String,
840 pub icon_url: Option<ServoUrl>,
842 pub icon_resource: Option<Arc<SharedRasterImage>>,
844}
845
846#[derive(Clone, Copy, Debug, Default)]
852pub struct ScreenGeometry {
853 pub size: DeviceIntSize,
856 pub available_size: DeviceIntSize,
862 pub window_rect: DeviceIntRect,
867}
868
869impl From<SelectElementOption> for SelectElementOptionOrOptgroup {
870 fn from(value: SelectElementOption) -> Self {
871 Self::Option(value)
872 }
873}
874
875#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
878pub struct UntrustedNodeAddress(pub *const c_void);
879
880malloc_size_of_is_0!(UntrustedNodeAddress);
881
882#[expect(unsafe_code)]
883unsafe impl Send for UntrustedNodeAddress {}
884
885impl From<style_traits::dom::OpaqueNode> for UntrustedNodeAddress {
886 fn from(o: style_traits::dom::OpaqueNode) -> Self {
887 UntrustedNodeAddress(o.0 as *const c_void)
888 }
889}
890
891impl Serialize for UntrustedNodeAddress {
892 fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
893 (self.0 as usize).serialize(s)
894 }
895}
896
897impl<'de> Deserialize<'de> for UntrustedNodeAddress {
898 fn deserialize<D: Deserializer<'de>>(d: D) -> Result<UntrustedNodeAddress, D::Error> {
899 let value: usize = Deserialize::deserialize(d)?;
900 Ok(UntrustedNodeAddress::from_id(value))
901 }
902}
903
904impl UntrustedNodeAddress {
905 #[inline]
907 pub fn from_id(id: usize) -> UntrustedNodeAddress {
908 UntrustedNodeAddress(id as *const c_void)
909 }
910}
911
912#[derive(Clone, Debug, Deserialize, Serialize)]
914pub struct PaintHitTestResult {
915 pub pipeline_id: PipelineId,
917
918 pub point_in_viewport: Point2D<f32, CSSPixel>,
920
921 pub external_scroll_id: ExternalScrollId,
923}
924
925#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
928pub enum AnimationState {
929 AnimationsPresent,
931 AnimationCallbacksPresent,
933 NoAnimationsPresent,
935 NoAnimationCallbacksPresent,
937}
938
939#[derive(
992 Clone,
993 Copy,
994 Debug,
995 Default,
996 Deserialize,
997 Eq,
998 Hash,
999 MallocSizeOf,
1000 PartialEq,
1001 Serialize,
1002 PartialOrd,
1003)]
1004pub struct FocusSequenceNumber(pub u64);
1005
1006impl Display for FocusSequenceNumber {
1007 fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
1008 Display::fmt(&self.0, f)
1009 }
1010}
1011
1012#[derive(Clone, Copy, Deserialize, Eq, Hash, PartialEq, Serialize)]
1015pub struct JavaScriptEvaluationId(pub usize);
1016
1017#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
1018pub enum JSValue {
1019 Undefined,
1020 Null,
1021 Boolean(bool),
1022 Number(f64),
1023 String(String),
1024 Element(String),
1025 ShadowRoot(String),
1026 Frame(String),
1027 Window(String),
1028 Array(Vec<JSValue>),
1029 Object(HashMap<String, JSValue>),
1030}
1031
1032#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
1033pub struct JavaScriptErrorInfo {
1034 pub message: String,
1035 pub filename: String,
1036 pub stack: Option<String>,
1037 pub line_number: u64,
1038 pub column: u64,
1039}
1040
1041#[derive(Clone, Debug, Deserialize, EnumMessage, PartialEq, Serialize)]
1044pub enum JavaScriptEvaluationResultSerializationError {
1045 DetachedShadowRoot,
1048 StaleElementReference,
1051 UnknownType,
1054 OtherJavaScriptError,
1058}
1059
1060#[derive(Clone, Debug, Deserialize, EnumMessage, PartialEq, Serialize)]
1062pub enum JavaScriptEvaluationError {
1063 DocumentNotFound,
1065 CompilationFailure,
1067 EvaluationFailure(Option<JavaScriptErrorInfo>),
1069 InternalError,
1072 WebViewNotReady,
1075 SerializationError(JavaScriptEvaluationResultSerializationError),
1078}
1079
1080#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
1081pub enum ScreenshotCaptureError {
1082 CouldNotReadImage,
1085 WebViewDoesNotExist,
1087}
1088
1089#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
1090pub struct RgbColor {
1091 pub red: u8,
1092 pub green: u8,
1093 pub blue: u8,
1094}
1095
1096#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)]
1098pub struct ScriptToEmbedderChan(GenericCallback<EmbedderMsg>);
1099
1100impl ScriptToEmbedderChan {
1101 pub fn new(
1103 embedder_chan: Sender<EmbedderMsg>,
1104 waker: Box<dyn EventLoopWaker>,
1105 ) -> ScriptToEmbedderChan {
1106 let embedder_callback = GenericCallback::new(move |embedder_msg| {
1107 let msg = match embedder_msg {
1108 Ok(embedder_msg) => embedder_msg,
1109 Err(err) => {
1110 log::warn!("Script to Embedder message error: {err}");
1111 return;
1112 },
1113 };
1114 let _ = embedder_chan.send(msg);
1115 waker.wake();
1116 })
1117 .expect("Failed to create channel");
1118 ScriptToEmbedderChan(embedder_callback)
1119 }
1120
1121 pub fn send(&self, msg: EmbedderMsg) -> SendResult {
1123 self.0.send(msg)
1124 }
1125}
1126
1127#[derive(Deserialize, Serialize)]
1130pub struct NewWebViewDetails {
1131 pub webview_id: WebViewId,
1132 pub viewport_details: ViewportDetails,
1133 pub user_content_manager_id: Option<UserContentManagerId>,
1134}