aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/script/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared/script/lib.rs')
-rw-r--r--components/shared/script/lib.rs449
1 files changed, 10 insertions, 439 deletions
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(),
- }
- }
-}