diff options
author | Martin Robinson <mrobinson@igalia.com> | 2025-04-06 00:13:29 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-05 22:13:29 +0000 |
commit | 6031a12fd1fa4aee8368e0b3dc0cb792caac56bc (patch) | |
tree | cc91327012041a24bd1b71c7768660a2efbe862f | |
parent | a67409fb253b3cb6dd1adbaf9d3cad47941f4993 (diff) | |
download | servo-6031a12fd1fa4aee8368e0b3dc0cb792caac56bc.tar.gz servo-6031a12fd1fa4aee8368e0b3dc0cb792caac56bc.zip |
Move `ScriptToConstellationMsg` to `constellation_traits` (#36364)
This is the last big change necessary to create the
`constellation_traits` crate. This moves the data structure for messages
that originate from the `ScriptThread` and are sent to the
`Contellation` to `constellation_traits`, effectively splitting
`script_traits` in half. Before, `script_traits` was responsible for
exposing the API of both the `ScriptThread` and the `Constellation` to
the rest of Servo.
- Data structures that are used by `ScriptToConstellationMsg` are moved
to `constellation_traits`. The dependency graph looks a bit like this:
`script_layout_interface` depends on `script_traits` depends on
`constellation_traits` depends on `embedder_traits`.
- Data structures that are used in the embedding layer
(`UntrustedNodeAddress`, `CompositorHitTestResult`, `TouchEventResult`
and `AnimationState`) are moved to embedder_traits, to avoid a
dependency cycle between `webrender_traits` and
`constellation_traits`.
- Types dealing with MessagePorts and serialization are moved to
`constellation_traits::message_port`.
Testing: This is covered by existing tests as it just moves types
around.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
77 files changed, 1224 insertions, 1222 deletions
diff --git a/Cargo.lock b/Cargo.lock index a47e5445490..11de75281e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1186,16 +1186,26 @@ version = "0.0.1" dependencies = [ "base", "bitflags 2.9.0", + "canvas_traits", + "devtools_traits", "embedder_traits", "euclid", + "http 1.3.1", + "hyper_serde", "ipc-channel", + "log", "malloc_size_of_derive", + "net_traits", + "profile_traits", "serde", "servo_malloc_size_of", "servo_url", + "strum", "strum_macros", - "stylo_traits", + "uuid", + "webgpu_traits", "webrender_api", + "wgpu-core", ] [[package]] @@ -4627,6 +4637,7 @@ name = "metrics" version = "0.0.1" dependencies = [ "base", + "constellation_traits", "ipc-channel", "log", "malloc_size_of_derive", @@ -6478,21 +6489,16 @@ version = "0.0.1" dependencies = [ "background_hang_monitor_api", "base", - "bitflags 2.9.0", "bluetooth_traits", "canvas_traits", "constellation_traits", - "cookie 0.18.1", "crossbeam-channel", "devtools_traits", "embedder_traits", "euclid", "http 1.3.1", - "hyper_serde", "ipc-channel", "keyboard-types", - "libc", - "log", "malloc_size_of_derive", "media", "net_traits", @@ -6505,13 +6511,10 @@ dependencies = [ "strum_macros", "stylo_atoms", "stylo_traits", - "uuid", - "webdriver", "webgpu_traits", "webrender_api", "webrender_traits", "webxr-api", - "wgpu-core", ] [[package]] @@ -8675,7 +8678,6 @@ name = "webrender_traits" version = "0.0.1" dependencies = [ "base", - "constellation_traits", "dpi", "embedder_traits", "euclid", diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 7afee58a4cf..9764d343b92 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -20,14 +20,13 @@ use compositing_traits::{ CompositionPipeline, CompositorMsg, CompositorReceiver, SendableFrameTree, }; use constellation_traits::{ - AnimationTickType, CompositorHitTestResult, EmbedderToConstellationMessage, PaintMetricEvent, - UntrustedNodeAddress, WindowSizeType, + AnimationTickType, EmbedderToConstellationMessage, PaintMetricEvent, WindowSizeType, }; use crossbeam_channel::Sender; use dpi::PhysicalSize; use embedder_traits::{ - Cursor, InputEvent, MouseButtonEvent, MouseMoveEvent, ScreenGeometry, ShutdownState, - TouchEventType, ViewportDetails, + AnimationState, CompositorHitTestResult, Cursor, InputEvent, MouseButtonEvent, MouseMoveEvent, + ScreenGeometry, ShutdownState, TouchEventType, UntrustedNodeAddress, ViewportDetails, }; use euclid::{Box2D, Point2D, Rect, Scale, Size2D, Transform3D}; use fnv::FnvHashMap; @@ -37,7 +36,6 @@ use log::{debug, info, trace, warn}; use pixels::{CorsStatus, Image, ImageFrame, PixelFormat}; use profile_traits::time::{self as profile_time, ProfilerCategory}; use profile_traits::time_profile; -use script_traits::AnimationState; use servo_config::opts; use servo_geometry::DeviceIndependentPixel; use style_traits::{CSSPixel, PinchZoomFactor}; diff --git a/components/compositing/webview.rs b/components/compositing/webview.rs index e0b54de5139..7b2e997c5d2 100644 --- a/components/compositing/webview.rs +++ b/components/compositing/webview.rs @@ -9,15 +9,15 @@ use std::rc::Rc; use base::id::{PipelineId, WebViewId}; use compositing_traits::SendableFrameTree; -use constellation_traits::{CompositorHitTestResult, EmbedderToConstellationMessage, ScrollState}; +use constellation_traits::{EmbedderToConstellationMessage, ScrollState}; use embedder_traits::{ - InputEvent, MouseButton, MouseButtonAction, MouseButtonEvent, MouseMoveEvent, ShutdownState, - TouchEvent, TouchEventType, TouchId, + AnimationState, CompositorHitTestResult, InputEvent, MouseButton, MouseButtonAction, + MouseButtonEvent, MouseMoveEvent, ShutdownState, TouchEvent, TouchEventResult, TouchEventType, + TouchId, }; use euclid::{Point2D, Scale, Vector2D}; use fnv::FnvHashSet; use log::{debug, warn}; -use script_traits::{AnimationState, TouchEventResult}; use webrender::Transaction; use webrender_api::units::{DeviceIntPoint, DevicePoint, DeviceRect, LayoutVector2D}; use webrender_api::{ diff --git a/components/constellation/constellation.rs b/components/constellation/constellation.rs index f176f3b60d0..a2809defdd6 100644 --- a/components/constellation/constellation.rs +++ b/components/constellation/constellation.rs @@ -110,8 +110,13 @@ use canvas_traits::canvas::{CanvasId, CanvasMsg}; use canvas_traits::webgl::WebGLThreads; use compositing_traits::{CompositorMsg, CompositorProxy, SendableFrameTree}; use constellation_traits::{ - AnimationTickType, CompositorHitTestResult, EmbedderToConstellationMessage, LogEntry, - PaintMetricEvent, ScrollState, TraversalDirection, WindowSizeType, + AnimationTickType, AuxiliaryWebViewCreationRequest, AuxiliaryWebViewCreationResponse, + BroadcastMsg, DocumentState, EmbedderToConstellationMessage, IFrameLoadInfo, + IFrameLoadInfoWithData, IFrameSandboxState, IFrameSizeMsg, Job, LoadData, LoadOrigin, LogEntry, + MessagePortMsg, NavigationHistoryBehavior, PaintMetricEvent, PortMessageTask, SWManagerMsg, + SWManagerSenders, ScriptToConstellationChan, ScriptToConstellationMessage, ScrollState, + ServiceWorkerManagerFactory, ServiceWorkerMsg, StructuredSerializedData, TraversalDirection, + WindowSizeType, }; use crossbeam_channel::{Receiver, Select, Sender, unbounded}; use devtools_traits::{ @@ -121,9 +126,10 @@ use devtools_traits::{ use embedder_traits::resources::{self, Resource}; use embedder_traits::user_content_manager::UserContentManager; use embedder_traits::{ - Cursor, EmbedderMsg, EmbedderProxy, ImeEvent, InputEvent, MediaSessionActionType, - MediaSessionEvent, MediaSessionPlaybackState, MouseButton, MouseButtonAction, MouseButtonEvent, - Theme, ViewportDetails, WebDriverCommandMsg, WebDriverLoadStatus, + AnimationState, CompositorHitTestResult, Cursor, EmbedderMsg, EmbedderProxy, ImeEvent, + InputEvent, MediaSessionActionType, MediaSessionEvent, MediaSessionPlaybackState, MouseButton, + MouseButtonAction, MouseButtonEvent, Theme, ViewportDetails, WebDriverCommandMsg, + WebDriverLoadStatus, }; use euclid::Size2D; use euclid::default::Size2D as UntypedSize2D; @@ -142,13 +148,8 @@ use net_traits::{self, IpcSend, ReferrerPolicy, ResourceThreads}; use profile_traits::{mem, time}; use script_layout_interface::{LayoutFactory, ScriptThreadFactory}; use script_traits::{ - AnimationState, AuxiliaryWebViewCreationRequest, AuxiliaryWebViewCreationResponse, - BroadcastMsg, ConstellationInputEvent, DiscardBrowsingContext, DocumentActivity, DocumentState, - IFrameLoadInfo, IFrameLoadInfoWithData, IFrameSandboxState, IFrameSizeMsg, Job, LoadData, - LoadOrigin, MessagePortMsg, NavigationHistoryBehavior, PortMessageTask, - ProgressiveWebMetricType, SWManagerMsg, SWManagerSenders, ScriptThreadMessage, - ScriptToConstellationChan, ScriptToConstellationMessage, ServiceWorkerManagerFactory, - ServiceWorkerMsg, StructuredSerializedData, UpdatePipelineIdReason, + ConstellationInputEvent, DiscardBrowsingContext, DocumentActivity, ProgressiveWebMetricType, + ScriptThreadMessage, UpdatePipelineIdReason, }; use serde::{Deserialize, Serialize}; use servo_config::{opts, pref}; diff --git a/components/constellation/logging.rs b/components/constellation/logging.rs index 264287524d3..97ff0202bd8 100644 --- a/components/constellation/logging.rs +++ b/components/constellation/logging.rs @@ -12,11 +12,13 @@ use std::thread; use backtrace::Backtrace; use base::id::WebViewId; -use constellation_traits::{EmbedderToConstellationMessage, LogEntry}; +use constellation_traits::{ + EmbedderToConstellationMessage, LogEntry, ScriptToConstellationChan, + ScriptToConstellationMessage, +}; use crossbeam_channel::Sender; use log::{Level, LevelFilter, Log, Metadata, Record}; use parking_lot::ReentrantMutex; -use script_traits::{ScriptToConstellationChan, ScriptToConstellationMessage}; /// A logger directed at the constellation from content processes /// #[derive(Clone)] diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index fc988f6e408..8095cd6f0ae 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -19,10 +19,11 @@ use base::id::{ use bluetooth_traits::BluetoothRequest; use canvas_traits::webgl::WebGLPipeline; use compositing_traits::{CompositionPipeline, CompositorMsg, CompositorProxy}; +use constellation_traits::{LoadData, SWManagerMsg, ScriptToConstellationChan}; use crossbeam_channel::{Sender, unbounded}; use devtools_traits::{DevtoolsControlMsg, ScriptToDevtoolsControlMsg}; -use embedder_traits::ViewportDetails; use embedder_traits::user_content_manager::UserContentManager; +use embedder_traits::{AnimationState, ViewportDetails}; use fonts::{SystemFontServiceProxy, SystemFontServiceProxySender}; use ipc_channel::Error; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; @@ -37,8 +38,8 @@ use profile_traits::mem::{ProfilerMsg, Reporter}; use profile_traits::{mem as profile_mem, time}; use script_layout_interface::{LayoutFactory, ScriptThreadFactory}; use script_traits::{ - AnimationState, DiscardBrowsingContext, DocumentActivity, InitialScriptState, LoadData, - NewLayoutInfo, SWManagerMsg, ScriptThreadMessage, ScriptToConstellationChan, + DiscardBrowsingContext, DocumentActivity, InitialScriptState, NewLayoutInfo, + ScriptThreadMessage, }; use serde::{Deserialize, Serialize}; use servo_config::opts::{self, Opts}; diff --git a/components/constellation/serviceworker.rs b/components/constellation/serviceworker.rs index 51384752d66..e566b8b01a0 100644 --- a/components/constellation/serviceworker.rs +++ b/components/constellation/serviceworker.rs @@ -2,9 +2,9 @@ * 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/. */ +use constellation_traits::{SWManagerSenders, ServiceWorkerManagerFactory}; use ipc_channel::Error; use ipc_channel::ipc::IpcSender; -use script_traits::{SWManagerSenders, ServiceWorkerManagerFactory}; use serde::{Deserialize, Serialize}; use servo_config::opts::{self, Opts}; use servo_config::prefs; diff --git a/components/constellation/session_history.rs b/components/constellation/session_history.rs index 1da2ea4db65..4d7c9979497 100644 --- a/components/constellation/session_history.rs +++ b/components/constellation/session_history.rs @@ -6,9 +6,9 @@ use std::cmp::PartialEq; use std::fmt; use base::id::{BrowsingContextId, HistoryStateId, PipelineId, WebViewId}; +use constellation_traits::LoadData; use embedder_traits::ViewportDetails; use log::debug; -use script_traits::LoadData; use servo_url::ServoUrl; use crate::browsingcontext::NewBrowsingContextInfo; diff --git a/components/constellation/tracing.rs b/components/constellation/tracing.rs index 7e38027afcb..a939bbafc48 100644 --- a/components/constellation/tracing.rs +++ b/components/constellation/tracing.rs @@ -113,7 +113,7 @@ mod from_script { }; } - impl LogTarget for script_traits::ScriptToConstellationMessage { + impl LogTarget for constellation_traits::ScriptToConstellationMessage { fn log_target(&self) -> &'static str { match self { Self::CompleteMessagePortTransfer(..) => target!("CompleteMessagePortTransfer"), diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs index a34a7bf75a5..9639275608b 100644 --- a/components/layout_thread_2020/lib.rs +++ b/components/layout_thread_2020/lib.rs @@ -17,9 +17,9 @@ use std::sync::{Arc, LazyLock}; use app_units::Au; use base::Epoch; use base::id::{PipelineId, WebViewId}; -use constellation_traits::{ScrollState, UntrustedNodeAddress}; -use embedder_traits::ViewportDetails; +use constellation_traits::ScrollState; use embedder_traits::resources::{self, Resource}; +use embedder_traits::{UntrustedNodeAddress, ViewportDetails}; use euclid::default::{Point2D as UntypedPoint2D, Rect as UntypedRect, Size2D as UntypedSize2D}; use euclid::{Point2D, Scale, Size2D, Vector2D}; use fnv::FnvHashMap; diff --git a/components/metrics/Cargo.toml b/components/metrics/Cargo.toml index a62ff8c98dc..3888b41bb29 100644 --- a/components/metrics/Cargo.toml +++ b/components/metrics/Cargo.toml @@ -13,6 +13,7 @@ path = "lib.rs" [dependencies] base = { workspace = true } +constellation_traits = { workspace = true } ipc-channel = { workspace = true } log = { workspace = true } malloc_size_of = { workspace = true } diff --git a/components/script/animations.rs b/components/script/animations.rs index 464dc759cdc..693c3ae978f 100644 --- a/components/script/animations.rs +++ b/components/script/animations.rs @@ -7,11 +7,11 @@ use std::cell::Cell; use base::id::PipelineId; -use constellation_traits::UntrustedNodeAddress; +use constellation_traits::ScriptToConstellationMessage; use cssparser::ToCss; +use embedder_traits::{AnimationState as AnimationsPresentState, UntrustedNodeAddress}; use fxhash::{FxHashMap, FxHashSet}; use libc::c_void; -use script_traits::{AnimationState as AnimationsPresentState, ScriptToConstellationMessage}; use serde::{Deserialize, Serialize}; use style::animation::{ Animation, AnimationSetKey, AnimationState, DocumentAnimationSet, ElementAnimationSet, diff --git a/components/script/body.rs b/components/script/body.rs index 119ad294753..113f3ac7adb 100644 --- a/components/script/body.rs +++ b/components/script/body.rs @@ -5,6 +5,7 @@ use std::rc::Rc; use std::{ptr, slice, str}; +use constellation_traits::BlobImpl; use encoding_rs::{Encoding, UTF_8}; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; @@ -17,7 +18,6 @@ use mime::{self, Mime}; use net_traits::request::{ BodyChunkRequest, BodyChunkResponse, BodySource as NetBodySource, RequestBody, }; -use script_traits::serializable::BlobImpl; use url::form_urlencoded; use crate::dom::bindings::buffer_source::create_buffer_source; diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs index 72482758863..aea3012b365 100644 --- a/components/script/canvas_state.rs +++ b/components/script/canvas_state.rs @@ -12,6 +12,7 @@ use canvas_traits::canvas::{ FillRule, LineCapStyle, LineJoinStyle, LinearGradientStyle, PathSegment, RadialGradientStyle, RepetitionStyle, TextAlign, TextBaseline, TextMetrics as CanvasTextMetrics, }; +use constellation_traits::ScriptToConstellationMessage; use cssparser::color::clamp_unit_f32; use cssparser::{Parser, ParserInput}; use euclid::default::{Point2D, Rect, Size2D, Transform2D}; @@ -21,7 +22,6 @@ use net_traits::image_cache::{ImageCache, ImageResponse}; use net_traits::request::CorsSettings; use pixels::PixelFormat; use profile_traits::ipc as profiled_ipc; -use script_traits::ScriptToConstellationMessage; use servo_url::{ImmutableOrigin, ServoUrl}; use style::color::{AbsoluteColor, ColorFlags, ColorSpace}; use style::context::QuirksMode; diff --git a/components/script/clipboard_provider.rs b/components/script/clipboard_provider.rs index ac3e9ab8849..4c0f5467be6 100644 --- a/components/script/clipboard_provider.rs +++ b/components/script/clipboard_provider.rs @@ -3,9 +3,9 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use base::id::WebViewId; +use constellation_traits::{ScriptToConstellationChan, ScriptToConstellationMessage}; use embedder_traits::EmbedderMsg; use ipc_channel::ipc::channel; -use script_traits::{ScriptToConstellationChan, ScriptToConstellationMessage}; /// A trait which abstracts access to the embedder's clipboard in order to allow unit /// testing clipboard-dependent parts of `script`. diff --git a/components/script/dom/abstractworker.rs b/components/script/dom/abstractworker.rs index 5f7131eb0a0..8a353531145 100644 --- a/components/script/dom/abstractworker.rs +++ b/components/script/dom/abstractworker.rs @@ -2,7 +2,7 @@ * 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/. */ -use script_traits::StructuredSerializedData; +use constellation_traits::StructuredSerializedData; use servo_url::ImmutableOrigin; use crate::dom::bindings::refcounted::Trusted; diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index d7ce192652c..572faca1907 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -10,6 +10,10 @@ use std::os::raw; use std::ptr; use base::id::{BlobId, DomPointId, MessagePortId, PipelineNamespaceId}; +use constellation_traits::{ + BlobImpl, DomPoint, MessagePortImpl, Serializable as SerializableInterface, + StructuredSerializedData, Transferrable as TransferrableInterface, +}; use js::glue::{ CopyJSStructuredCloneData, DeleteJSAutoStructuredCloneBuffer, GetLengthOfJSStructuredCloneData, NewJSAutoStructuredCloneBuffer, WriteBytesToJSStructuredCloneData, @@ -24,12 +28,6 @@ use js::jsval::UndefinedValue; use js::rust::wrappers::{JS_ReadStructuredClone, JS_WriteStructuredClone}; use js::rust::{CustomAutoRooterGuard, HandleValue, MutableHandleValue}; use script_bindings::conversions::IDLInterface; -use script_traits::serializable::{BlobImpl, DomPoint}; -use script_traits::transferable::MessagePortImpl; -use script_traits::{ - Serializable as SerializableInterface, StructuredSerializedData, - Transferrable as TransferrableInterface, -}; use strum::IntoEnumIterator; use crate::dom::bindings::conversions::{ToJSValConvertible, root_from_object}; diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index d23cb62002e..5f9d4052929 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -8,13 +8,13 @@ use std::ptr; use std::rc::Rc; use base::id::{BlobId, BlobIndex, PipelineNamespaceId}; +use constellation_traits::BlobImpl; use dom_struct::dom_struct; use encoding_rs::UTF_8; use js::jsapi::JSObject; use js::rust::HandleObject; use js::typedarray::Uint8; use net_traits::filemanager_thread::RelativePos; -use script_traits::serializable::BlobImpl; use uuid::Uuid; use crate::body::{FetchedData, run_array_buffer_data_algorithm}; diff --git a/components/script/dom/broadcastchannel.rs b/components/script/dom/broadcastchannel.rs index 2d7d6740589..aae748262f2 100644 --- a/components/script/dom/broadcastchannel.rs +++ b/components/script/dom/broadcastchannel.rs @@ -4,9 +4,9 @@ use std::cell::Cell; +use constellation_traits::BroadcastMsg; use dom_struct::dom_struct; use js::rust::{HandleObject, HandleValue}; -use script_traits::BroadcastMsg; use uuid::Uuid; use crate::dom::bindings::codegen::Bindings::BroadcastChannelBinding::BroadcastChannelMethods; diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 5bfde8dcfc7..3f6b6ee7d90 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -7,6 +7,7 @@ use std::sync::atomic::AtomicBool; use std::thread::{self, JoinHandle}; use base::id::{BrowsingContextId, PipelineId, WebViewId}; +use constellation_traits::{WorkerGlobalScopeInit, WorkerScriptLoadOrigin}; use crossbeam_channel::{Receiver, Sender, unbounded}; use devtools_traits::DevtoolScriptControlMsg; use dom_struct::dom_struct; @@ -21,7 +22,6 @@ use net_traits::request::{ CredentialsMode, Destination, InsecureRequestsPolicy, ParserMetadata, Referrer, RequestBuilder, RequestMode, }; -use script_traits::{WorkerGlobalScopeInit, WorkerScriptLoadOrigin}; use servo_rand::random; use servo_url::{ImmutableOrigin, ServoUrl}; use style::thread_state::{self, ThreadState}; diff --git a/components/script/dom/dissimilaroriginwindow.rs b/components/script/dom/dissimilaroriginwindow.rs index e5258daf2c1..233b43855c4 100644 --- a/components/script/dom/dissimilaroriginwindow.rs +++ b/components/script/dom/dissimilaroriginwindow.rs @@ -3,11 +3,11 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use base::id::PipelineId; +use constellation_traits::{ScriptToConstellationMessage, StructuredSerializedData}; use dom_struct::dom_struct; use js::jsapi::{Heap, JSObject}; use js::jsval::UndefinedValue; use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleValue, MutableHandleValue}; -use script_traits::{ScriptToConstellationMessage, StructuredSerializedData}; use servo_url::ServoUrl; use crate::dom::bindings::codegen::Bindings::DissimilarOriginWindowBinding; diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 2e1d3859b4b..d76367ca982 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -20,16 +20,16 @@ use base::id::WebViewId; use canvas_traits::canvas::CanvasId; use canvas_traits::webgl::{self, WebGLContextId, WebGLMsg}; use chrono::Local; -use constellation_traits::{AnimationTickType, CompositorHitTestResult}; +use constellation_traits::{AnimationTickType, ScriptToConstellationMessage}; use content_security_policy::{self as csp, CspList, PolicyDisposition}; use cookie::Cookie; use cssparser::match_ignore_ascii_case; use devtools_traits::ScriptToDevtoolsControlMsg; use dom_struct::dom_struct; use embedder_traits::{ - AllowOrDeny, ContextMenuResult, EditingActionEvent, EmbedderMsg, ImeEvent, InputEvent, - LoadStatus, MouseButton, MouseButtonAction, MouseButtonEvent, TouchEvent, TouchEventType, - TouchId, WheelEvent, + AllowOrDeny, AnimationState, CompositorHitTestResult, ContextMenuResult, EditingActionEvent, + EmbedderMsg, ImeEvent, InputEvent, LoadStatus, MouseButton, MouseButtonAction, + MouseButtonEvent, TouchEvent, TouchEventType, TouchId, WheelEvent, }; use encoding_rs::{Encoding, UTF_8}; use euclid::default::{Point2D, Rect, Size2D}; @@ -53,10 +53,7 @@ use profile_traits::ipc as profile_ipc; use profile_traits::time::TimerMetadataFrameType; use script_bindings::interfaces::DocumentHelpers; use script_layout_interface::{PendingRestyle, TrustedNodeAddress}; -use script_traits::{ - AnimationState, ConstellationInputEvent, DocumentActivity, ProgressiveWebMetricType, - ScriptToConstellationMessage, -}; +use script_traits::{ConstellationInputEvent, DocumentActivity, ProgressiveWebMetricType}; use servo_arc::Arc; use servo_config::pref; use servo_media::{ClientContextId, ServoMedia}; diff --git a/components/script/dom/documentorshadowroot.rs b/components/script/dom/documentorshadowroot.rs index 6d59623c966..e3b09924689 100644 --- a/components/script/dom/documentorshadowroot.rs +++ b/components/script/dom/documentorshadowroot.rs @@ -4,7 +4,7 @@ use std::fmt; -use constellation_traits::UntrustedNodeAddress; +use embedder_traits::UntrustedNodeAddress; use euclid::default::Point2D; use script_layout_interface::{NodesFromPointQueryType, QueryMsg}; use servo_arc::Arc; diff --git a/components/script/dom/dompoint.rs b/components/script/dom/dompoint.rs index 84b02e6f4c4..c6323b28cf7 100644 --- a/components/script/dom/dompoint.rs +++ b/components/script/dom/dompoint.rs @@ -5,9 +5,9 @@ use std::collections::HashMap; use base::id::DomPointId; +use constellation_traits::DomPoint; use dom_struct::dom_struct; use js::rust::HandleObject; -use script_traits::serializable::DomPoint; use crate::dom::bindings::codegen::Bindings::DOMPointBinding::{DOMPointInit, DOMPointMethods}; use crate::dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::DOMPointReadOnlyMethods; diff --git a/components/script/dom/dompointreadonly.rs b/components/script/dom/dompointreadonly.rs index fed82bd9055..0bd6d5742c7 100644 --- a/components/script/dom/dompointreadonly.rs +++ b/components/script/dom/dompointreadonly.rs @@ -7,9 +7,9 @@ use std::collections::HashMap; use std::num::NonZeroU32; use base::id::{DomPointId, DomPointIndex, PipelineNamespaceId}; +use constellation_traits::DomPoint; use dom_struct::dom_struct; use js::rust::HandleObject; -use script_traits::serializable::DomPoint; use crate::dom::bindings::codegen::Bindings::DOMPointBinding::DOMPointInit; use crate::dom::bindings::codegen::Bindings::DOMPointReadOnlyBinding::DOMPointReadOnlyMethods; diff --git a/components/script/dom/file.rs b/components/script/dom/file.rs index 06671794c13..14a0ce68094 100644 --- a/components/script/dom/file.rs +++ b/components/script/dom/file.rs @@ -4,10 +4,10 @@ use std::time::SystemTime; +use constellation_traits::BlobImpl; use dom_struct::dom_struct; use js::rust::HandleObject; use net_traits::filemanager_thread::SelectedFile; -use script_traits::serializable::BlobImpl; use time::{Duration, OffsetDateTime}; use crate::dom::bindings::codegen::Bindings::FileBinding; diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index 6c8c7e057a9..1082a202f34 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -2,10 +2,10 @@ * 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/. */ +use constellation_traits::BlobImpl; use dom_struct::dom_struct; use html5ever::LocalName; use js::rust::HandleObject; -use script_traits::serializable::BlobImpl; use super::bindings::trace::NoTrace; use crate::dom::bindings::cell::DomRefCell; diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index 7d3c65dad2f..1ff9a7334be 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -17,6 +17,10 @@ use base::id::{ BlobId, BroadcastChannelRouterId, MessagePortId, MessagePortRouterId, PipelineId, ServiceWorkerId, ServiceWorkerRegistrationId, WebViewId, }; +use constellation_traits::{ + BlobData, BlobImpl, BroadcastMsg, FileBlob, MessagePortImpl, MessagePortMsg, PortMessageTask, + ScriptToConstellationChan, ScriptToConstellationMessage, +}; use content_security_policy::{CheckResult, CspList, PolicyDisposition}; use crossbeam_channel::Sender; use devtools_traits::{PageError, ScriptToDevtoolsControlMsg}; @@ -55,12 +59,6 @@ use net_traits::{ }; use profile_traits::{ipc as profile_ipc, mem as profile_mem, time as profile_time}; use script_bindings::interfaces::GlobalScopeHelpers; -use script_traits::serializable::{BlobData, BlobImpl, FileBlob}; -use script_traits::transferable::MessagePortImpl; -use script_traits::{ - BroadcastMsg, MessagePortMsg, PortMessageTask, ScriptToConstellationChan, - ScriptToConstellationMessage, -}; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use timers::{TimerEventId, TimerEventRequest, TimerSource}; use uuid::Uuid; diff --git a/components/script/dom/history.rs b/components/script/dom/history.rs index 316e9c86690..4b51f3e62d2 100644 --- a/components/script/dom/history.rs +++ b/components/script/dom/history.rs @@ -6,7 +6,9 @@ use std::cell::Cell; use std::cmp::Ordering; use base::id::HistoryStateId; -use constellation_traits::TraversalDirection; +use constellation_traits::{ + ScriptToConstellationMessage, StructuredSerializedData, TraversalDirection, +}; use dom_struct::dom_struct; use js::jsapi::Heap; use js::jsval::{JSVal, NullValue, UndefinedValue}; @@ -14,7 +16,6 @@ use js::rust::{HandleValue, MutableHandleValue}; use net_traits::{CoreResourceMsg, IpcSend}; use profile_traits::ipc; use profile_traits::ipc::channel; -use script_traits::{ScriptToConstellationMessage, StructuredSerializedData}; use servo_url::ServoUrl; use crate::dom::bindings::codegen::Bindings::HistoryBinding::HistoryMethods; diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 547ee9d8ccd..7d459349567 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -7,6 +7,9 @@ use std::collections::HashMap; use std::rc::Rc; use canvas_traits::webgl::{GLContextAttributes, WebGLVersion}; +use constellation_traits::BlobImpl; +#[cfg(feature = "webgpu")] +use constellation_traits::ScriptToConstellationMessage; use dom_struct::dom_struct; use euclid::default::Size2D; use html5ever::{LocalName, Prefix, local_name, namespace_url, ns}; @@ -20,9 +23,6 @@ use ipc_channel::ipc::{self as ipcchan}; use js::error::throw_type_error; use js::rust::{HandleObject, HandleValue}; use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource}; -#[cfg(feature = "webgpu")] -use script_traits::ScriptToConstellationMessage; -use script_traits::serializable::BlobImpl; use servo_media::streams::MediaStreamType; use servo_media::streams::registry::MediaStreamId; use style::attr::AttrValue; diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index fd85e3fd1a9..260c6cfb620 100644 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -5,6 +5,7 @@ use std::borrow::ToOwned; use std::cell::Cell; +use constellation_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior}; use dom_struct::dom_struct; use encoding_rs::{Encoding, UTF_8}; use headers::{ContentType, HeaderMapExt}; @@ -14,7 +15,6 @@ use js::rust::HandleObject; use mime::{self, Mime}; use net_traits::http_percent_encode; use net_traits::request::Referrer; -use script_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior}; use servo_rand::random; use style::attr::AttrValue; use style::str::split_html_space_chars; diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 04127ef1b17..cc6c3f047ce 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -6,17 +6,18 @@ use std::cell::Cell; use base::id::{BrowsingContextId, PipelineId, WebViewId}; use bitflags::bitflags; +use constellation_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed}; +use constellation_traits::{ + IFrameLoadInfo, IFrameLoadInfoWithData, JsEvalResult, LoadData, LoadOrigin, + NavigationHistoryBehavior, ScriptToConstellationMessage, +}; use dom_struct::dom_struct; use embedder_traits::ViewportDetails; use html5ever::{LocalName, Prefix, local_name, namespace_url, ns}; use js::rust::HandleObject; use net_traits::ReferrerPolicy; use profile_traits::ipc as ProfiledIpc; -use script_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed}; -use script_traits::{ - IFrameLoadInfo, IFrameLoadInfoWithData, JsEvalResult, LoadData, LoadOrigin, - NavigationHistoryBehavior, NewLayoutInfo, ScriptToConstellationMessage, UpdatePipelineIdReason, -}; +use script_traits::{NewLayoutInfo, UpdatePipelineIdReason}; use servo_url::ServoUrl; use style::attr::{AttrValue, LengthOrPercentageOrAuto}; use stylo_atoms::Atom; diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 16b6a2463d4..fd95ac1abbf 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -6,11 +6,11 @@ use std::str::FromStr; use std::sync::LazyLock; use std::time::Duration; +use constellation_traits::NavigationHistoryBehavior; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; use js::rust::HandleObject; use regex::bytes::Regex; -use script_traits::NavigationHistoryBehavior; use servo_url::ServoUrl; use style::str::HTML_SPACE_CHARACTERS; diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index eabf9c83f81..cbc0566a2e5 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -2,9 +2,9 @@ * 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/. */ +use constellation_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior}; use dom_struct::dom_struct; use net_traits::request::Referrer; -use script_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior}; use servo_url::{MutableOrigin, ServoUrl}; use crate::dom::bindings::codegen::Bindings::LocationBinding::LocationMethods; diff --git a/components/script/dom/mediasession.rs b/components/script/dom/mediasession.rs index f54335afb60..2d3b44dec7e 100644 --- a/components/script/dom/mediasession.rs +++ b/components/script/dom/mediasession.rs @@ -4,11 +4,11 @@ use std::rc::Rc; +use constellation_traits::ScriptToConstellationMessage; use dom_struct::dom_struct; use embedder_traits::{ MediaMetadata as EmbedderMediaMetadata, MediaSessionActionType, MediaSessionEvent, }; -use script_traits::ScriptToConstellationMessage; use super::bindings::trace::HashMapTracedValues; use crate::conversions::Convert; diff --git a/components/script/dom/messageport.rs b/components/script/dom/messageport.rs index f10ba10383e..8addfe0731f 100644 --- a/components/script/dom/messageport.rs +++ b/components/script/dom/messageport.rs @@ -8,11 +8,10 @@ use std::num::NonZeroU32; use std::rc::Rc; use base::id::{MessagePortId, MessagePortIndex, PipelineNamespaceId}; +use constellation_traits::{MessagePortImpl, PortMessageTask}; use dom_struct::dom_struct; use js::jsapi::{Heap, JSObject}; use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleValue}; -use script_traits::PortMessageTask; -use script_traits::transferable::MessagePortImpl; use crate::dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; use crate::dom::bindings::codegen::Bindings::MessagePortBinding::{ diff --git a/components/script/dom/mouseevent.rs b/components/script/dom/mouseevent.rs index 5818eb7352f..63752e6eb0a 100644 --- a/components/script/dom/mouseevent.rs +++ b/components/script/dom/mouseevent.rs @@ -5,8 +5,8 @@ use std::cell::Cell; use std::default::Default; -use constellation_traits::CompositorHitTestResult; use dom_struct::dom_struct; +use embedder_traits::CompositorHitTestResult; use euclid::default::Point2D; use js::rust::HandleObject; use servo_config::pref; diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index eff078c49c4..9c069a28c50 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -16,9 +16,9 @@ use std::{cmp, fmt, iter}; use app_units::Au; use base::id::{BrowsingContextId, PipelineId}; use bitflags::bitflags; -use constellation_traits::UntrustedNodeAddress; use devtools_traits::NodeInfo; use dom_struct::dom_struct; +use embedder_traits::UntrustedNodeAddress; use euclid::default::{Rect, Size2D, Vector2D}; use html5ever::serialize::HtmlSerializer; use html5ever::{Namespace, Prefix, QualName, namespace_url, ns, serialize as html_serialize}; diff --git a/components/script/dom/rtcdatachannel.rs b/components/script/dom/rtcdatachannel.rs index d9c5853a6a1..1aad3ef6794 100644 --- a/components/script/dom/rtcdatachannel.rs +++ b/components/script/dom/rtcdatachannel.rs @@ -5,13 +5,13 @@ use std::cell::Cell; use std::ptr; +use constellation_traits::BlobImpl; use dom_struct::dom_struct; use js::conversions::ToJSValConvertible; use js::jsapi::{JSAutoRealm, JSObject}; use js::jsval::UndefinedValue; use js::rust::CustomAutoRooterGuard; use js::typedarray::{ArrayBuffer, ArrayBufferView, CreateWith}; -use script_traits::serializable::BlobImpl; use servo_media::webrtc::{ DataChannelId, DataChannelInit, DataChannelMessage, DataChannelState, WebRtcError, }; diff --git a/components/script/dom/serviceworker.rs b/components/script/dom/serviceworker.rs index 68c995f6ce3..694c54e7455 100644 --- a/components/script/dom/serviceworker.rs +++ b/components/script/dom/serviceworker.rs @@ -5,10 +5,10 @@ use std::cell::Cell; use base::id::ServiceWorkerId; +use constellation_traits::{DOMMessage, ScriptToConstellationMessage}; use dom_struct::dom_struct; use js::jsapi::{Heap, JSObject}; use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleValue}; -use script_traits::{DOMMessage, ScriptToConstellationMessage}; use servo_url::ServoUrl; use crate::dom::abstractworker::SimpleWorkerErrorHandler; diff --git a/components/script/dom/serviceworkercontainer.rs b/components/script/dom/serviceworkercontainer.rs index b532714ec1a..b0781941f51 100644 --- a/components/script/dom/serviceworkercontainer.rs +++ b/components/script/dom/serviceworkercontainer.rs @@ -5,12 +5,12 @@ use std::default::Default; use std::rc::Rc; +use constellation_traits::{ + Job, JobError, JobResult, JobResultValue, JobType, ScriptToConstellationMessage, +}; use dom_struct::dom_struct; use ipc_channel::ipc; use ipc_channel::router::ROUTER; -use script_traits::{ - Job, JobError, JobResult, JobResultValue, JobType, ScriptToConstellationMessage, -}; use crate::dom::bindings::codegen::Bindings::ServiceWorkerContainerBinding::{ RegistrationOptions, ServiceWorkerContainerMethods, diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index a158363f9f2..defed40f0ef 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -8,6 +8,9 @@ use std::thread::{self, JoinHandle}; use std::time::{Duration, Instant}; use base::id::PipelineId; +use constellation_traits::{ + ScopeThings, ServiceWorkerMsg, WorkerGlobalScopeInit, WorkerScriptLoadOrigin, +}; use crossbeam_channel::{Receiver, Sender, after, unbounded}; use devtools_traits::DevtoolScriptControlMsg; use dom_struct::dom_struct; @@ -19,7 +22,6 @@ use net_traits::request::{ CredentialsMode, Destination, InsecureRequestsPolicy, ParserMetadata, Referrer, RequestBuilder, }; use net_traits::{CustomResponseMediator, IpcSend}; -use script_traits::{ScopeThings, ServiceWorkerMsg, WorkerGlobalScopeInit, WorkerScriptLoadOrigin}; use servo_config::pref; use servo_rand::random; use servo_url::ServoUrl; diff --git a/components/script/dom/serviceworkerregistration.rs b/components/script/dom/serviceworkerregistration.rs index bbd3840e695..fc29a4b7afe 100644 --- a/components/script/dom/serviceworkerregistration.rs +++ b/components/script/dom/serviceworkerregistration.rs @@ -5,10 +5,10 @@ use std::cell::Cell; use base::id::ServiceWorkerRegistrationId; +use constellation_traits::{ScopeThings, WorkerScriptLoadOrigin}; use devtools_traits::WorkerId; use dom_struct::dom_struct; use net_traits::request::Referrer; -use script_traits::{ScopeThings, WorkerScriptLoadOrigin}; use servo_url::ServoUrl; use uuid::Uuid; diff --git a/components/script/dom/servointernals.rs b/components/script/dom/servointernals.rs index 87c0d246e6f..54516c9a5b0 100644 --- a/components/script/dom/servointernals.rs +++ b/components/script/dom/servointernals.rs @@ -4,12 +4,12 @@ use std::rc::Rc; +use constellation_traits::ScriptToConstellationMessage; use dom_struct::dom_struct; use js::rust::HandleObject; use profile_traits::mem::MemoryReportResult; use script_bindings::interfaces::ServoInternalsHelpers; use script_bindings::script_runtime::JSContext; -use script_traits::ScriptToConstellationMessage; use crate::dom::bindings::codegen::Bindings::ServoInternalsBinding::ServoInternalsMethods; use crate::dom::bindings::error::Error; diff --git a/components/script/dom/storage.rs b/components/script/dom/storage.rs index 03b59fb6c15..054e4ab5ac3 100644 --- a/components/script/dom/storage.rs +++ b/components/script/dom/storage.rs @@ -2,12 +2,12 @@ * 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/. */ +use constellation_traits::ScriptToConstellationMessage; use dom_struct::dom_struct; use ipc_channel::ipc::IpcSender; use net_traits::IpcSend; use net_traits::storage_thread::{StorageThreadMsg, StorageType}; use profile_traits::ipc; -use script_traits::ScriptToConstellationMessage; use servo_url::ServoUrl; use crate::dom::bindings::codegen::Bindings::StorageBinding::StorageMethods; diff --git a/components/script/dom/testbinding.rs b/components/script/dom/testbinding.rs index e54fea515a6..8c1b9994284 100644 --- a/components/script/dom/testbinding.rs +++ b/components/script/dom/testbinding.rs @@ -9,6 +9,7 @@ use std::ptr::{self, NonNull}; use std::rc::Rc; use std::time::Duration; +use constellation_traits::BlobImpl; use dom_struct::dom_struct; use js::jsapi::{Heap, JS_NewPlainObject, JSObject}; use js::jsval::JSVal; @@ -16,7 +17,6 @@ use js::rust::{CustomAutoRooterGuard, HandleObject, HandleValue, MutableHandleVa use js::typedarray::{self, Uint8ClampedArray}; use script_bindings::interfaces::TestBindingHelpers; use script_bindings::record::Record; -use script_traits::serializable::BlobImpl; use servo_config::prefs; use crate::dom::bindings::buffer_source::create_buffer_source; diff --git a/components/script/dom/webgpu/gpu.rs b/components/script/dom/webgpu/gpu.rs index e07224c8248..f02ae386772 100644 --- a/components/script/dom/webgpu/gpu.rs +++ b/components/script/dom/webgpu/gpu.rs @@ -4,9 +4,9 @@ use std::rc::Rc; +use constellation_traits::ScriptToConstellationMessage; use dom_struct::dom_struct; use js::jsapi::Heap; -use script_traits::ScriptToConstellationMessage; use webgpu_traits::WebGPUAdapterResponse; use wgpu_types::PowerPreference; diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index 4cfb143a10d..68e59384c60 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -6,6 +6,7 @@ use std::borrow::ToOwned; use std::cell::Cell; use std::ptr; +use constellation_traits::BlobImpl; use dom_struct::dom_struct; use ipc_channel::ipc::{self, IpcReceiver, IpcSender}; use ipc_channel::router::ROUTER; @@ -21,7 +22,6 @@ use net_traits::{ CoreResourceMsg, FetchChannels, MessageData, WebSocketDomAction, WebSocketNetworkEvent, }; use profile_traits::ipc as ProfiledIpc; -use script_traits::serializable::BlobImpl; use servo_url::{ImmutableOrigin, ServoUrl}; use crate::dom::bindings::cell::DomRefCell; diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index fc9c4bf88d2..c73caab123f 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -21,7 +21,10 @@ use base64::Engine; #[cfg(feature = "bluetooth")] use bluetooth_traits::BluetoothRequest; use canvas_traits::webgl::WebGLChan; -use constellation_traits::{ScrollState, WindowSizeType}; +use constellation_traits::{ + DocumentState, LoadData, LoadOrigin, NavigationHistoryBehavior, ScriptToConstellationChan, + ScriptToConstellationMessage, ScrollState, StructuredSerializedData, WindowSizeType, +}; use crossbeam_channel::{Sender, unbounded}; use cssparser::{Parser, ParserInput, SourceLocation}; use devtools_traits::{ScriptToDevtoolsControlMsg, TimelineMarker, TimelineMarkerType}; @@ -62,10 +65,7 @@ use script_layout_interface::{ FragmentType, Layout, PendingImageState, QueryMsg, Reflow, ReflowGoal, ReflowRequest, TrustedNodeAddress, combine_id_with_fragment_type, }; -use script_traits::{ - DocumentState, LoadData, LoadOrigin, NavigationHistoryBehavior, ScriptThreadMessage, - ScriptToConstellationChan, ScriptToConstellationMessage, StructuredSerializedData, -}; +use script_traits::ScriptThreadMessage; use selectors::attr::CaseSensitivity; use servo_arc::Arc as ServoArc; use servo_config::{opts, pref}; diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index f4e429ee731..e3fc81bf7ec 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -6,6 +6,10 @@ use std::cell::Cell; use std::ptr; use base::id::{BrowsingContextId, PipelineId, WebViewId}; +use constellation_traits::{ + AuxiliaryWebViewCreationRequest, LoadData, LoadOrigin, NavigationHistoryBehavior, + ScriptToConstellationMessage, +}; use dom_struct::dom_struct; use html5ever::local_name; use indexmap::map::IndexMap; @@ -29,10 +33,7 @@ use js::rust::wrappers::{JS_TransplantObject, NewWindowProxy, SetWindowProxy}; use js::rust::{Handle, MutableHandle, MutableHandleValue, get_object_class}; use malloc_size_of::{MallocSizeOf, MallocSizeOfOps}; use net_traits::request::Referrer; -use script_traits::{ - AuxiliaryWebViewCreationRequest, LoadData, LoadOrigin, NavigationHistoryBehavior, - NewLayoutInfo, ScriptToConstellationMessage, -}; +use script_traits::NewLayoutInfo; use serde::{Deserialize, Serialize}; use servo_url::{ImmutableOrigin, ServoUrl}; use style::attr::parse_integer; diff --git a/components/script/dom/worker.rs b/components/script/dom/worker.rs index 34fc30ce0e5..e07f88f5ec1 100644 --- a/components/script/dom/worker.rs +++ b/components/script/dom/worker.rs @@ -6,6 +6,7 @@ use std::cell::Cell; use std::sync::Arc; use std::sync::atomic::{AtomicBool, Ordering}; +use constellation_traits::{StructuredSerializedData, WorkerScriptLoadOrigin}; use crossbeam_channel::{Sender, unbounded}; use devtools_traits::{DevtoolsPageInfo, ScriptToDevtoolsControlMsg, WorkerId}; use dom_struct::dom_struct; @@ -14,7 +15,6 @@ use js::jsapi::{Heap, JSObject}; use js::jsval::UndefinedValue; use js::rust::{CustomAutoRooter, CustomAutoRooterGuard, HandleObject, HandleValue}; use net_traits::request::Referrer; -use script_traits::{StructuredSerializedData, WorkerScriptLoadOrigin}; use uuid::Uuid; use crate::dom::abstractworker::{SimpleWorkerErrorHandler, WorkerScriptMsg}; diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 7009f51e29a..a857b261cd0 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -11,6 +11,7 @@ use std::time::Duration; use base::cross_process_instant::CrossProcessInstant; use base::id::{PipelineId, PipelineNamespace}; +use constellation_traits::WorkerGlobalScopeInit; use crossbeam_channel::Receiver; use devtools_traits::{DevtoolScriptControlMsg, WorkerId}; use dom_struct::dom_struct; @@ -25,7 +26,6 @@ use net_traits::request::{ RequestBuilder as NetRequestInit, }; use profile_traits::mem::ProcessReports; -use script_traits::WorkerGlobalScopeInit; use servo_url::{MutableOrigin, ServoUrl}; use timers::TimerScheduler; use uuid::Uuid; diff --git a/components/script/dom/workletglobalscope.rs b/components/script/dom/workletglobalscope.rs index 23a3f3a6528..0196d6a83ea 100644 --- a/components/script/dom/workletglobalscope.rs +++ b/components/script/dom/workletglobalscope.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use base::id::PipelineId; +use constellation_traits::{ScriptToConstellationChan, ScriptToConstellationMessage}; use crossbeam_channel::Sender; use devtools_traits::ScriptToDevtoolsControlMsg; use dom_struct::dom_struct; @@ -14,7 +15,7 @@ use js::rust::Runtime; use net_traits::ResourceThreads; use net_traits::image_cache::ImageCache; use profile_traits::{mem, time}; -use script_traits::{Painter, ScriptToConstellationChan, ScriptToConstellationMessage}; +use script_traits::Painter; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; use stylo_atoms::Atom; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index aa634d61ccc..20e25415f98 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -10,6 +10,7 @@ use std::str::{self, FromStr}; use std::sync::{Arc, Mutex}; use std::time::{Duration, Instant}; +use constellation_traits::BlobImpl; use dom_struct::dom_struct; use encoding_rs::{Encoding, UTF_8}; use headers::{ContentLength, ContentType, HeaderMapExt}; @@ -31,7 +32,6 @@ use net_traits::{ ResourceFetchTiming, ResourceTimingType, trim_http_whitespace, }; use script_traits::DocumentActivity; -use script_traits::serializable::BlobImpl; use servo_url::ServoUrl; use stylo_atoms::Atom; use url::Position; diff --git a/components/script/drag_data_store.rs b/components/script/drag_data_store.rs index f0289f55e45..9eee9f25b63 100644 --- a/components/script/drag_data_store.rs +++ b/components/script/drag_data_store.rs @@ -4,9 +4,9 @@ use std::sync::Arc; +use constellation_traits::BlobImpl; use indexmap::IndexMap; use pixels::Image; -use script_traits::serializable::BlobImpl; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::root::DomRoot; diff --git a/components/script/iframe_collection.rs b/components/script/iframe_collection.rs index 01405881fa6..be0fd22e4ac 100644 --- a/components/script/iframe_collection.rs +++ b/components/script/iframe_collection.rs @@ -6,11 +6,10 @@ use std::cell::Cell; use std::default::Default; use base::id::BrowsingContextId; -use constellation_traits::WindowSizeType; +use constellation_traits::{IFrameSizeMsg, WindowSizeType}; use embedder_traits::ViewportDetails; use fnv::FnvHashMap; use script_layout_interface::IFrameSizes; -use script_traits::IFrameSizeMsg; use crate::dom::bindings::inheritance::Castable; use crate::dom::bindings::root::{Dom, DomRoot}; diff --git a/components/script/layout_dom/element.rs b/components/script/layout_dom/element.rs index 85c04039323..ce7ca96f464 100644 --- a/components/script/layout_dom/element.rs +++ b/components/script/layout_dom/element.rs @@ -7,7 +7,7 @@ use std::sync::atomic::Ordering; use std::{fmt, slice}; use atomic_refcell::{AtomicRef, AtomicRefMut}; -use constellation_traits::UntrustedNodeAddress; +use embedder_traits::UntrustedNodeAddress; use html5ever::{LocalName, Namespace, local_name, namespace_url, ns}; use js::jsapi::JSObject; use script_layout_interface::wrapper_traits::{ diff --git a/components/script/links.rs b/components/script/links.rs index 55c7435cdb9..f7094adbfde 100644 --- a/components/script/links.rs +++ b/components/script/links.rs @@ -4,10 +4,10 @@ //! Defines shared hyperlink behaviour for `<link>`, `<a>`, `<area>` and `<form>` elements. +use constellation_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior}; use html5ever::{local_name, namespace_url, ns}; use malloc_size_of::malloc_size_of_is_0; use net_traits::request::Referrer; -use script_traits::{LoadData, LoadOrigin, NavigationHistoryBehavior}; use style::str::HTML_SPACE_CHARACTERS; use crate::dom::bindings::codegen::Bindings::AttrBinding::Attr_Binding::AttrMethods; diff --git a/components/script/messaging.rs b/components/script/messaging.rs index 48196669211..808b338e709 100644 --- a/components/script/messaging.rs +++ b/components/script/messaging.rs @@ -11,6 +11,7 @@ use std::result::Result; use base::id::PipelineId; #[cfg(feature = "bluetooth")] use bluetooth_traits::BluetoothRequest; +use constellation_traits::ScriptToConstellationMessage; use crossbeam_channel::{Receiver, SendError, Sender, select}; use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg}; use ipc_channel::ipc::IpcSender; @@ -18,7 +19,7 @@ use net_traits::FetchResponseMsg; use net_traits::image_cache::PendingImageResponse; use profile_traits::mem::{self as profile_mem, OpaqueSender, ReportsChan}; use profile_traits::time::{self as profile_time}; -use script_traits::{Painter, ScriptThreadMessage, ScriptToConstellationMessage}; +use script_traits::{Painter, ScriptThreadMessage}; use stylo_atoms::Atom; use timers::TimerScheduler; #[cfg(feature = "webgpu")] diff --git a/components/script/navigation.rs b/components/script/navigation.rs index 4a960299813..5aa71abb74a 100644 --- a/components/script/navigation.rs +++ b/components/script/navigation.rs @@ -10,6 +10,7 @@ use std::cell::Cell; use base::cross_process_instant::CrossProcessInstant; use base::id::{BrowsingContextId, PipelineId, WebViewId}; +use constellation_traits::LoadData; use content_security_policy::Destination; use crossbeam_channel::Sender; use embedder_traits::ViewportDetails; @@ -22,7 +23,7 @@ use net_traits::{ BoxedFetchCallback, CoreResourceThread, DOCUMENT_ACCEPT_HEADER_VALUE, FetchResponseMsg, Metadata, fetch_async, set_default_accept_language, }; -use script_traits::{DocumentActivity, LoadData}; +use script_traits::DocumentActivity; use servo_url::{MutableOrigin, ServoUrl}; use crate::fetch::FetchCanceller; diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 33f07f98b41..adf28bb7090 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -36,7 +36,10 @@ use base::cross_process_instant::CrossProcessInstant; use base::id::{BrowsingContextId, HistoryStateId, PipelineId, PipelineNamespace, WebViewId}; use canvas_traits::webgl::WebGLPipeline; use chrono::{DateTime, Local}; -use constellation_traits::{CompositorHitTestResult, ScrollState, WindowSizeType}; +use constellation_traits::{ + JsEvalResult, LoadData, LoadOrigin, NavigationHistoryBehavior, ScriptToConstellationChan, + ScriptToConstellationMessage, ScrollState, StructuredSerializedData, WindowSizeType, +}; use crossbeam_channel::unbounded; use devtools_traits::{ CSSError, DevtoolScriptControlMsg, DevtoolsPageInfo, NavigationState, @@ -44,7 +47,8 @@ use devtools_traits::{ }; use embedder_traits::user_content_manager::UserContentManager; use embedder_traits::{ - EmbedderMsg, InputEvent, MediaSessionActionType, Theme, ViewportDetails, WebDriverScriptCommand, + CompositorHitTestResult, EmbedderMsg, InputEvent, MediaSessionActionType, Theme, + ViewportDetails, WebDriverScriptCommand, }; use euclid::default::Rect; use fonts::{FontContext, SystemFontServiceProxy}; @@ -79,9 +83,7 @@ use script_layout_interface::{ }; use script_traits::{ ConstellationInputEvent, DiscardBrowsingContext, DocumentActivity, InitialScriptState, - JsEvalResult, LoadData, LoadOrigin, NavigationHistoryBehavior, NewLayoutInfo, Painter, - ProgressiveWebMetricType, ScriptThreadMessage, ScriptToConstellationChan, - ScriptToConstellationMessage, StructuredSerializedData, UpdatePipelineIdReason, + NewLayoutInfo, Painter, ProgressiveWebMetricType, ScriptThreadMessage, UpdatePipelineIdReason, }; use servo_config::opts; use servo_url::{ImmutableOrigin, MutableOrigin, ServoUrl}; @@ -1092,12 +1094,12 @@ impl ScriptThread { { let sequence_id = touch_event.expect_sequence_id(); let result = if handled { - script_traits::TouchEventResult::DefaultAllowed( + embedder_traits::TouchEventResult::DefaultAllowed( sequence_id, touch_event.event_type, ) } else { - script_traits::TouchEventResult::DefaultPrevented( + embedder_traits::TouchEventResult::DefaultPrevented( sequence_id, touch_event.event_type, ) diff --git a/components/script/serviceworker_manager.rs b/components/script/serviceworker_manager.rs index d4089714031..a2ac034f662 100644 --- a/components/script/serviceworker_manager.rs +++ b/components/script/serviceworker_manager.rs @@ -13,14 +13,14 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::thread::{self, JoinHandle}; use base::id::{PipelineNamespace, ServiceWorkerId, ServiceWorkerRegistrationId}; +use constellation_traits::{ + DOMMessage, Job, JobError, JobResult, JobResultValue, JobType, SWManagerMsg, SWManagerSenders, + ScopeThings, ServiceWorkerManagerFactory, ServiceWorkerMsg, +}; use crossbeam_channel::{Receiver, RecvError, Sender, select, unbounded}; use ipc_channel::ipc::{self, IpcSender}; use ipc_channel::router::ROUTER; use net_traits::{CoreResourceMsg, CustomResponseMediator}; -use script_traits::{ - DOMMessage, Job, JobError, JobResult, JobResultValue, JobType, SWManagerMsg, SWManagerSenders, - ScopeThings, ServiceWorkerManagerFactory, ServiceWorkerMsg, -}; use servo_config::pref; use servo_url::{ImmutableOrigin, ServoUrl}; diff --git a/components/servo/Cargo.toml b/components/servo/Cargo.toml index 31cdd44aac6..d72665f9c4c 100644 --- a/components/servo/Cargo.toml +++ b/components/servo/Cargo.toml @@ -17,6 +17,7 @@ bluetooth = [ "bluetooth_traits", "dep:bluetooth", "constellation/bluetooth", + "constellation_traits/bluetooth", "script/bluetooth", "script_traits/bluetooth", ] @@ -52,6 +53,7 @@ webxr = [ webgpu = [ "script/webgpu", "constellation/webgpu", + "constellation_traits/webgpu", ] [dependencies] diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 5a87bde3dc0..085a70edae2 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -58,7 +58,7 @@ use constellation::{ Constellation, FromEmbedderLogger, FromScriptLogger, InitialConstellationState, UnprivilegedContent, }; -use constellation_traits::EmbedderToConstellationMessage; +use constellation_traits::{EmbedderToConstellationMessage, ScriptToConstellationChan}; use crossbeam_channel::{Receiver, Sender, unbounded}; use embedder_traits::user_content_manager::UserContentManager; pub use embedder_traits::*; @@ -85,7 +85,6 @@ use net::resource_thread::new_resource_threads; use profile::{mem as profile_mem, time as profile_time}; use profile_traits::{mem, time}; use script::{JSEngineSetup, ServiceWorkerManager}; -use script_traits::ScriptToConstellationChan; use servo_config::opts::Opts; use servo_config::prefs::Preferences; use servo_config::{opts, pref, prefs}; diff --git a/components/shared/compositing/lib.rs b/components/shared/compositing/lib.rs index 738619ffc31..9c13afb8dc3 100644 --- a/components/shared/compositing/lib.rs +++ b/components/shared/compositing/lib.rs @@ -8,12 +8,13 @@ use std::fmt::{Debug, Error, Formatter}; use base::id::{PipelineId, WebViewId}; use crossbeam_channel::{Receiver, Sender}; -use embedder_traits::{EventLoopWaker, MouseButton, MouseButtonAction}; +use embedder_traits::{ + AnimationState, EventLoopWaker, MouseButton, MouseButtonAction, TouchEventResult, +}; use euclid::Rect; use ipc_channel::ipc::IpcSender; use log::warn; use pixels::Image; -use script_traits::{AnimationState, TouchEventResult}; use strum_macros::IntoStaticStr; use style_traits::CSSPixel; use webrender_api::DocumentId; diff --git a/components/shared/constellation/Cargo.toml b/components/shared/constellation/Cargo.toml index 10ee64d0b42..53a4307df60 100644 --- a/components/shared/constellation/Cargo.toml +++ b/components/shared/constellation/Cargo.toml @@ -11,16 +11,30 @@ rust-version.workspace = true name = "constellation_traits" path = "lib.rs" +[features] +bluetooth = [] +webgpu = ["wgpu-core"] + [dependencies] base = { workspace = true } bitflags = { workspace = true } +canvas_traits = { workspace = true } +devtools_traits = { workspace = true } embedder_traits = { workspace = true } euclid = { workspace = true } +http = { workspace = true } +hyper_serde = { workspace = true } ipc-channel = { workspace = true } +log = { workspace = true } malloc_size_of = { workspace = true } malloc_size_of_derive = { workspace = true } +net_traits = { workspace = true } +profile_traits = { workspace = true } serde = { workspace = true } servo_url = { path = "../../url" } +strum = { workspace = true } strum_macros = { workspace = true } -stylo_traits = { workspace = true } +uuid = { workspace = true } +webgpu_traits = { workspace = true } webrender_api = { workspace = true } +wgpu-core = { workspace = true, optional = true } diff --git a/components/shared/script/script_msg.rs b/components/shared/constellation/from_script_message.rs index 30244c9b46a..bccb3059e24 100644 --- a/components/shared/script/script_msg.rs +++ b/components/shared/constellation/from_script_message.rs @@ -2,6 +2,8 @@ * 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/. */ +//! Messages send from the ScriptThread to the Constellation. + use std::collections::{HashMap, VecDeque}; use std::fmt; @@ -11,15 +13,19 @@ use base::id::{ MessagePortRouterId, PipelineId, ServiceWorkerId, ServiceWorkerRegistrationId, WebViewId, }; use canvas_traits::canvas::{CanvasId, CanvasMsg}; -use constellation_traits::{LogEntry, TraversalDirection}; -use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId}; +use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId}; use embedder_traits::{ - EmbedderMsg, MediaSessionEvent, TouchEventType, TouchSequenceId, ViewportDetails, + AnimationState, EmbedderMsg, MediaSessionEvent, TouchEventResult, ViewportDetails, }; use euclid::default::Size2D as UntypedSize2D; +use http::{HeaderMap, Method}; +use ipc_channel::Error as IpcError; use ipc_channel::ipc::{IpcReceiver, IpcSender}; -use net_traits::CoreResourceMsg; +use net_traits::request::{InsecureRequestsPolicy, Referrer, RequestBody}; use net_traits::storage_thread::StorageType; +use net_traits::{CoreResourceMsg, ReferrerPolicy, ResourceThreads}; +use profile_traits::mem::MemoryReportResult; +use profile_traits::{mem, time as profile_time}; use serde::{Deserialize, Serialize}; use servo_url::{ImmutableOrigin, ServoUrl}; use strum_macros::IntoStaticStr; @@ -27,12 +33,420 @@ use strum_macros::IntoStaticStr; use webgpu_traits::{WebGPU, WebGPUAdapterResponse}; use webrender_api::ImageKey; -use crate::mem::MemoryReportResult; -use crate::{ - AnimationState, AuxiliaryWebViewCreationRequest, BroadcastMsg, DocumentState, - IFrameLoadInfoWithData, LoadData, MessagePortMsg, NavigationHistoryBehavior, PortMessageTask, - StructuredSerializedData, WindowSizeType, WorkerGlobalScopeInit, WorkerScriptLoadOrigin, +use crate::message_port::{ + BroadcastMsg, MessagePortMsg, PortMessageTask, StructuredSerializedData, }; +use crate::{LogEntry, TraversalDirection, WindowSizeType}; + +/// A Script to Constellation channel. +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ScriptToConstellationChan { + /// Sender for communicating with constellation thread. + pub sender: IpcSender<(PipelineId, ScriptToConstellationMessage)>, + /// Used to identify the origin of the message. + pub pipeline_id: PipelineId, +} + +impl ScriptToConstellationChan { + /// Send ScriptMsg and attach the pipeline_id to the message. + pub fn send(&self, msg: ScriptToConstellationMessage) -> Result<(), IpcError> { + self.sender.send((self.pipeline_id, msg)) + } +} + +/// The origin where a given load was initiated. +/// Useful for origin checks, for example before evaluation a JS URL. +#[derive(Clone, Debug, Deserialize, Serialize)] +pub enum LoadOrigin { + /// A load originating in the constellation. + Constellation, + /// A load originating in webdriver. + WebDriver, + /// A load originating in script. + Script(ImmutableOrigin), +} + +/// can be passed to `LoadUrl` to load a page with GET/POST +/// parameters or headers +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct LoadData { + /// The origin where the load started. + pub load_origin: LoadOrigin, + /// The URL. + pub url: ServoUrl, + /// The creator pipeline id if this is an about:blank load. + pub creator_pipeline_id: Option<PipelineId>, + /// The method. + #[serde( + deserialize_with = "::hyper_serde::deserialize", + serialize_with = "::hyper_serde::serialize" + )] + pub method: Method, + /// The headers. + #[serde( + deserialize_with = "::hyper_serde::deserialize", + serialize_with = "::hyper_serde::serialize" + )] + pub headers: HeaderMap, + /// The data that will be used as the body of the request. + pub data: Option<RequestBody>, + /// The result of evaluating a javascript scheme url. + pub js_eval_result: Option<JsEvalResult>, + /// The referrer. + pub referrer: Referrer, + /// The referrer policy. + pub referrer_policy: ReferrerPolicy, + + /// The source to use instead of a network response for a srcdoc document. + pub srcdoc: String, + /// The inherited context is Secure, None if not inherited + pub inherited_secure_context: Option<bool>, + /// The inherited policy for upgrading insecure requests; None if not inherited. + pub inherited_insecure_requests_policy: Option<InsecureRequestsPolicy>, + /// Whether the page's ancestors have potentially trustworthy origin + pub has_trustworthy_ancestor_origin: bool, + /// Servo internal: if crash details are present, trigger a crash error page with these details. + pub crash: Option<String>, +} + +/// The result of evaluating a javascript scheme url. +#[derive(Clone, Debug, Deserialize, Serialize)] +pub enum JsEvalResult { + /// The js evaluation had a non-string result, 204 status code. + /// <https://html.spec.whatwg.org/multipage/#navigate> 12.11 + NoContent, + /// The js evaluation had a string result. + Ok(Vec<u8>), +} + +impl LoadData { + /// Create a new `LoadData` object. + #[allow(clippy::too_many_arguments)] + pub fn new( + load_origin: LoadOrigin, + url: ServoUrl, + creator_pipeline_id: Option<PipelineId>, + referrer: Referrer, + referrer_policy: ReferrerPolicy, + inherited_secure_context: Option<bool>, + inherited_insecure_requests_policy: Option<InsecureRequestsPolicy>, + has_trustworthy_ancestor_origin: bool, + ) -> LoadData { + LoadData { + load_origin, + url, + creator_pipeline_id, + method: Method::GET, + headers: HeaderMap::new(), + data: None, + js_eval_result: None, + referrer, + referrer_policy, + srcdoc: "".to_string(), + inherited_secure_context, + crash: None, + inherited_insecure_requests_policy, + has_trustworthy_ancestor_origin, + } + } +} + +/// <https://html.spec.whatwg.org/multipage/#navigation-supporting-concepts:navigationhistorybehavior> +#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] +pub enum NavigationHistoryBehavior { + /// The default value, which will be converted very early in the navigate algorithm into "push" + /// or "replace". Usually it becomes "push", but under certain circumstances it becomes + /// "replace" instead. + #[default] + Auto, + /// A regular navigation which adds a new session history entry, and will clear the forward + /// session history. + Push, + /// A navigation that will replace the active session history entry. + Replace, +} + +/// Entities required to spawn service workers +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct ScopeThings { + /// script resource url + pub script_url: ServoUrl, + /// network load origin of the resource + pub worker_load_origin: WorkerScriptLoadOrigin, + /// base resources required to create worker global scopes + pub init: WorkerGlobalScopeInit, + /// the port to receive devtools message from + pub devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>, + /// service worker id + pub worker_id: WorkerId, +} + +/// Message that gets passed to service worker scope on postMessage +#[derive(Debug, Deserialize, Serialize)] +pub struct DOMMessage { + /// The origin of the message + pub origin: ImmutableOrigin, + /// The payload of the message + pub data: StructuredSerializedData, +} + +/// Channels to allow service worker manager to communicate with constellation and resource thread +#[derive(Deserialize, Serialize)] +pub struct SWManagerSenders { + /// Sender of messages to the constellation. + pub swmanager_sender: IpcSender<SWManagerMsg>, + /// Sender for communicating with resource thread. + pub resource_sender: IpcSender<CoreResourceMsg>, + /// Sender of messages to the manager. + pub own_sender: IpcSender<ServiceWorkerMsg>, + /// Receiver of messages from the constellation. + pub receiver: IpcReceiver<ServiceWorkerMsg>, +} + +/// Messages sent to Service Worker Manager thread +#[derive(Debug, Deserialize, Serialize)] +pub enum ServiceWorkerMsg { + /// Timeout message sent by active service workers + Timeout(ServoUrl), + /// Message sent by constellation to forward to a running service worker + ForwardDOMMessage(DOMMessage, ServoUrl), + /// <https://w3c.github.io/ServiceWorker/#schedule-job-algorithm> + ScheduleJob(Job), + /// Exit the service worker manager + Exit, +} + +#[derive(Debug, Deserialize, PartialEq, Serialize)] +/// <https://w3c.github.io/ServiceWorker/#dfn-job-type> +pub enum JobType { + /// <https://w3c.github.io/ServiceWorker/#register> + Register, + /// <https://w3c.github.io/ServiceWorker/#unregister-algorithm> + Unregister, + /// <https://w3c.github.io/ServiceWorker/#update-algorithm> + Update, +} + +#[derive(Debug, Deserialize, Serialize)] +/// The kind of error the job promise should be rejected with. +pub enum JobError { + /// <https://w3c.github.io/ServiceWorker/#reject-job-promise> + TypeError, + /// <https://w3c.github.io/ServiceWorker/#reject-job-promise> + SecurityError, +} + +#[derive(Debug, Deserialize, Serialize)] +#[allow(clippy::large_enum_variant)] +/// Messages sent from Job algorithms steps running in the SW manager, +/// in order to resolve or reject the job promise. +pub enum JobResult { + /// <https://w3c.github.io/ServiceWorker/#reject-job-promise> + RejectPromise(JobError), + /// <https://w3c.github.io/ServiceWorker/#resolve-job-promise> + ResolvePromise(Job, JobResultValue), +} + +#[derive(Debug, Deserialize, Serialize)] +/// Jobs are resolved with the help of various values. +pub enum JobResultValue { + /// Data representing a serviceworker registration. + Registration { + /// The Id of the registration. + id: ServiceWorkerRegistrationId, + /// The installing worker, if any. + installing_worker: Option<ServiceWorkerId>, + /// The waiting worker, if any. + waiting_worker: Option<ServiceWorkerId>, + /// The active worker, if any. + active_worker: Option<ServiceWorkerId>, + }, +} + +#[derive(Debug, Deserialize, Serialize)] +/// <https://w3c.github.io/ServiceWorker/#dfn-job> +pub struct Job { + /// <https://w3c.github.io/ServiceWorker/#dfn-job-type> + pub job_type: JobType, + /// <https://w3c.github.io/ServiceWorker/#dfn-job-scope-url> + pub scope_url: ServoUrl, + /// <https://w3c.github.io/ServiceWorker/#dfn-job-script-url> + pub script_url: ServoUrl, + /// <https://w3c.github.io/ServiceWorker/#dfn-job-client> + pub client: IpcSender<JobResult>, + /// <https://w3c.github.io/ServiceWorker/#job-referrer> + pub referrer: ServoUrl, + /// Various data needed to process job. + pub scope_things: Option<ScopeThings>, +} + +impl Job { + /// <https://w3c.github.io/ServiceWorker/#create-job-algorithm> + pub fn create_job( + job_type: JobType, + scope_url: ServoUrl, + script_url: ServoUrl, + client: IpcSender<JobResult>, + referrer: ServoUrl, + scope_things: Option<ScopeThings>, + ) -> Job { + Job { + job_type, + scope_url, + script_url, + client, + referrer, + scope_things, + } + } +} + +impl PartialEq for Job { + /// Equality criteria as described in <https://w3c.github.io/ServiceWorker/#dfn-job-equivalent> + fn eq(&self, other: &Self) -> bool { + // TODO: match on job type, take worker type and `update_via_cache_mode` into account. + let same_job = self.job_type == other.job_type; + if same_job { + match self.job_type { + JobType::Register | JobType::Update => { + self.scope_url == other.scope_url && self.script_url == other.script_url + }, + JobType::Unregister => self.scope_url == other.scope_url, + } + } else { + false + } + } +} + +/// Messages outgoing from the Service Worker Manager thread to constellation +#[derive(Debug, Deserialize, Serialize)] +pub enum SWManagerMsg { + /// Placeholder to keep the enum, + /// as it will be needed when implementing + /// <https://github.com/servo/servo/issues/24660> + PostMessageToClient, +} + +/// Used to determine if a script has any pending asynchronous activity. +#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)] +pub enum DocumentState { + /// The document has been loaded and is idle. + Idle, + /// The document is either loading or waiting on an event. + Pending, +} + +/// This trait allows creating a `ServiceWorkerManager` without depending on the `script` +/// crate. +pub trait ServiceWorkerManagerFactory { + /// Create a `ServiceWorkerManager`. + fn create(sw_senders: SWManagerSenders, origin: ImmutableOrigin); +} + +/// Whether the sandbox attribute is present for an iframe element +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +pub enum IFrameSandboxState { + /// Sandbox attribute is present + IFrameSandboxed, + /// Sandbox attribute is not present + IFrameUnsandboxed, +} + +/// Specifies the information required to load an auxiliary browsing context. +#[derive(Debug, Deserialize, Serialize)] +pub struct AuxiliaryWebViewCreationRequest { + /// Load data containing the url to load + pub load_data: LoadData, + /// The webview that caused this request. + pub opener_webview_id: WebViewId, + /// The pipeline opener browsing context. + pub opener_pipeline_id: PipelineId, + /// Sender for the constellation’s response to our request. + pub response_sender: IpcSender<Option<AuxiliaryWebViewCreationResponse>>, +} + +/// Constellation’s response to auxiliary browsing context creation requests. +#[derive(Debug, Deserialize, Serialize)] +pub struct AuxiliaryWebViewCreationResponse { + /// The new webview ID. + pub new_webview_id: WebViewId, + /// The new pipeline ID. + pub new_pipeline_id: PipelineId, +} + +/// Specifies the information required to load an iframe. +#[derive(Debug, Deserialize, Serialize)] +pub struct IFrameLoadInfo { + /// Pipeline ID of the parent of this iframe + pub parent_pipeline_id: PipelineId, + /// The ID for this iframe's nested browsing context. + pub browsing_context_id: BrowsingContextId, + /// The ID for the top-level ancestor browsing context of this iframe's nested browsing context. + pub webview_id: WebViewId, + /// The new pipeline ID that the iframe has generated. + pub new_pipeline_id: PipelineId, + /// Whether this iframe should be considered private + pub is_private: bool, + /// Whether this iframe should be considered secure + pub inherited_secure_context: Option<bool>, + /// Whether this load should replace the current entry (reload). If true, the current + /// entry will be replaced instead of a new entry being added. + pub history_handling: NavigationHistoryBehavior, +} + +/// Specifies the information required to load a URL in an iframe. +#[derive(Debug, Deserialize, Serialize)] +pub struct IFrameLoadInfoWithData { + /// The information required to load an iframe. + pub info: IFrameLoadInfo, + /// Load data containing the url to load + pub load_data: LoadData, + /// The old pipeline ID for this iframe, if a page was previously loaded. + pub old_pipeline_id: Option<PipelineId>, + /// Sandbox type of this iframe + pub sandbox: IFrameSandboxState, + /// The initial viewport size for this iframe. + pub viewport_details: ViewportDetails, +} + +/// Resources required by workerglobalscopes +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct WorkerGlobalScopeInit { + /// Chan to a resource thread + pub resource_threads: ResourceThreads, + /// Chan to the memory profiler + pub mem_profiler_chan: mem::ProfilerChan, + /// Chan to the time profiler + pub time_profiler_chan: profile_time::ProfilerChan, + /// To devtools sender + pub to_devtools_sender: Option<IpcSender<ScriptToDevtoolsControlMsg>>, + /// From devtools sender + pub from_devtools_sender: Option<IpcSender<DevtoolScriptControlMsg>>, + /// Messages to send to constellation + pub script_to_constellation_chan: ScriptToConstellationChan, + /// The worker id + pub worker_id: WorkerId, + /// The pipeline id + pub pipeline_id: PipelineId, + /// The origin + pub origin: ImmutableOrigin, + /// The creation URL + pub creation_url: Option<ServoUrl>, + /// True if secure context + pub inherited_secure_context: Option<bool>, +} + +/// Common entities representing a network load origin +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct WorkerScriptLoadOrigin { + /// referrer url + pub referrer_url: Option<ServoUrl>, + /// the referrer policy which is used + pub referrer_policy: ReferrerPolicy, + /// the pipeline id of the entity requesting the load + pub pipeline_id: PipelineId, +} /// An iframe sizing operation. #[derive(Clone, Copy, Debug, Deserialize, Serialize)] @@ -45,16 +459,7 @@ pub struct IFrameSizeMsg { pub type_: WindowSizeType, } -/// Whether the default action for a touch event was prevented by web content -#[derive(Debug, Deserialize, Serialize)] -pub enum TouchEventResult { - /// Allowed by web content - DefaultAllowed(TouchSequenceId, TouchEventType), - /// Prevented by web content - DefaultPrevented(TouchSequenceId, TouchEventType), -} - -/// Messages sent from the `ScriptThread` to the `Constellation`. +/// Messages from the script to the constellation. #[derive(Deserialize, IntoStaticStr, Serialize)] pub enum ScriptToConstellationMessage { /// Request to complete the transfer of a set of ports to a router. @@ -225,165 +630,3 @@ impl fmt::Debug for ScriptToConstellationMessage { write!(formatter, "ScriptMsg::{variant_string}") } } - -/// Entities required to spawn service workers -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ScopeThings { - /// script resource url - pub script_url: ServoUrl, - /// network load origin of the resource - pub worker_load_origin: WorkerScriptLoadOrigin, - /// base resources required to create worker global scopes - pub init: WorkerGlobalScopeInit, - /// the port to receive devtools message from - pub devtools_chan: Option<IpcSender<ScriptToDevtoolsControlMsg>>, - /// service worker id - pub worker_id: WorkerId, -} - -/// Message that gets passed to service worker scope on postMessage -#[derive(Debug, Deserialize, Serialize)] -pub struct DOMMessage { - /// The origin of the message - pub origin: ImmutableOrigin, - /// The payload of the message - pub data: StructuredSerializedData, -} - -/// Channels to allow service worker manager to communicate with constellation and resource thread -#[derive(Deserialize, Serialize)] -pub struct SWManagerSenders { - /// Sender of messages to the constellation. - pub swmanager_sender: IpcSender<SWManagerMsg>, - /// Sender for communicating with resource thread. - pub resource_sender: IpcSender<CoreResourceMsg>, - /// Sender of messages to the manager. - pub own_sender: IpcSender<ServiceWorkerMsg>, - /// Receiver of messages from the constellation. - pub receiver: IpcReceiver<ServiceWorkerMsg>, -} - -/// Messages sent to Service Worker Manager thread -#[derive(Debug, Deserialize, Serialize)] -pub enum ServiceWorkerMsg { - /// Timeout message sent by active service workers - Timeout(ServoUrl), - /// Message sent by constellation to forward to a running service worker - ForwardDOMMessage(DOMMessage, ServoUrl), - /// <https://w3c.github.io/ServiceWorker/#schedule-job-algorithm> - ScheduleJob(Job), - /// Exit the service worker manager - Exit, -} - -#[derive(Debug, Deserialize, PartialEq, Serialize)] -/// <https://w3c.github.io/ServiceWorker/#dfn-job-type> -pub enum JobType { - /// <https://w3c.github.io/ServiceWorker/#register> - Register, - /// <https://w3c.github.io/ServiceWorker/#unregister-algorithm> - Unregister, - /// <https://w3c.github.io/ServiceWorker/#update-algorithm> - Update, -} - -#[derive(Debug, Deserialize, Serialize)] -/// The kind of error the job promise should be rejected with. -pub enum JobError { - /// <https://w3c.github.io/ServiceWorker/#reject-job-promise> - TypeError, - /// <https://w3c.github.io/ServiceWorker/#reject-job-promise> - SecurityError, -} - -#[derive(Debug, Deserialize, Serialize)] -#[allow(clippy::large_enum_variant)] -/// Messages sent from Job algorithms steps running in the SW manager, -/// in order to resolve or reject the job promise. -pub enum JobResult { - /// <https://w3c.github.io/ServiceWorker/#reject-job-promise> - RejectPromise(JobError), - /// <https://w3c.github.io/ServiceWorker/#resolve-job-promise> - ResolvePromise(Job, JobResultValue), -} - -#[derive(Debug, Deserialize, Serialize)] -/// Jobs are resolved with the help of various values. -pub enum JobResultValue { - /// Data representing a serviceworker registration. - Registration { - /// The Id of the registration. - id: ServiceWorkerRegistrationId, - /// The installing worker, if any. - installing_worker: Option<ServiceWorkerId>, - /// The waiting worker, if any. - waiting_worker: Option<ServiceWorkerId>, - /// The active worker, if any. - active_worker: Option<ServiceWorkerId>, - }, -} - -#[derive(Debug, Deserialize, Serialize)] -/// <https://w3c.github.io/ServiceWorker/#dfn-job> -pub struct Job { - /// <https://w3c.github.io/ServiceWorker/#dfn-job-type> - pub job_type: JobType, - /// <https://w3c.github.io/ServiceWorker/#dfn-job-scope-url> - pub scope_url: ServoUrl, - /// <https://w3c.github.io/ServiceWorker/#dfn-job-script-url> - pub script_url: ServoUrl, - /// <https://w3c.github.io/ServiceWorker/#dfn-job-client> - pub client: IpcSender<JobResult>, - /// <https://w3c.github.io/ServiceWorker/#job-referrer> - pub referrer: ServoUrl, - /// Various data needed to process job. - pub scope_things: Option<ScopeThings>, -} - -impl Job { - /// <https://w3c.github.io/ServiceWorker/#create-job-algorithm> - pub fn create_job( - job_type: JobType, - scope_url: ServoUrl, - script_url: ServoUrl, - client: IpcSender<JobResult>, - referrer: ServoUrl, - scope_things: Option<ScopeThings>, - ) -> Job { - Job { - job_type, - scope_url, - script_url, - client, - referrer, - scope_things, - } - } -} - -impl PartialEq for Job { - /// Equality criteria as described in <https://w3c.github.io/ServiceWorker/#dfn-job-equivalent> - fn eq(&self, other: &Self) -> bool { - // TODO: match on job type, take worker type and `update_via_cache_mode` into account. - let same_job = self.job_type == other.job_type; - if same_job { - match self.job_type { - JobType::Register | JobType::Update => { - self.scope_url == other.scope_url && self.script_url == other.script_url - }, - JobType::Unregister => self.scope_url == other.scope_url, - } - } else { - false - } - } -} - -/// Messages outgoing from the Service Worker Manager thread to constellation -#[derive(Debug, Deserialize, Serialize)] -pub enum SWManagerMsg { - /// Placeholder to keep the enum, - /// as it will be needed when implementing - /// <https://github.com/servo/servo/issues/24660> - PostMessageToClient, -} diff --git a/components/shared/constellation/lib.rs b/components/shared/constellation/lib.rs index 22de84c4711..627741a40fb 100644 --- a/components/shared/constellation/lib.rs +++ b/components/shared/constellation/lib.rs @@ -8,23 +8,27 @@ //! embedding/rendering layer all the way to script, thus it should have very minimal dependencies //! on other parts of Servo. +mod from_script_message; +mod message_port; + use std::collections::HashMap; -use std::ffi::c_void; use std::fmt; use std::time::Duration; use base::Epoch; use base::cross_process_instant::CrossProcessInstant; -use base::id::{PipelineId, ScrollTreeNodeId, WebViewId}; +use base::id::{PipelineId, WebViewId}; use bitflags::bitflags; use embedder_traits::{ - Cursor, InputEvent, MediaSessionActionType, Theme, ViewportDetails, WebDriverCommandMsg, + CompositorHitTestResult, Cursor, InputEvent, MediaSessionActionType, Theme, ViewportDetails, + WebDriverCommandMsg, }; use euclid::Vector2D; +pub use from_script_message::*; use ipc_channel::ipc::IpcSender; -use malloc_size_of::malloc_size_of_is_0; use malloc_size_of_derive::MallocSizeOf; -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +pub use message_port::*; +use serde::{Deserialize, Serialize}; use servo_url::ServoUrl; use strum_macros::IntoStaticStr; use webrender_api::ExternalScrollId; @@ -137,28 +141,6 @@ bitflags! { } } -/// The result of a hit test in the compositor. -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct CompositorHitTestResult { - /// The pipeline id of the resulting item. - pub pipeline_id: PipelineId, - - /// The hit test point in the item's viewport. - pub point_in_viewport: euclid::default::Point2D<f32>, - - /// The hit test point relative to the item itself. - pub point_relative_to_item: euclid::default::Point2D<f32>, - - /// The node address of the hit test result. - pub node: UntrustedNodeAddress, - - /// The cursor that should be used when hovering the item hit by the hit test. - pub cursor: Option<Cursor>, - - /// The scroll tree node associated with this hit test item. - pub scroll_tree_node: ScrollTreeNodeId, -} - /// The scroll state of a stacking context. #[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)] pub struct ScrollState { @@ -168,43 +150,6 @@ pub struct ScrollState { pub scroll_offset: Vector2D<f32, LayoutPixel>, } -/// The address of a node. Layout sends these back. They must be validated via -/// `from_untrusted_node_address` before they can be used, because we do not trust layout. -#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] -pub struct UntrustedNodeAddress(pub *const c_void); - -malloc_size_of_is_0!(UntrustedNodeAddress); - -#[allow(unsafe_code)] -unsafe impl Send for UntrustedNodeAddress {} - -impl From<style_traits::dom::OpaqueNode> for UntrustedNodeAddress { - fn from(o: style_traits::dom::OpaqueNode) -> Self { - UntrustedNodeAddress(o.0 as *const c_void) - } -} - -impl Serialize for UntrustedNodeAddress { - fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> { - (self.0 as usize).serialize(s) - } -} - -impl<'de> Deserialize<'de> for UntrustedNodeAddress { - fn deserialize<D: Deserializer<'de>>(d: D) -> Result<UntrustedNodeAddress, D::Error> { - let value: usize = Deserialize::deserialize(d)?; - Ok(UntrustedNodeAddress::from_id(value)) - } -} - -impl UntrustedNodeAddress { - /// Creates an `UntrustedNodeAddress` from the given pointer address value. - #[inline] - pub fn from_id(id: usize) -> UntrustedNodeAddress { - UntrustedNodeAddress(id as *const c_void) - } -} - /// The direction of a history traversal #[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] pub enum TraversalDirection { diff --git a/components/shared/constellation/message_port.rs b/components/shared/constellation/message_port.rs new file mode 100644 index 00000000000..36c6213bf80 --- /dev/null +++ b/components/shared/constellation/message_port.rs @@ -0,0 +1,525 @@ +/* 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/. */ + +//! This module contains data structures used for message ports and serializing +//! DOM objects to send across them as per +//! <https://html.spec.whatwg.org/multipage/#serializable-objects>. +//! The implementations are here instead of in `script``, because these +//! types can be sent through the Constellation to other ScriptThreads, +//! and Constellation cannot depend directly on `script`. + +use std::cell::RefCell; +use std::collections::{HashMap, VecDeque}; +use std::path::PathBuf; + +use base::id::{BlobId, DomPointId, MessagePortId}; +use log::warn; +use malloc_size_of_derive::MallocSizeOf; +use net_traits::filemanager_thread::RelativePos; +use serde::{Deserialize, Serialize}; +use servo_url::ImmutableOrigin; +use strum::{EnumIter, IntoEnumIterator}; +use uuid::Uuid; + +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +enum MessagePortState { + /// <https://html.spec.whatwg.org/multipage/#detached> + Detached, + /// <https://html.spec.whatwg.org/multipage/#port-message-queue> + /// The message-queue of this port is enabled, + /// the boolean represents awaiting completion of a transfer. + Enabled(bool), + /// <https://html.spec.whatwg.org/multipage/#port-message-queue> + /// The message-queue of this port is disabled, + /// the boolean represents awaiting completion of a transfer. + Disabled(bool), +} + +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +/// The data and logic backing the DOM managed MessagePort. +pub struct MessagePortImpl { + /// The current state of the port. + state: MessagePortState, + + /// <https://html.spec.whatwg.org/multipage/#entangle> + entangled_port: Option<MessagePortId>, + + /// <https://html.spec.whatwg.org/multipage/#port-message-queue> + message_buffer: Option<VecDeque<PortMessageTask>>, + + /// The UUID of this port. + message_port_id: MessagePortId, +} + +impl MessagePortImpl { + /// Create a new messageport impl. + pub fn new(port_id: MessagePortId) -> MessagePortImpl { + MessagePortImpl { + state: MessagePortState::Disabled(false), + entangled_port: None, + message_buffer: None, + message_port_id: port_id, + } + } + + /// Get the Id. + pub fn message_port_id(&self) -> &MessagePortId { + &self.message_port_id + } + + /// Maybe get the Id of the entangled port. + pub fn entangled_port_id(&self) -> Option<MessagePortId> { + self.entangled_port + } + + /// Entanged this port with another. + pub fn entangle(&mut self, other_id: MessagePortId) { + self.entangled_port = Some(other_id); + } + + /// Is this port enabled? + pub fn enabled(&self) -> bool { + matches!(self.state, MessagePortState::Enabled(_)) + } + + /// Mark this port as having been shipped. + /// <https://html.spec.whatwg.org/multipage/#has-been-shipped> + pub fn set_has_been_shipped(&mut self) { + match self.state { + MessagePortState::Detached => { + panic!("Messageport set_has_been_shipped called in detached state") + }, + MessagePortState::Enabled(_) => self.state = MessagePortState::Enabled(true), + MessagePortState::Disabled(_) => self.state = MessagePortState::Disabled(true), + } + } + + /// Handle the completion of the transfer, + /// this is data received from the constellation. + pub fn complete_transfer(&mut self, mut tasks: VecDeque<PortMessageTask>) { + match self.state { + MessagePortState::Detached => return, + MessagePortState::Enabled(_) => self.state = MessagePortState::Enabled(false), + MessagePortState::Disabled(_) => self.state = MessagePortState::Disabled(false), + } + + // Note: these are the tasks that were buffered while the transfer was ongoing, + // hence they need to execute first. + // The global will call `start` if we are enabled, + // which will add tasks on the event-loop to dispatch incoming messages. + match self.message_buffer { + Some(ref mut incoming_buffer) => { + while let Some(task) = tasks.pop_back() { + incoming_buffer.push_front(task); + } + }, + None => self.message_buffer = Some(tasks), + } + } + + /// A message was received from our entangled port, + /// returns an optional task to be dispatched. + pub fn handle_incoming(&mut self, task: PortMessageTask) -> Option<PortMessageTask> { + let should_dispatch = match self.state { + MessagePortState::Detached => return None, + MessagePortState::Enabled(in_transfer) => !in_transfer, + MessagePortState::Disabled(_) => false, + }; + + if should_dispatch { + Some(task) + } else { + match self.message_buffer { + Some(ref mut buffer) => { + buffer.push_back(task); + }, + None => { + let mut queue = VecDeque::new(); + queue.push_back(task); + self.message_buffer = Some(queue); + }, + } + None + } + } + + /// <https://html.spec.whatwg.org/multipage/#dom-messageport-start> + /// returns an optional queue of tasks that were buffered while the port was disabled. + pub fn start(&mut self) -> Option<VecDeque<PortMessageTask>> { + match self.state { + MessagePortState::Detached => return None, + MessagePortState::Enabled(_) => {}, + MessagePortState::Disabled(in_transfer) => { + self.state = MessagePortState::Enabled(in_transfer); + }, + } + if let MessagePortState::Enabled(true) = self.state { + return None; + } + self.message_buffer.take() + } + + /// <https://html.spec.whatwg.org/multipage/#dom-messageport-close> + pub fn close(&mut self) { + // Step 1 + self.state = MessagePortState::Detached; + } +} + +/// A data-holder for serialized data and transferred objects. +/// <https://html.spec.whatwg.org/multipage/#structuredserializewithtransfer> +#[derive(Debug, Default, Deserialize, MallocSizeOf, Serialize)] +pub struct StructuredSerializedData { + /// Data serialized by SpiderMonkey. + pub serialized: Vec<u8>, + /// Serialized in a structured callback, + pub blobs: Option<HashMap<BlobId, BlobImpl>>, + /// Serialized point objects. + pub points: Option<HashMap<DomPointId, DomPoint>>, + /// Transferred objects. + pub ports: Option<HashMap<MessagePortId, MessagePortImpl>>, +} + +pub(crate) trait BroadcastClone +where + Self: Sized, +{ + /// The ID type that uniquely identify each value. + type Id: Eq + std::hash::Hash + Copy; + /// Clone this value so that it can be reused with a broadcast channel. + /// Only return None if cloning is impossible. + fn clone_for_broadcast(&self) -> Option<Self>; + /// The field from which to clone values. + fn source(data: &StructuredSerializedData) -> &Option<HashMap<Self::Id, Self>>; + /// The field into which to place cloned values. + fn destination(data: &mut StructuredSerializedData) -> &mut Option<HashMap<Self::Id, Self>>; +} + +/// All the DOM interfaces that can be serialized. +#[derive(Clone, Copy, Debug, EnumIter)] +pub enum Serializable { + /// The `Blob` interface. + Blob, + /// The `DOMPoint` interface. + DomPoint, + /// The `DOMPointReadOnly` interface. + DomPointReadOnly, +} + +impl Serializable { + fn clone_values(&self) -> fn(&StructuredSerializedData, &mut StructuredSerializedData) { + match self { + Serializable::Blob => StructuredSerializedData::clone_all_of_type::<BlobImpl>, + Serializable::DomPointReadOnly => { + StructuredSerializedData::clone_all_of_type::<DomPoint> + }, + Serializable::DomPoint => StructuredSerializedData::clone_all_of_type::<DomPoint>, + } + } +} + +/// All the DOM interfaces that can be transferred. +#[derive(Clone, Copy, Debug, EnumIter)] +pub enum Transferrable { + /// The `MessagePort` interface. + MessagePort, +} + +impl StructuredSerializedData { + fn is_empty(&self, val: Transferrable) -> bool { + fn is_field_empty<K, V>(field: &Option<HashMap<K, V>>) -> bool { + field.as_ref().is_some_and(|h| h.is_empty()) + } + match val { + Transferrable::MessagePort => is_field_empty(&self.ports), + } + } + + /// Clone all values of the same type stored in this StructuredSerializedData + /// into another instance. + fn clone_all_of_type<T: BroadcastClone>(&self, cloned: &mut StructuredSerializedData) { + let existing = T::source(self); + let Some(existing) = existing else { return }; + let mut clones = HashMap::with_capacity(existing.len()); + + for (original_id, obj) in existing.iter() { + if let Some(clone) = obj.clone_for_broadcast() { + clones.insert(*original_id, clone); + } + } + + *T::destination(cloned) = Some(clones); + } + + /// Clone the serialized data for use with broadcast-channels. + pub fn clone_for_broadcast(&self) -> StructuredSerializedData { + for transferrable in Transferrable::iter() { + if !self.is_empty(transferrable) { + // Not panicking only because this is called from the constellation. + warn!( + "Attempt to broadcast structured serialized data including {:?} (should never happen).", + transferrable, + ); + } + } + + let serialized = self.serialized.clone(); + + let mut cloned = StructuredSerializedData { + serialized, + ..Default::default() + }; + + for serializable in Serializable::iter() { + let clone_impl = serializable.clone_values(); + clone_impl(self, &mut cloned); + } + + cloned + } +} + +/// A task on the <https://html.spec.whatwg.org/multipage/#port-message-queue> +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +pub struct PortMessageTask { + /// The origin of this task. + pub origin: ImmutableOrigin, + /// A data-holder for serialized data and transferred objects. + pub data: StructuredSerializedData, +} + +/// Messages for communication between the constellation and a global managing ports. +#[derive(Debug, Deserialize, Serialize)] +pub enum MessagePortMsg { + /// Complete the transfer for a batch of ports. + CompleteTransfer(HashMap<MessagePortId, VecDeque<PortMessageTask>>), + /// Complete the transfer of a single port, + /// whose transfer was pending because it had been requested + /// while a previous failed transfer was being rolled-back. + CompletePendingTransfer(MessagePortId, VecDeque<PortMessageTask>), + /// Remove a port, the entangled one doesn't exists anymore. + RemoveMessagePort(MessagePortId), + /// Handle a new port-message-task. + NewTask(MessagePortId, PortMessageTask), +} + +/// Message for communication between the constellation and a global managing broadcast channels. +#[derive(Debug, Deserialize, Serialize)] +pub struct BroadcastMsg { + /// The origin of this message. + pub origin: ImmutableOrigin, + /// The name of the channel. + pub channel_name: String, + /// A data-holder for serialized data. + pub data: StructuredSerializedData, +} + +impl Clone for BroadcastMsg { + fn clone(&self) -> BroadcastMsg { + BroadcastMsg { + data: self.data.clone_for_broadcast(), + origin: self.origin.clone(), + channel_name: self.channel_name.clone(), + } + } +} + +/// File-based blob +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +pub struct FileBlob { + #[ignore_malloc_size_of = "Uuid are hard(not really)"] + id: Uuid, + #[ignore_malloc_size_of = "PathBuf are hard"] + name: Option<PathBuf>, + cache: RefCell<Option<Vec<u8>>>, + size: u64, +} + +impl FileBlob { + /// Create a new file blob. + pub fn new(id: Uuid, name: Option<PathBuf>, cache: Option<Vec<u8>>, size: u64) -> FileBlob { + FileBlob { + id, + name, + cache: RefCell::new(cache), + size, + } + } + + /// Get the size of the file. + pub fn get_size(&self) -> u64 { + self.size + } + + /// Get the cached file data, if any. + pub fn get_cache(&self) -> Option<Vec<u8>> { + self.cache.borrow().clone() + } + + /// Cache data. + pub fn cache_bytes(&self, bytes: Vec<u8>) { + *self.cache.borrow_mut() = Some(bytes); + } + + /// Get the file id. + pub fn get_id(&self) -> Uuid { + self.id + } +} + +impl BroadcastClone for BlobImpl { + type Id = BlobId; + + fn source( + data: &StructuredSerializedData, + ) -> &Option<std::collections::HashMap<Self::Id, Self>> { + &data.blobs + } + + fn destination( + data: &mut StructuredSerializedData, + ) -> &mut Option<std::collections::HashMap<Self::Id, Self>> { + &mut data.blobs + } + + fn clone_for_broadcast(&self) -> Option<Self> { + let type_string = self.type_string(); + + if let BlobData::Memory(bytes) = self.blob_data() { + let blob_clone = BlobImpl::new_from_bytes(bytes.clone(), type_string); + + // Note: we insert the blob at the original id, + // otherwise this will not match the storage key as serialized by SM in `serialized`. + // The clone has it's own new Id however. + return Some(blob_clone); + } else { + // Not panicking only because this is called from the constellation. + log::warn!("Serialized blob not in memory format(should never happen)."); + } + None + } +} + +/// The data backing a DOM Blob. +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +pub struct BlobImpl { + /// UUID of the blob. + blob_id: BlobId, + /// Content-type string + type_string: String, + /// Blob data-type. + blob_data: BlobData, + /// Sliced blobs referring to this one. + slices: Vec<BlobId>, +} + +/// Different backends of Blob +#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] +pub enum BlobData { + /// File-based blob, whose content lives in the net process + File(FileBlob), + /// Memory-based blob, whose content lives in the script process + Memory(Vec<u8>), + /// Sliced blob, including parent blob-id and + /// relative positions of current slicing range, + /// IMPORTANT: The depth of tree is only two, i.e. the parent Blob must be + /// either File-based or Memory-based + Sliced(BlobId, RelativePos), +} + +impl BlobImpl { + /// Construct memory-backed BlobImpl + pub fn new_from_bytes(bytes: Vec<u8>, type_string: String) -> BlobImpl { + let blob_id = BlobId::new(); + let blob_data = BlobData::Memory(bytes); + BlobImpl { + blob_id, + type_string, + blob_data, + slices: vec![], + } + } + + /// Construct file-backed BlobImpl from File ID + pub fn new_from_file(file_id: Uuid, name: PathBuf, size: u64, type_string: String) -> BlobImpl { + let blob_id = BlobId::new(); + let blob_data = BlobData::File(FileBlob { + id: file_id, + name: Some(name), + cache: RefCell::new(None), + size, + }); + BlobImpl { + blob_id, + type_string, + blob_data, + slices: vec![], + } + } + + /// Construct a BlobImpl from a slice of a parent. + pub fn new_sliced(rel_pos: RelativePos, parent: BlobId, type_string: String) -> BlobImpl { + let blob_id = BlobId::new(); + let blob_data = BlobData::Sliced(parent, rel_pos); + BlobImpl { + blob_id, + type_string, + blob_data, + slices: vec![], + } + } + + /// Get a clone of the blob-id + pub fn blob_id(&self) -> BlobId { + self.blob_id + } + + /// Get a clone of the type-string + pub fn type_string(&self) -> String { + self.type_string.clone() + } + + /// Get a mutable ref to the data + pub fn blob_data(&self) -> &BlobData { + &self.blob_data + } + + /// Get a mutable ref to the data + pub fn blob_data_mut(&mut self) -> &mut BlobData { + &mut self.blob_data + } +} + +#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)] +/// A serializable version of the DOMPoint/DOMPointReadOnly interface. +pub struct DomPoint { + /// The x coordinate. + pub x: f64, + /// The y coordinate. + pub y: f64, + /// The z coordinate. + pub z: f64, + /// The w coordinate. + pub w: f64, +} + +impl BroadcastClone for DomPoint { + type Id = DomPointId; + + fn source( + data: &StructuredSerializedData, + ) -> &Option<std::collections::HashMap<Self::Id, Self>> { + &data.points + } + + fn destination( + data: &mut StructuredSerializedData, + ) -> &mut Option<std::collections::HashMap<Self::Id, Self>> { + &mut data.points + } + + fn clone_for_broadcast(&self) -> Option<Self> { + Some(self.clone()) + } +} diff --git a/components/shared/embedder/lib.rs b/components/shared/embedder/lib.rs index 67ccd9887ae..85dd4bf3af9 100644 --- a/components/shared/embedder/lib.rs +++ b/components/shared/embedder/lib.rs @@ -13,21 +13,23 @@ pub mod resources; pub mod user_content_manager; mod webdriver; +use std::ffi::c_void; use std::fmt::{Debug, Error, Formatter}; use std::path::PathBuf; use std::sync::Arc; -use base::id::{PipelineId, WebViewId}; +use base::id::{PipelineId, ScrollTreeNodeId, WebViewId}; use crossbeam_channel::Sender; use euclid::{Scale, Size2D}; use http::{HeaderMap, Method, StatusCode}; use ipc_channel::ipc::IpcSender; pub use keyboard_types::{KeyboardEvent, Modifiers}; use log::warn; +use malloc_size_of::malloc_size_of_is_0; use malloc_size_of_derive::MallocSizeOf; use num_derive::FromPrimitive; use pixels::Image; -use serde::{Deserialize, Serialize}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; use servo_url::ServoUrl; use strum_macros::IntoStaticStr; use style_traits::CSSPixel; @@ -705,3 +707,85 @@ impl From<SelectElementOption> for SelectElementOptionOrOptgroup { Self::Option(value) } } + +/// The address of a node. Layout sends these back. They must be validated via +/// `from_untrusted_node_address` before they can be used, because we do not trust layout. +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub struct UntrustedNodeAddress(pub *const c_void); + +malloc_size_of_is_0!(UntrustedNodeAddress); + +#[allow(unsafe_code)] +unsafe impl Send for UntrustedNodeAddress {} + +impl From<style_traits::dom::OpaqueNode> for UntrustedNodeAddress { + fn from(o: style_traits::dom::OpaqueNode) -> Self { + UntrustedNodeAddress(o.0 as *const c_void) + } +} + +impl Serialize for UntrustedNodeAddress { + fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> { + (self.0 as usize).serialize(s) + } +} + +impl<'de> Deserialize<'de> for UntrustedNodeAddress { + fn deserialize<D: Deserializer<'de>>(d: D) -> Result<UntrustedNodeAddress, D::Error> { + let value: usize = Deserialize::deserialize(d)?; + Ok(UntrustedNodeAddress::from_id(value)) + } +} + +impl UntrustedNodeAddress { + /// Creates an `UntrustedNodeAddress` from the given pointer address value. + #[inline] + pub fn from_id(id: usize) -> UntrustedNodeAddress { + UntrustedNodeAddress(id as *const c_void) + } +} + +/// The result of a hit test in the compositor. +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct CompositorHitTestResult { + /// The pipeline id of the resulting item. + pub pipeline_id: PipelineId, + + /// The hit test point in the item's viewport. + pub point_in_viewport: euclid::default::Point2D<f32>, + + /// The hit test point relative to the item itself. + pub point_relative_to_item: euclid::default::Point2D<f32>, + + /// The node address of the hit test result. + pub node: UntrustedNodeAddress, + + /// The cursor that should be used when hovering the item hit by the hit test. + pub cursor: Option<Cursor>, + + /// The scroll tree node associated with this hit test item. + pub scroll_tree_node: ScrollTreeNodeId, +} + +/// Whether the default action for a touch event was prevented by web content +#[derive(Debug, Deserialize, Serialize)] +pub enum TouchEventResult { + /// Allowed by web content + DefaultAllowed(TouchSequenceId, TouchEventType), + /// Prevented by web content + DefaultPrevented(TouchSequenceId, TouchEventType), +} + +/// For a given pipeline, whether any animations are currently running +/// and any animation callbacks are queued +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +pub enum AnimationState { + /// Animations are active but no callbacks are queued + AnimationsPresent, + /// Animations are active and callbacks are queued + AnimationCallbacksPresent, + /// No animations are active and no callbacks are queued + NoAnimationsPresent, + /// No animations are active but callbacks are queued + NoAnimationCallbacksPresent, +} diff --git a/components/shared/script/Cargo.toml b/components/shared/script/Cargo.toml index dda1371817f..49efbadc165 100644 --- a/components/shared/script/Cargo.toml +++ b/components/shared/script/Cargo.toml @@ -13,26 +13,21 @@ path = "lib.rs" [features] bluetooth = ["bluetooth_traits"] -webgpu = ["wgpu-core"] +webgpu = ["webgpu_traits"] [dependencies] background_hang_monitor_api = { workspace = true } base = { workspace = true } -bitflags = { workspace = true } bluetooth_traits = { workspace = true, optional = true } canvas_traits = { workspace = true } constellation_traits = { workspace = true } -cookie = { workspace = true } crossbeam-channel = { workspace = true } devtools_traits = { workspace = true } embedder_traits = { workspace = true } euclid = { workspace = true } http = { workspace = true } -hyper_serde = { workspace = true } ipc-channel = { workspace = true } keyboard-types = { workspace = true } -libc = { workspace = true } -log = { workspace = true } malloc_size_of = { workspace = true } malloc_size_of_derive = { workspace = true } media = { path = "../../media" } @@ -45,10 +40,7 @@ strum = { workspace = true, features = ["derive"] } strum_macros = { workspace = true } stylo_atoms = { workspace = true } stylo_traits = { workspace = true } -uuid = { workspace = true } -webdriver = { workspace = true } -webgpu_traits = { workspace = true } +webgpu_traits = { workspace = true, optional = true } webrender_api = { workspace = true } webrender_traits = { workspace = true } webxr-api = { workspace = true, features = ["ipc"] } -wgpu-core = { workspace = true, optional = true } diff --git a/components/shared/script/lib.rs b/components/shared/script/lib.rs index 91e4ca33dc4..1a35f4f7486 100644 --- a/components/shared/script/lib.rs +++ b/components/shared/script/lib.rs @@ -9,48 +9,38 @@ #![deny(missing_docs)] #![deny(unsafe_code)] -mod script_msg; -pub mod serializable; -pub mod transferable; - -use std::collections::{HashMap, VecDeque}; use std::fmt; use std::sync::Arc; use background_hang_monitor_api::BackgroundHangMonitorRegister; use base::cross_process_instant::CrossProcessInstant; -use base::id::{ - BlobId, BrowsingContextId, DomPointId, HistoryStateId, MessagePortId, PipelineId, - PipelineNamespaceId, WebViewId, -}; +use base::id::{BrowsingContextId, HistoryStateId, PipelineId, PipelineNamespaceId, WebViewId}; #[cfg(feature = "bluetooth")] use bluetooth_traits::BluetoothRequest; use canvas_traits::webgl::WebGLPipeline; use constellation_traits::{ - AnimationTickType, CompositorHitTestResult, ScrollState, WindowSizeType, + AnimationTickType, LoadData, NavigationHistoryBehavior, ScriptToConstellationChan, ScrollState, + StructuredSerializedData, WindowSizeType, }; use crossbeam_channel::{RecvTimeoutError, Sender}; -use devtools_traits::{DevtoolScriptControlMsg, ScriptToDevtoolsControlMsg, WorkerId}; -use embedder_traits::input_events::InputEvent; +use devtools_traits::ScriptToDevtoolsControlMsg; use embedder_traits::user_content_manager::UserContentManager; -use embedder_traits::{MediaSessionActionType, Theme, ViewportDetails, WebDriverScriptCommand}; +use embedder_traits::{ + CompositorHitTestResult, InputEvent, MediaSessionActionType, Theme, ViewportDetails, + WebDriverScriptCommand, +}; use euclid::{Rect, Scale, Size2D, UnknownUnit}; -use http::{HeaderMap, Method}; -use ipc_channel::Error as IpcError; use ipc_channel::ipc::{IpcReceiver, IpcSender}; use keyboard_types::Modifiers; -use log::warn; use malloc_size_of_derive::MallocSizeOf; use media::WindowGLContext; +use net_traits::ResourceThreads; use net_traits::image_cache::ImageCache; -use net_traits::request::{InsecureRequestsPolicy, Referrer, RequestBody}; use net_traits::storage_thread::StorageType; -use net_traits::{ReferrerPolicy, ResourceThreads}; use pixels::PixelFormat; -use profile_traits::{mem, time as profile_time}; +use profile_traits::mem; use serde::{Deserialize, Serialize}; use servo_url::{ImmutableOrigin, ServoUrl}; -use strum::{EnumIter, IntoEnumIterator}; use strum_macros::IntoStaticStr; use style_traits::{CSSPixel, SpeculativePainter}; use stylo_atoms::Atom; @@ -60,111 +50,6 @@ use webrender_api::units::DevicePixel; use webrender_api::{DocumentId, ImageKey}; use webrender_traits::CrossProcessCompositorApi; -pub use crate::script_msg::{ - DOMMessage, IFrameSizeMsg, Job, JobError, JobResult, JobResultValue, JobType, SWManagerMsg, - SWManagerSenders, ScopeThings, ScriptToConstellationMessage, ServiceWorkerMsg, - TouchEventResult, -}; -use crate::serializable::{BlobImpl, DomPoint}; -use crate::transferable::MessagePortImpl; - -/// The origin where a given load was initiated. -/// Useful for origin checks, for example before evaluation a JS URL. -#[derive(Clone, Debug, Deserialize, Serialize)] -pub enum LoadOrigin { - /// A load originating in the constellation. - Constellation, - /// A load originating in webdriver. - WebDriver, - /// A load originating in script. - Script(ImmutableOrigin), -} - -/// can be passed to `LoadUrl` to load a page with GET/POST -/// parameters or headers -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct LoadData { - /// The origin where the load started. - pub load_origin: LoadOrigin, - /// The URL. - pub url: ServoUrl, - /// The creator pipeline id if this is an about:blank load. - pub creator_pipeline_id: Option<PipelineId>, - /// The method. - #[serde( - deserialize_with = "::hyper_serde::deserialize", - serialize_with = "::hyper_serde::serialize" - )] - pub method: Method, - /// The headers. - #[serde( - deserialize_with = "::hyper_serde::deserialize", - serialize_with = "::hyper_serde::serialize" - )] - pub headers: HeaderMap, - /// The data that will be used as the body of the request. - pub data: Option<RequestBody>, - /// The result of evaluating a javascript scheme url. - pub js_eval_result: Option<JsEvalResult>, - /// The referrer. - pub referrer: Referrer, - /// The referrer policy. - pub referrer_policy: ReferrerPolicy, - - /// The source to use instead of a network response for a srcdoc document. - pub srcdoc: String, - /// The inherited context is Secure, None if not inherited - pub inherited_secure_context: Option<bool>, - /// The inherited policy for upgrading insecure requests; None if not inherited. - pub inherited_insecure_requests_policy: Option<InsecureRequestsPolicy>, - /// Whether the page's ancestors have potentially trustworthy origin - pub has_trustworthy_ancestor_origin: bool, - /// Servo internal: if crash details are present, trigger a crash error page with these details. - pub crash: Option<String>, -} - -/// The result of evaluating a javascript scheme url. -#[derive(Clone, Debug, Deserialize, Serialize)] -pub enum JsEvalResult { - /// The js evaluation had a non-string result, 204 status code. - /// <https://html.spec.whatwg.org/multipage/#navigate> 12.11 - NoContent, - /// The js evaluation had a string result. - Ok(Vec<u8>), -} - -impl LoadData { - /// Create a new `LoadData` object. - #[allow(clippy::too_many_arguments)] - pub fn new( - load_origin: LoadOrigin, - url: ServoUrl, - creator_pipeline_id: Option<PipelineId>, - referrer: Referrer, - referrer_policy: ReferrerPolicy, - inherited_secure_context: Option<bool>, - inherited_insecure_requests_policy: Option<InsecureRequestsPolicy>, - has_trustworthy_ancestor_origin: bool, - ) -> LoadData { - LoadData { - load_origin, - url, - creator_pipeline_id, - method: Method::GET, - headers: HeaderMap::new(), - data: None, - js_eval_result: None, - referrer, - referrer_policy, - srcdoc: "".to_string(), - inherited_secure_context, - crash: None, - inherited_insecure_requests_policy, - has_trustworthy_ancestor_origin, - } - } -} - /// The initial data required to create a new layout attached to an existing script thread. #[derive(Debug, Deserialize, Serialize)] pub struct NewLayoutInfo { @@ -194,21 +79,6 @@ pub enum DiscardBrowsingContext { No, } -/// <https://html.spec.whatwg.org/multipage/#navigation-supporting-concepts:navigationhistorybehavior> -#[derive(Debug, Default, Deserialize, PartialEq, Serialize)] -pub enum NavigationHistoryBehavior { - /// The default value, which will be converted very early in the navigate algorithm into "push" - /// or "replace". Usually it becomes "push", but under certain circumstances it becomes - /// "replace" instead. - #[default] - Auto, - /// A regular navigation which adds a new session history entry, and will clear the forward - /// session history. - Push, - /// A navigation that will replace the active session history entry. - Replace, -} - /// Is a document fully active, active or inactive? /// A document is active if it is the current active document in its session history, /// it is fuly active if it is active and all of its ancestors are active, @@ -385,20 +255,6 @@ pub enum DocumentState { Pending, } -/// For a given pipeline, whether any animations are currently running -/// and any animation callbacks are queued -#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] -pub enum AnimationState { - /// Animations are active but no callbacks are queued - AnimationsPresent, - /// Animations are active and callbacks are queued - AnimationCallbacksPresent, - /// No animations are active and no callbacks are queued - NoAnimationsPresent, - /// No animations are active but callbacks are queued - NoAnimationCallbacksPresent, -} - /// Input events from the embedder that are sent via the `Constellation`` to the `ScriptThread`. #[derive(Debug, Deserialize, Serialize)] pub struct ConstellationInputEvent { @@ -472,117 +328,6 @@ pub struct InitialScriptState { pub user_content_manager: UserContentManager, } -/// This trait allows creating a `ServiceWorkerManager` without depending on the `script` -/// crate. -pub trait ServiceWorkerManagerFactory { - /// Create a `ServiceWorkerManager`. - fn create(sw_senders: SWManagerSenders, origin: ImmutableOrigin); -} - -/// Whether the sandbox attribute is present for an iframe element -#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] -pub enum IFrameSandboxState { - /// Sandbox attribute is present - IFrameSandboxed, - /// Sandbox attribute is not present - IFrameUnsandboxed, -} - -/// Specifies the information required to load an auxiliary browsing context. -#[derive(Debug, Deserialize, Serialize)] -pub struct AuxiliaryWebViewCreationRequest { - /// Load data containing the url to load - pub load_data: LoadData, - /// The webview that caused this request. - pub opener_webview_id: WebViewId, - /// The pipeline opener browsing context. - pub opener_pipeline_id: PipelineId, - /// Sender for the constellation’s response to our request. - pub response_sender: IpcSender<Option<AuxiliaryWebViewCreationResponse>>, -} - -/// Constellation’s response to auxiliary browsing context creation requests. -#[derive(Debug, Deserialize, Serialize)] -pub struct AuxiliaryWebViewCreationResponse { - /// The new webview ID. - pub new_webview_id: WebViewId, - /// The new pipeline ID. - pub new_pipeline_id: PipelineId, -} - -/// Specifies the information required to load an iframe. -#[derive(Debug, Deserialize, Serialize)] -pub struct IFrameLoadInfo { - /// Pipeline ID of the parent of this iframe - pub parent_pipeline_id: PipelineId, - /// The ID for this iframe's nested browsing context. - pub browsing_context_id: BrowsingContextId, - /// The ID for the top-level ancestor browsing context of this iframe's nested browsing context. - pub webview_id: WebViewId, - /// The new pipeline ID that the iframe has generated. - pub new_pipeline_id: PipelineId, - /// Whether this iframe should be considered private - pub is_private: bool, - /// Whether this iframe should be considered secure - pub inherited_secure_context: Option<bool>, - /// Whether this load should replace the current entry (reload). If true, the current - /// entry will be replaced instead of a new entry being added. - pub history_handling: NavigationHistoryBehavior, -} - -/// Specifies the information required to load a URL in an iframe. -#[derive(Debug, Deserialize, Serialize)] -pub struct IFrameLoadInfoWithData { - /// The information required to load an iframe. - pub info: IFrameLoadInfo, - /// Load data containing the url to load - pub load_data: LoadData, - /// The old pipeline ID for this iframe, if a page was previously loaded. - pub old_pipeline_id: Option<PipelineId>, - /// Sandbox type of this iframe - pub sandbox: IFrameSandboxState, - /// The initial viewport size for this iframe. - pub viewport_details: ViewportDetails, -} - -/// Resources required by workerglobalscopes -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct WorkerGlobalScopeInit { - /// Chan to a resource thread - pub resource_threads: ResourceThreads, - /// Chan to the memory profiler - pub mem_profiler_chan: mem::ProfilerChan, - /// Chan to the time profiler - pub time_profiler_chan: profile_time::ProfilerChan, - /// To devtools sender - pub to_devtools_sender: Option<IpcSender<ScriptToDevtoolsControlMsg>>, - /// From devtools sender - pub from_devtools_sender: Option<IpcSender<DevtoolScriptControlMsg>>, - /// Messages to send to constellation - pub script_to_constellation_chan: ScriptToConstellationChan, - /// The worker id - pub worker_id: WorkerId, - /// The pipeline id - pub pipeline_id: PipelineId, - /// The origin - pub origin: ImmutableOrigin, - /// The creation URL - pub creation_url: Option<ServoUrl>, - /// True if secure context - pub inherited_secure_context: Option<bool>, -} - -/// Common entities representing a network load origin -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct WorkerScriptLoadOrigin { - /// referrer url - pub referrer_url: Option<ServoUrl>, - /// the referrer policy which is used - pub referrer_policy: ReferrerPolicy, - /// the pipeline id of the entity requesting the load - pub pipeline_id: PipelineId, -} - /// Errors from executing a paint worklet #[derive(Clone, Debug, Deserialize, Serialize)] pub enum PaintWorkletError { @@ -634,177 +379,3 @@ pub struct DrawAPaintImageResult { /// Drawing the image might have requested loading some image URLs. pub missing_image_urls: Vec<ServoUrl>, } - -/// A Script to Constellation channel. -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ScriptToConstellationChan { - /// Sender for communicating with constellation thread. - pub sender: IpcSender<(PipelineId, ScriptToConstellationMessage)>, - /// Used to identify the origin of the message. - pub pipeline_id: PipelineId, -} - -impl ScriptToConstellationChan { - /// Send ScriptMsg and attach the pipeline_id to the message. - pub fn send(&self, msg: ScriptToConstellationMessage) -> Result<(), IpcError> { - self.sender.send((self.pipeline_id, msg)) - } -} - -/// A data-holder for serialized data and transferred objects. -/// <https://html.spec.whatwg.org/multipage/#structuredserializewithtransfer> -#[derive(Debug, Default, Deserialize, MallocSizeOf, Serialize)] -pub struct StructuredSerializedData { - /// Data serialized by SpiderMonkey. - pub serialized: Vec<u8>, - /// Serialized in a structured callback, - pub blobs: Option<HashMap<BlobId, BlobImpl>>, - /// Serialized point objects. - pub points: Option<HashMap<DomPointId, DomPoint>>, - /// Transferred objects. - pub ports: Option<HashMap<MessagePortId, MessagePortImpl>>, -} - -pub(crate) trait BroadcastClone -where - Self: Sized, -{ - /// The ID type that uniquely identify each value. - type Id: Eq + std::hash::Hash + Copy; - /// Clone this value so that it can be reused with a broadcast channel. - /// Only return None if cloning is impossible. - fn clone_for_broadcast(&self) -> Option<Self>; - /// The field from which to clone values. - fn source(data: &StructuredSerializedData) -> &Option<HashMap<Self::Id, Self>>; - /// The field into which to place cloned values. - fn destination(data: &mut StructuredSerializedData) -> &mut Option<HashMap<Self::Id, Self>>; -} - -/// All the DOM interfaces that can be serialized. -#[derive(Clone, Copy, Debug, EnumIter)] -pub enum Serializable { - /// The `Blob` interface. - Blob, - /// The `DOMPoint` interface. - DomPoint, - /// The `DOMPointReadOnly` interface. - DomPointReadOnly, -} - -impl Serializable { - fn clone_values(&self) -> fn(&StructuredSerializedData, &mut StructuredSerializedData) { - match self { - Serializable::Blob => StructuredSerializedData::clone_all_of_type::<BlobImpl>, - Serializable::DomPointReadOnly => { - StructuredSerializedData::clone_all_of_type::<DomPoint> - }, - Serializable::DomPoint => StructuredSerializedData::clone_all_of_type::<DomPoint>, - } - } -} - -/// All the DOM interfaces that can be transferred. -#[derive(Clone, Copy, Debug, EnumIter)] -pub enum Transferrable { - /// The `MessagePort` interface. - MessagePort, -} - -impl StructuredSerializedData { - fn is_empty(&self, val: Transferrable) -> bool { - fn is_field_empty<K, V>(field: &Option<HashMap<K, V>>) -> bool { - field.as_ref().is_some_and(|h| h.is_empty()) - } - match val { - Transferrable::MessagePort => is_field_empty(&self.ports), - } - } - - /// Clone all values of the same type stored in this StructuredSerializedData - /// into another instance. - fn clone_all_of_type<T: BroadcastClone>(&self, cloned: &mut StructuredSerializedData) { - let existing = T::source(self); - let Some(existing) = existing else { return }; - let mut clones = HashMap::with_capacity(existing.len()); - - for (original_id, obj) in existing.iter() { - if let Some(clone) = obj.clone_for_broadcast() { - clones.insert(*original_id, clone); - } - } - - *T::destination(cloned) = Some(clones); - } - - /// Clone the serialized data for use with broadcast-channels. - pub fn clone_for_broadcast(&self) -> StructuredSerializedData { - for transferrable in Transferrable::iter() { - if !self.is_empty(transferrable) { - // Not panicking only because this is called from the constellation. - warn!( - "Attempt to broadcast structured serialized data including {:?} (should never happen).", - transferrable, - ); - } - } - - let serialized = self.serialized.clone(); - - let mut cloned = StructuredSerializedData { - serialized, - ..Default::default() - }; - - for serializable in Serializable::iter() { - let clone_impl = serializable.clone_values(); - clone_impl(self, &mut cloned); - } - - cloned - } -} - -/// A task on the <https://html.spec.whatwg.org/multipage/#port-message-queue> -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -pub struct PortMessageTask { - /// The origin of this task. - pub origin: ImmutableOrigin, - /// A data-holder for serialized data and transferred objects. - pub data: StructuredSerializedData, -} - -/// Messages for communication between the constellation and a global managing ports. -#[derive(Debug, Deserialize, Serialize)] -pub enum MessagePortMsg { - /// Complete the transfer for a batch of ports. - CompleteTransfer(HashMap<MessagePortId, VecDeque<PortMessageTask>>), - /// Complete the transfer of a single port, - /// whose transfer was pending because it had been requested - /// while a previous failed transfer was being rolled-back. - CompletePendingTransfer(MessagePortId, VecDeque<PortMessageTask>), - /// Remove a port, the entangled one doesn't exists anymore. - RemoveMessagePort(MessagePortId), - /// Handle a new port-message-task. - NewTask(MessagePortId, PortMessageTask), -} - -/// Message for communication between the constellation and a global managing broadcast channels. -#[derive(Debug, Deserialize, Serialize)] -pub struct BroadcastMsg { - /// The origin of this message. - pub origin: ImmutableOrigin, - /// The name of the channel. - pub channel_name: String, - /// A data-holder for serialized data. - pub data: StructuredSerializedData, -} - -impl Clone for BroadcastMsg { - fn clone(&self) -> BroadcastMsg { - BroadcastMsg { - data: self.data.clone_for_broadcast(), - origin: self.origin.clone(), - channel_name: self.channel_name.clone(), - } - } -} diff --git a/components/shared/script/serializable.rs b/components/shared/script/serializable.rs deleted file mode 100644 index 5d89c622bee..00000000000 --- a/components/shared/script/serializable.rs +++ /dev/null @@ -1,217 +0,0 @@ -/* 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/. */ - -//! This module contains implementations in script that are serializable, -//! as per <https://html.spec.whatwg.org/multipage/#serializable-objects>. -//! The implementations are here instead of in script -//! so that the other modules involved in the serialization don't have -//! to depend on script. - -use std::cell::RefCell; -use std::path::PathBuf; - -use base::id::{BlobId, DomPointId}; -use malloc_size_of_derive::MallocSizeOf; -use net_traits::filemanager_thread::RelativePos; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -/// File-based blob -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -pub struct FileBlob { - #[ignore_malloc_size_of = "Uuid are hard(not really)"] - id: Uuid, - #[ignore_malloc_size_of = "PathBuf are hard"] - name: Option<PathBuf>, - cache: RefCell<Option<Vec<u8>>>, - size: u64, -} - -impl FileBlob { - /// Create a new file blob. - pub fn new(id: Uuid, name: Option<PathBuf>, cache: Option<Vec<u8>>, size: u64) -> FileBlob { - FileBlob { - id, - name, - cache: RefCell::new(cache), - size, - } - } - - /// Get the size of the file. - pub fn get_size(&self) -> u64 { - self.size - } - - /// Get the cached file data, if any. - pub fn get_cache(&self) -> Option<Vec<u8>> { - self.cache.borrow().clone() - } - - /// Cache data. - pub fn cache_bytes(&self, bytes: Vec<u8>) { - *self.cache.borrow_mut() = Some(bytes); - } - - /// Get the file id. - pub fn get_id(&self) -> Uuid { - self.id - } -} - -impl crate::BroadcastClone for BlobImpl { - type Id = BlobId; - - fn source( - data: &crate::StructuredSerializedData, - ) -> &Option<std::collections::HashMap<Self::Id, Self>> { - &data.blobs - } - - fn destination( - data: &mut crate::StructuredSerializedData, - ) -> &mut Option<std::collections::HashMap<Self::Id, Self>> { - &mut data.blobs - } - - fn clone_for_broadcast(&self) -> Option<Self> { - let type_string = self.type_string(); - - if let BlobData::Memory(bytes) = self.blob_data() { - let blob_clone = BlobImpl::new_from_bytes(bytes.clone(), type_string); - - // Note: we insert the blob at the original id, - // otherwise this will not match the storage key as serialized by SM in `serialized`. - // The clone has it's own new Id however. - return Some(blob_clone); - } else { - // Not panicking only because this is called from the constellation. - log::warn!("Serialized blob not in memory format(should never happen)."); - } - None - } -} - -/// The data backing a DOM Blob. -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -pub struct BlobImpl { - /// UUID of the blob. - blob_id: BlobId, - /// Content-type string - type_string: String, - /// Blob data-type. - blob_data: BlobData, - /// Sliced blobs referring to this one. - slices: Vec<BlobId>, -} - -/// Different backends of Blob -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -pub enum BlobData { - /// File-based blob, whose content lives in the net process - File(FileBlob), - /// Memory-based blob, whose content lives in the script process - Memory(Vec<u8>), - /// Sliced blob, including parent blob-id and - /// relative positions of current slicing range, - /// IMPORTANT: The depth of tree is only two, i.e. the parent Blob must be - /// either File-based or Memory-based - Sliced(BlobId, RelativePos), -} - -impl BlobImpl { - /// Construct memory-backed BlobImpl - pub fn new_from_bytes(bytes: Vec<u8>, type_string: String) -> BlobImpl { - let blob_id = BlobId::new(); - let blob_data = BlobData::Memory(bytes); - BlobImpl { - blob_id, - type_string, - blob_data, - slices: vec![], - } - } - - /// Construct file-backed BlobImpl from File ID - pub fn new_from_file(file_id: Uuid, name: PathBuf, size: u64, type_string: String) -> BlobImpl { - let blob_id = BlobId::new(); - let blob_data = BlobData::File(FileBlob { - id: file_id, - name: Some(name), - cache: RefCell::new(None), - size, - }); - BlobImpl { - blob_id, - type_string, - blob_data, - slices: vec![], - } - } - - /// Construct a BlobImpl from a slice of a parent. - pub fn new_sliced(rel_pos: RelativePos, parent: BlobId, type_string: String) -> BlobImpl { - let blob_id = BlobId::new(); - let blob_data = BlobData::Sliced(parent, rel_pos); - BlobImpl { - blob_id, - type_string, - blob_data, - slices: vec![], - } - } - - /// Get a clone of the blob-id - pub fn blob_id(&self) -> BlobId { - self.blob_id - } - - /// Get a clone of the type-string - pub fn type_string(&self) -> String { - self.type_string.clone() - } - - /// Get a mutable ref to the data - pub fn blob_data(&self) -> &BlobData { - &self.blob_data - } - - /// Get a mutable ref to the data - pub fn blob_data_mut(&mut self) -> &mut BlobData { - &mut self.blob_data - } -} - -#[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)] -/// A serializable version of the DOMPoint/DOMPointReadOnly interface. -pub struct DomPoint { - /// The x coordinate. - pub x: f64, - /// The y coordinate. - pub y: f64, - /// The z coordinate. - pub z: f64, - /// The w coordinate. - pub w: f64, -} - -impl crate::BroadcastClone for DomPoint { - type Id = DomPointId; - - fn source( - data: &crate::StructuredSerializedData, - ) -> &Option<std::collections::HashMap<Self::Id, Self>> { - &data.points - } - - fn destination( - data: &mut crate::StructuredSerializedData, - ) -> &mut Option<std::collections::HashMap<Self::Id, Self>> { - &mut data.points - } - - fn clone_for_broadcast(&self) -> Option<Self> { - Some(self.clone()) - } -} diff --git a/components/shared/script/transferable.rs b/components/shared/script/transferable.rs deleted file mode 100644 index 8344dd493b0..00000000000 --- a/components/shared/script/transferable.rs +++ /dev/null @@ -1,161 +0,0 @@ -/* 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/. */ - -//! This module contains implementations in script that are transferable. -//! The implementations are here instead of in script -//! so that the other modules involved in the transfer don't have -//! to depend on script. - -use std::collections::VecDeque; - -use base::id::MessagePortId; -use malloc_size_of_derive::MallocSizeOf; -use serde::{Deserialize, Serialize}; - -use crate::PortMessageTask; - -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -enum MessagePortState { - /// <https://html.spec.whatwg.org/multipage/#detached> - Detached, - /// <https://html.spec.whatwg.org/multipage/#port-message-queue> - /// The message-queue of this port is enabled, - /// the boolean represents awaiting completion of a transfer. - Enabled(bool), - /// <https://html.spec.whatwg.org/multipage/#port-message-queue> - /// The message-queue of this port is disabled, - /// the boolean represents awaiting completion of a transfer. - Disabled(bool), -} - -#[derive(Debug, Deserialize, MallocSizeOf, Serialize)] -/// The data and logic backing the DOM managed MessagePort. -pub struct MessagePortImpl { - /// The current state of the port. - state: MessagePortState, - - /// <https://html.spec.whatwg.org/multipage/#entangle> - entangled_port: Option<MessagePortId>, - - /// <https://html.spec.whatwg.org/multipage/#port-message-queue> - message_buffer: Option<VecDeque<PortMessageTask>>, - - /// The UUID of this port. - message_port_id: MessagePortId, -} - -impl MessagePortImpl { - /// Create a new messageport impl. - pub fn new(port_id: MessagePortId) -> MessagePortImpl { - MessagePortImpl { - state: MessagePortState::Disabled(false), - entangled_port: None, - message_buffer: None, - message_port_id: port_id, - } - } - - /// Get the Id. - pub fn message_port_id(&self) -> &MessagePortId { - &self.message_port_id - } - - /// Maybe get the Id of the entangled port. - pub fn entangled_port_id(&self) -> Option<MessagePortId> { - self.entangled_port - } - - /// Entanged this port with another. - pub fn entangle(&mut self, other_id: MessagePortId) { - self.entangled_port = Some(other_id); - } - - /// Is this port enabled? - pub fn enabled(&self) -> bool { - matches!(self.state, MessagePortState::Enabled(_)) - } - - /// Mark this port as having been shipped. - /// <https://html.spec.whatwg.org/multipage/#has-been-shipped> - pub fn set_has_been_shipped(&mut self) { - match self.state { - MessagePortState::Detached => { - panic!("Messageport set_has_been_shipped called in detached state") - }, - MessagePortState::Enabled(_) => self.state = MessagePortState::Enabled(true), - MessagePortState::Disabled(_) => self.state = MessagePortState::Disabled(true), - } - } - - /// Handle the completion of the transfer, - /// this is data received from the constellation. - pub fn complete_transfer(&mut self, mut tasks: VecDeque<PortMessageTask>) { - match self.state { - MessagePortState::Detached => return, - MessagePortState::Enabled(_) => self.state = MessagePortState::Enabled(false), - MessagePortState::Disabled(_) => self.state = MessagePortState::Disabled(false), - } - - // Note: these are the tasks that were buffered while the transfer was ongoing, - // hence they need to execute first. - // The global will call `start` if we are enabled, - // which will add tasks on the event-loop to dispatch incoming messages. - match self.message_buffer { - Some(ref mut incoming_buffer) => { - while let Some(task) = tasks.pop_back() { - incoming_buffer.push_front(task); - } - }, - None => self.message_buffer = Some(tasks), - } - } - - /// A message was received from our entangled port, - /// returns an optional task to be dispatched. - pub fn handle_incoming(&mut self, task: PortMessageTask) -> Option<PortMessageTask> { - let should_dispatch = match self.state { - MessagePortState::Detached => return None, - MessagePortState::Enabled(in_transfer) => !in_transfer, - MessagePortState::Disabled(_) => false, - }; - - if should_dispatch { - Some(task) - } else { - match self.message_buffer { - Some(ref mut buffer) => { - buffer.push_back(task); - }, - None => { - let mut queue = VecDeque::new(); - queue.push_back(task); - self.message_buffer = Some(queue); - }, - } - None - } - } - - /// <https://html.spec.whatwg.org/multipage/#dom-messageport-start> - /// returns an optional queue of tasks that were buffered while the port was disabled. - pub fn start(&mut self) -> Option<VecDeque<PortMessageTask>> { - match self.state { - MessagePortState::Detached => return None, - MessagePortState::Enabled(_) => {}, - MessagePortState::Disabled(in_transfer) => { - self.state = MessagePortState::Enabled(in_transfer); - }, - } - if let MessagePortState::Enabled(true) = self.state { - return None; - } - self.message_buffer.take() - } - - /// <https://html.spec.whatwg.org/multipage/#dom-messageport-close> - pub fn close(&mut self) { - // Step 1 - self.state = MessagePortState::Detached; - } -} diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs index 66ddb3a55fa..6d686d75f03 100644 --- a/components/shared/script_layout/lib.rs +++ b/components/shared/script_layout/lib.rs @@ -18,8 +18,8 @@ use app_units::Au; use atomic_refcell::AtomicRefCell; use base::Epoch; use base::id::{BrowsingContextId, PipelineId, WebViewId}; -use constellation_traits::{ScrollState, UntrustedNodeAddress}; -use embedder_traits::ViewportDetails; +use constellation_traits::{LoadData, ScrollState}; +use embedder_traits::{UntrustedNodeAddress, ViewportDetails}; use euclid::default::{Point2D, Rect}; use fnv::FnvHashMap; use fonts::{FontContext, SystemFontServiceProxy}; @@ -31,7 +31,7 @@ use net_traits::image_cache::{ImageCache, PendingImageId}; use pixels::Image; use profile_traits::mem::Report; use profile_traits::time; -use script_traits::{InitialScriptState, LoadData, Painter, ScriptThreadMessage}; +use script_traits::{InitialScriptState, Painter, ScriptThreadMessage}; use serde::{Deserialize, Serialize}; use servo_arc::Arc as ServoArc; use servo_url::{ImmutableOrigin, ServoUrl}; diff --git a/components/shared/webrender/Cargo.toml b/components/shared/webrender/Cargo.toml index 6ecaa7cdee3..b437174307d 100644 --- a/components/shared/webrender/Cargo.toml +++ b/components/shared/webrender/Cargo.toml @@ -17,7 +17,6 @@ no-wgl = ["surfman/sm-angle-default"] [dependencies] base = { workspace = true } -constellation_traits = { workspace = true } dpi = { version = "0.1" } embedder_traits = { workspace = true } euclid = { workspace = true } diff --git a/components/shared/webrender/lib.rs b/components/shared/webrender/lib.rs index c91931f0954..3438aeb28ef 100644 --- a/components/shared/webrender/lib.rs +++ b/components/shared/webrender/lib.rs @@ -12,9 +12,8 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex}; use base::id::WebViewId; -use constellation_traits::CompositorHitTestResult; use display_list::CompositorDisplayListInfo; -use embedder_traits::ScreenGeometry; +use embedder_traits::{CompositorHitTestResult, ScreenGeometry}; use euclid::default::Size2D as UntypedSize2D; use ipc_channel::ipc::{self, IpcSender, IpcSharedMemory}; use log::warn; |