/* 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/. */ use std::collections::{HashMap, VecDeque}; use std::fmt; use base::id::{ BroadcastChannelRouterId, BrowsingContextId, HistoryStateId, MessagePortId, MessagePortRouterId, PipelineId, ServiceWorkerId, ServiceWorkerRegistrationId, TopLevelBrowsingContextId, }; use base::Epoch; use canvas_traits::canvas::{CanvasId, CanvasMsg}; use devtools_traits::{ScriptToDevtoolsControlMsg, WorkerId}; use embedder_traits::{ EmbedderMsg, MediaSessionEvent, TouchEventType, TouchSequenceId, TraversalDirection, }; use euclid::default::Size2D as UntypedSize2D; use euclid::Size2D; use ipc_channel::ipc::{IpcReceiver, IpcSender}; use net_traits::storage_thread::StorageType; use net_traits::CoreResourceMsg; use serde::{Deserialize, Serialize}; use servo_url::{ImmutableOrigin, ServoUrl}; use style_traits::CSSPixel; #[cfg(feature = "webgpu")] use webgpu::{wgc, WebGPU, WebGPUResponse}; use crate::{ AnimationState, AuxiliaryWebViewCreationRequest, BroadcastMsg, DocumentState, IFrameLoadInfoWithData, LoadData, MessagePortMsg, NavigationHistoryBehavior, PortMessageTask, StructuredSerializedData, WindowSizeType, WorkerGlobalScopeInit, WorkerScriptLoadOrigin, }; /// An iframe sizing operation. #[derive(Clone, Copy, Debug, Deserialize, Serialize)] pub struct IFrameSizeMsg { /// The child browsing context for this iframe. pub browsing_context_id: BrowsingContextId, /// The size of the iframe. pub size: Size2D, /// The kind of sizing operation. pub type_: WindowSizeType, } /// Messages from the layout to the constellation. #[derive(Deserialize, Serialize)] pub enum LayoutMsg { /// Requests that the constellation inform the compositor that it needs to record /// the time when the frame with the given ID (epoch) is painted. PendingPaintMetric(PipelineId, Epoch), } impl fmt::Debug for LayoutMsg { fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { use self::LayoutMsg::*; let variant = match *self { PendingPaintMetric(..) => "PendingPaintMetric", }; write!(formatter, "LayoutMsg::{}", variant) } } /// 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), } /// A log entry reported to the constellation /// We don't report all log entries, just serious ones. /// We need a separate type for this because `LogLevel` isn't serializable. #[derive(Clone, Debug, Deserialize, Serialize)] pub enum LogEntry { /// Panic, with a reason and backtrace Panic(String, String), /// Error, with a reason Error(String), /// warning, with a reason Warn(String), } /// Messages from the script to the constellation. #[derive(Deserialize, Serialize)] pub enum ScriptMsg { /// Request to complete the transfer of a set of ports to a router. CompleteMessagePortTransfer(MessagePortRouterId, Vec), /// The results of attempting to complete the transfer of a batch of ports. MessagePortTransferResult( /* The router whose transfer of ports succeeded, if any */ Option, /* The ids of ports transferred successfully */ Vec, /* The ids, and buffers, of ports whose transfer failed */ HashMap>, ), /// A new message-port was created or transferred, with corresponding control-sender. NewMessagePort(MessagePortRouterId, MessagePortId), /// A global has started managing message-ports NewMessagePortRouter(MessagePortRouterId, IpcSender), /// A global has stopped managing message-ports RemoveMessagePortRouter(MessagePortRouterId), /// A task requires re-routing to an already shipped message-port. RerouteMessagePort(MessagePortId, PortMessageTask), /// A message-port was shipped, let the entangled port know. MessagePortShipped(MessagePortId), /// A message-port has been discarded by script. RemoveMessagePort(MessagePortId), /// Entangle two message-ports. EntanglePorts(MessagePortId, MessagePortId), /// A global has started managing broadcast-channels. NewBroadcastChannelRouter( BroadcastChannelRouterId, IpcSender, ImmutableOrigin, ), /// A global has stopped managing broadcast-channels. RemoveBroadcastChannelRouter(BroadcastChannelRouterId, ImmutableOrigin), /// A global started managing broadcast channels for a given channel-name. NewBroadcastChannelNameInRouter(BroadcastChannelRouterId, String, ImmutableOrigin), /// A global stopped managing broadcast channels for a given channel-name. RemoveBroadcastChannelNameInRouter(BroadcastChannelRouterId, String, ImmutableOrigin), /// Broadcast a message to all same-origin broadcast channels, /// excluding the source of the broadcast. ScheduleBroadcast(BroadcastChannelRouterId, BroadcastMsg), /// Forward a message to the embedder. ForwardToEmbedder(EmbedderMsg), /// Broadcast a storage event to every same-origin pipeline. /// The strings are key, old value and new value. BroadcastStorageEvent( StorageType, ServoUrl, Option, Option, Option, ), /// Indicates whether this pipeline is currently running animations. ChangeRunningAnimationsState(AnimationState), /// Requests that a new 2D canvas thread be created. (This is done in the constellation because /// 2D canvases may use the GPU and we don't want to give untrusted content access to the GPU.) CreateCanvasPaintThread( UntypedSize2D, IpcSender<(IpcSender, CanvasId)>, ), /// Notifies the constellation that this frame has received focus. Focus, /// Get the top-level browsing context info for a given browsing context. GetTopForBrowsingContext( BrowsingContextId, IpcSender>, ), /// Get the browsing context id of the browsing context in which pipeline is /// embedded and the parent pipeline id of that browsing context. GetBrowsingContextInfo( PipelineId, IpcSender)>>, ), /// Get the nth child browsing context ID for a given browsing context, sorted in tree order. GetChildBrowsingContextId( BrowsingContextId, usize, IpcSender>, ), /// All pending loads are complete, and the `load` event for this pipeline /// has been dispatched. LoadComplete, /// A new load has been requested, with an option to replace the current entry once loaded /// instead of adding a new entry. LoadUrl(LoadData, NavigationHistoryBehavior), /// Abort loading after sending a LoadUrl message. AbortLoadUrl, /// Post a message to the currently active window of a given browsing context. PostMessage { /// The target of the posted message. target: BrowsingContextId, /// The source of the posted message. source: PipelineId, /// The expected origin of the target. target_origin: Option, /// The source origin of the message. /// source_origin: ImmutableOrigin, /// The data to be posted. data: StructuredSerializedData, }, /// Inform the constellation that a fragment was navigated to and whether or not it was a replacement navigation. NavigatedToFragment(ServoUrl, NavigationHistoryBehavior), /// HTMLIFrameElement Forward or Back traversal. TraverseHistory(TraversalDirection), /// Inform the constellation of a pushed history state. PushHistoryState(HistoryStateId, ServoUrl), /// Inform the constellation of a replaced history state. ReplaceHistoryState(HistoryStateId, ServoUrl), /// Gets the length of the joint session history from the constellation. JointSessionHistoryLength(IpcSender), /// Notification that this iframe should be removed. /// Returns a list of pipelines which were closed. RemoveIFrame(BrowsingContextId, IpcSender>), /// Successful response to [crate::ConstellationControlMsg::SetThrottled]. SetThrottledComplete(bool), /// A load has been requested in an IFrame. ScriptLoadedURLInIFrame(IFrameLoadInfoWithData), /// A load of the initial `about:blank` has been completed in an IFrame. ScriptNewIFrame(IFrameLoadInfoWithData), /// Script has opened a new auxiliary browsing context. CreateAuxiliaryWebView(AuxiliaryWebViewCreationRequest), /// Mark a new document as active ActivateDocument, /// Set the document state for a pipeline (used by screenshot / reftests) SetDocumentState(DocumentState), /// Update the layout epoch in the constellation (used by screenshot / reftests). SetLayoutEpoch(Epoch, IpcSender), /// Update the pipeline Url, which can change after redirections. SetFinalUrl(ServoUrl), /// Script has handled a touch event, and either prevented or allowed default actions. TouchEventProcessed(TouchEventResult), /// A log entry, with the top-level browsing context id and thread name LogEntry(Option, LogEntry), /// Discard the document. DiscardDocument, /// Discard the browsing context. DiscardTopLevelBrowsingContext, /// Notifies the constellation that this pipeline has exited. PipelineExited, /// Send messages from postMessage calls from serviceworker /// to constellation for storing in service worker manager ForwardDOMMessage(DOMMessage, ServoUrl), /// ScheduleJob(Job), /// Notifies the constellation about media session events /// (i.e. when there is metadata for the active media session, playback state changes...). MediaSessionEvent(PipelineId, MediaSessionEvent), #[cfg(feature = "webgpu")] /// Create a WebGPU Adapter instance RequestAdapter( IpcSender, wgc::instance::RequestAdapterOptions, wgc::id::AdapterId, ), #[cfg(feature = "webgpu")] /// Get WebGPU channel GetWebGPUChan(IpcSender>), /// Notify the constellation of a pipeline's document's title. TitleChanged(PipelineId, String), /// Notify the constellation that the size of some `