aboutsummaryrefslogtreecommitdiffstats
path: root/components/shared/script_layout/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/shared/script_layout/lib.rs')
-rw-r--r--components/shared/script_layout/lib.rs164
1 files changed, 164 insertions, 0 deletions
diff --git a/components/shared/script_layout/lib.rs b/components/shared/script_layout/lib.rs
new file mode 100644
index 00000000000..0db42229678
--- /dev/null
+++ b/components/shared/script_layout/lib.rs
@@ -0,0 +1,164 @@
+/* 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 traits in script used generically in the rest of Servo.
+//! The traits are here instead of in script so that these modules won't have
+//! to depend on script.
+
+#![deny(unsafe_code)]
+
+pub mod message;
+pub mod rpc;
+pub mod wrapper_traits;
+
+use std::any::Any;
+use std::sync::atomic::AtomicIsize;
+
+use atomic_refcell::AtomicRefCell;
+use canvas_traits::canvas::{CanvasId, CanvasMsg};
+use ipc_channel::ipc::IpcSender;
+use libc::c_void;
+use malloc_size_of_derive::MallocSizeOf;
+use net_traits::image_cache::PendingImageId;
+use script_traits::UntrustedNodeAddress;
+use servo_url::{ImmutableOrigin, ServoUrl};
+use style::data::ElementData;
+use webrender_api::ImageKey;
+
+#[derive(MallocSizeOf)]
+pub struct StyleData {
+ /// Data that the style system associates with a node. When the
+ /// style system is being used standalone, this is all that hangs
+ /// off the node. This must be first to permit the various
+ /// transmutations between ElementData and PersistentLayoutData.
+ #[ignore_malloc_size_of = "This probably should not be ignored"]
+ pub element_data: AtomicRefCell<ElementData>,
+
+ /// Information needed during parallel traversals.
+ pub parallel: DomParallelInfo,
+}
+
+impl StyleData {
+ pub fn new() -> Self {
+ Self {
+ element_data: AtomicRefCell::new(ElementData::default()),
+ parallel: DomParallelInfo::new(),
+ }
+ }
+}
+
+pub type StyleAndOpaqueLayoutData = StyleAndGenericData<dyn Any + Send + Sync>;
+
+#[derive(MallocSizeOf)]
+pub struct StyleAndGenericData<T>
+where
+ T: ?Sized,
+{
+ /// The style data.
+ pub style_data: StyleData,
+ /// The opaque layout data.
+ #[ignore_malloc_size_of = "Trait objects are hard"]
+ pub generic_data: T,
+}
+
+impl StyleAndOpaqueLayoutData {
+ #[inline]
+ pub fn new<T>(style_data: StyleData, layout_data: T) -> Box<Self>
+ where
+ T: Any + Send + Sync,
+ {
+ Box::new(StyleAndGenericData {
+ style_data,
+ generic_data: layout_data,
+ })
+ }
+}
+
+/// Information that we need stored in each DOM node.
+#[derive(MallocSizeOf)]
+pub struct DomParallelInfo {
+ /// The number of children remaining to process during bottom-up traversal.
+ pub children_to_process: AtomicIsize,
+}
+
+impl DomParallelInfo {
+ pub fn new() -> DomParallelInfo {
+ DomParallelInfo {
+ children_to_process: AtomicIsize::new(0),
+ }
+ }
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+pub enum LayoutNodeType {
+ Element(LayoutElementType),
+ Text,
+}
+
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+pub enum LayoutElementType {
+ Element,
+ HTMLBodyElement,
+ HTMLBRElement,
+ HTMLCanvasElement,
+ HTMLHtmlElement,
+ HTMLIFrameElement,
+ HTMLImageElement,
+ HTMLInputElement,
+ HTMLMediaElement,
+ HTMLObjectElement,
+ HTMLParagraphElement,
+ HTMLTableCellElement,
+ HTMLTableColElement,
+ HTMLTableElement,
+ HTMLTableRowElement,
+ HTMLTableSectionElement,
+ HTMLTextAreaElement,
+ SVGSVGElement,
+}
+
+pub enum HTMLCanvasDataSource {
+ WebGL(ImageKey),
+ Image(Option<IpcSender<CanvasMsg>>),
+ WebGPU(ImageKey),
+}
+
+pub struct HTMLCanvasData {
+ pub source: HTMLCanvasDataSource,
+ pub width: u32,
+ pub height: u32,
+ pub canvas_id: CanvasId,
+}
+
+pub struct SVGSVGData {
+ pub width: u32,
+ pub height: u32,
+}
+
+/// The address of a node known to be valid. These are sent from script to layout.
+#[derive(Clone, Copy, Debug, Eq, PartialEq)]
+pub struct TrustedNodeAddress(pub *const c_void);
+
+#[allow(unsafe_code)]
+unsafe impl Send for TrustedNodeAddress {}
+
+/// Whether the pending image needs to be fetched or is waiting on an existing fetch.
+pub enum PendingImageState {
+ Unrequested(ServoUrl),
+ PendingResponse,
+}
+
+/// The data associated with an image that is not yet present in the image cache.
+/// Used by the script thread to hold on to DOM elements that need to be repainted
+/// when an image fetch is complete.
+pub struct PendingImage {
+ pub state: PendingImageState,
+ pub node: UntrustedNodeAddress,
+ pub id: PendingImageId,
+ pub origin: ImmutableOrigin,
+}
+
+pub struct HTMLMediaData {
+ pub current_frame: Option<(ImageKey, i32, i32)>,
+}