diff options
author | Martin Robinson <mrobinson@igalia.com> | 2025-04-15 11:15:14 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-15 09:15:14 +0000 |
commit | fe4306fc301b3651ed08017fff2178bfbde50ce6 (patch) | |
tree | 9ddc439f27f8b32c8f96f910e32d626ee9c1d734 | |
parent | f8b6b9f7b63756d13e8a86d988c93b521acc6966 (diff) | |
download | servo-fe4306fc301b3651ed08017fff2178bfbde50ce6.tar.gz servo-fe4306fc301b3651ed08017fff2178bfbde50ce6.zip |
Revert "compositor: Unify the cross process and in-process API (#36443)" (#36533)
This reverts commit 4c55104b36c7b858a117a6dd90a5dc21b74324d1.
This commit introduced an issue where messages from script to the
compositor no longer woke up the embedder. There is a larger issue
here, but this change exacerbated it.
Fixes #36528.
Signed-off-by: Martin Robinson <mrobinson@igalia.com>
-rw-r--r-- | components/compositing/compositor.rs | 95 | ||||
-rw-r--r-- | components/compositing/lib.rs | 5 | ||||
-rw-r--r-- | components/compositing/tracing.rs | 16 | ||||
-rw-r--r-- | components/constellation/pipeline.rs | 3 | ||||
-rw-r--r-- | components/script/dom/screen.rs | 6 | ||||
-rw-r--r-- | components/script/dom/window.rs | 5 | ||||
-rw-r--r-- | components/servo/lib.rs | 45 | ||||
-rw-r--r-- | components/shared/compositing/lib.rs | 135 |
8 files changed, 215 insertions, 95 deletions
diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index cdbaf4bbffb..f4ecd82cbc1 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -19,7 +19,8 @@ use bitflags::bitflags; use compositing_traits::display_list::{CompositorDisplayListInfo, HitTestInfo, ScrollTree}; use compositing_traits::rendering_context::RenderingContext; use compositing_traits::{ - CompositionPipeline, CompositorMsg, ImageUpdate, RendererWebView, SendableFrameTree, + CompositionPipeline, CompositorMsg, CompositorReceiver, CrossProcessCompositorMessage, + ImageUpdate, RendererWebView, SendableFrameTree, }; use constellation_traits::{AnimationTickType, EmbedderToConstellationMessage, PaintMetricEvent}; use crossbeam_channel::Sender; @@ -30,7 +31,7 @@ use embedder_traits::{ }; use euclid::{Point2D, Rect, Scale, Size2D, Transform3D}; use fnv::FnvHashMap; -use ipc_channel::ipc::{self, IpcReceiver, IpcSharedMemory}; +use ipc_channel::ipc::{self, IpcSharedMemory}; use libc::c_void; use log::{debug, info, trace, warn}; use pixels::{CorsStatus, Image, ImageFrame, PixelFormat}; @@ -89,7 +90,7 @@ pub struct ServoRenderer { shutdown_state: Rc<Cell<ShutdownState>>, /// The port on which we receive messages. - compositor_receiver: IpcReceiver<CompositorMsg>, + compositor_receiver: CompositorReceiver, /// The channel on which messages can be sent to the constellation. pub(crate) constellation_sender: Sender<EmbedderToConstellationMessage>, @@ -466,8 +467,8 @@ impl IOCompositor { .global .borrow_mut() .compositor_receiver - .try_recv() - .is_ok() + .try_recv_compositor_msg() + .is_some() {} // Tell the profiler, memory profiler, and scrolling timer to shut down. @@ -629,14 +630,33 @@ impl IOCompositor { webview.dispatch_input_event(InputEvent::MouseMove(MouseMoveEvent { point })); }, - CompositorMsg::SendInitialTransaction(pipeline) => { + CompositorMsg::CrossProcess(cross_proces_message) => { + self.handle_cross_process_message(cross_proces_message); + }, + } + } + + /// Accept messages from content processes that need to be relayed to the WebRender + /// instance in the parent process. + #[cfg_attr( + feature = "tracing", + tracing::instrument(skip_all, fields(servo_profiling = true), level = "trace") + )] + fn handle_cross_process_message(&mut self, msg: CrossProcessCompositorMessage) { + match msg { + CrossProcessCompositorMessage::SendInitialTransaction(pipeline) => { let mut txn = Transaction::new(); txn.set_display_list(WebRenderEpoch(0), (pipeline, Default::default())); self.generate_frame(&mut txn, RenderReasons::SCENE); self.global.borrow_mut().send_transaction(txn); }, - CompositorMsg::SendScrollNode(webview_id, pipeline_id, point, external_scroll_id) => { + CrossProcessCompositorMessage::SendScrollNode( + webview_id, + pipeline_id, + point, + external_scroll_id, + ) => { let Some(webview) = self.webviews.get_mut(webview_id) else { return; }; @@ -670,7 +690,7 @@ impl IOCompositor { self.global.borrow_mut().send_transaction(txn); }, - CompositorMsg::SendDisplayList { + CrossProcessCompositorMessage::SendDisplayList { webview_id, display_list_descriptor, display_list_receiver, @@ -759,7 +779,7 @@ impl IOCompositor { self.global.borrow_mut().send_transaction(transaction); }, - CompositorMsg::HitTest(pipeline, point, flags, sender) => { + CrossProcessCompositorMessage::HitTest(pipeline, point, flags, sender) => { // When a display list is sent to WebRender, it starts scene building in a // separate thread and then that display list is available for hit testing. // Without flushing scene building, any hit test we do might be done against @@ -785,11 +805,11 @@ impl IOCompositor { let _ = sender.send(result); }, - CompositorMsg::GenerateImageKey(sender) => { + CrossProcessCompositorMessage::GenerateImageKey(sender) => { let _ = sender.send(self.global.borrow().webrender_api.generate_image_key()); }, - CompositorMsg::UpdateImages(updates) => { + CrossProcessCompositorMessage::UpdateImages(updates) => { let mut txn = Transaction::new(); for update in updates { match update { @@ -805,21 +825,26 @@ impl IOCompositor { self.global.borrow_mut().send_transaction(txn); }, - CompositorMsg::AddFont(font_key, data, index) => { + CrossProcessCompositorMessage::AddFont(font_key, data, index) => { self.add_font(font_key, index, data); }, - CompositorMsg::AddSystemFont(font_key, native_handle) => { + CrossProcessCompositorMessage::AddSystemFont(font_key, native_handle) => { let mut transaction = Transaction::new(); transaction.add_native_font(font_key, native_handle); self.global.borrow_mut().send_transaction(transaction); }, - CompositorMsg::AddFontInstance(font_instance_key, font_key, size, flags) => { + CrossProcessCompositorMessage::AddFontInstance( + font_instance_key, + font_key, + size, + flags, + ) => { self.add_font_instance(font_instance_key, font_key, size, flags); }, - CompositorMsg::RemoveFonts(keys, instance_keys) => { + CrossProcessCompositorMessage::RemoveFonts(keys, instance_keys) => { let mut transaction = Transaction::new(); for instance in instance_keys.into_iter() { @@ -832,13 +857,13 @@ impl IOCompositor { self.global.borrow_mut().send_transaction(transaction); }, - CompositorMsg::AddImage(key, desc, data) => { + CrossProcessCompositorMessage::AddImage(key, desc, data) => { let mut txn = Transaction::new(); txn.add_image(key, desc, data.into(), None); self.global.borrow_mut().send_transaction(txn); }, - CompositorMsg::GenerateFontKeys( + CrossProcessCompositorMessage::GenerateFontKeys( number_of_font_keys, number_of_font_instance_keys, result_sender, @@ -856,7 +881,7 @@ impl IOCompositor { .collect(); let _ = result_sender.send((font_keys, font_instance_keys)); }, - CompositorMsg::GetClientWindowRect(webview_id, response_sender) => { + CrossProcessCompositorMessage::GetClientWindowRect(webview_id, response_sender) => { let client_window_rect = self .webviews .get(webview_id) @@ -866,7 +891,7 @@ impl IOCompositor { warn!("Sending response to get client window failed ({error:?})."); } }, - CompositorMsg::GetScreenSize(webview_id, response_sender) => { + CrossProcessCompositorMessage::GetScreenSize(webview_id, response_sender) => { let screen_size = self .webviews .get(webview_id) @@ -876,7 +901,7 @@ impl IOCompositor { warn!("Sending response to get screen size failed ({error:?})."); } }, - CompositorMsg::GetAvailableScreenSize(webview_id, response_sender) => { + CrossProcessCompositorMessage::GetAvailableScreenSize(webview_id, response_sender) => { let available_screen_size = self .webviews .get(webview_id) @@ -910,14 +935,16 @@ impl IOCompositor { } let _ = sender.send(()); }, - CompositorMsg::GenerateImageKey(sender) => { + CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GenerateImageKey( + sender, + )) => { let _ = sender.send(self.global.borrow().webrender_api.generate_image_key()); }, - CompositorMsg::GenerateFontKeys( + CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GenerateFontKeys( number_of_font_keys, number_of_font_instance_keys, result_sender, - ) => { + )) => { let font_keys = (0..number_of_font_keys) .map(|_| self.global.borrow().webrender_api.generate_font_key()) .collect(); @@ -931,17 +958,26 @@ impl IOCompositor { .collect(); let _ = result_sender.send((font_keys, font_instance_keys)); }, - CompositorMsg::GetClientWindowRect(_, response_sender) => { + CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GetClientWindowRect( + _, + response_sender, + )) => { if let Err(error) = response_sender.send(Default::default()) { warn!("Sending response to get client window failed ({error:?})."); } }, - CompositorMsg::GetScreenSize(_, response_sender) => { + CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GetScreenSize( + _, + response_sender, + )) => { if let Err(error) = response_sender.send(Default::default()) { warn!("Sending response to get client window failed ({error:?})."); } }, - CompositorMsg::GetAvailableScreenSize(_, response_sender) => { + CompositorMsg::CrossProcess(CrossProcessCompositorMessage::GetAvailableScreenSize( + _, + response_sender, + )) => { if let Err(error) = response_sender.send(Default::default()) { warn!("Sending response to get client window failed ({error:?})."); } @@ -1564,7 +1600,12 @@ impl IOCompositor { // Check for new messages coming from the other threads in the system. let mut compositor_messages = vec![]; let mut found_recomposite_msg = false; - while let Ok(msg) = self.global.borrow_mut().compositor_receiver.try_recv() { + while let Some(msg) = self + .global + .borrow_mut() + .compositor_receiver + .try_recv_compositor_msg() + { match msg { CompositorMsg::NewWebRenderFrameReady(..) if found_recomposite_msg => { // Only take one of duplicate NewWebRendeFrameReady messages, but do subtract diff --git a/components/compositing/lib.rs b/components/compositing/lib.rs index 996d9760a2d..2e09fd0b1ab 100644 --- a/components/compositing/lib.rs +++ b/components/compositing/lib.rs @@ -8,11 +8,10 @@ use std::cell::Cell; use std::rc::Rc; use compositing_traits::rendering_context::RenderingContext; -use compositing_traits::{CompositorMsg, CompositorProxy}; +use compositing_traits::{CompositorProxy, CompositorReceiver}; use constellation_traits::EmbedderToConstellationMessage; use crossbeam_channel::Sender; use embedder_traits::ShutdownState; -use ipc_channel::ipc::IpcReceiver; use profile_traits::{mem, time}; use webrender::RenderApi; use webrender_api::DocumentId; @@ -33,7 +32,7 @@ pub struct InitialCompositorState { /// A channel to the compositor. pub sender: CompositorProxy, /// A port on which messages inbound to the compositor can be received. - pub receiver: IpcReceiver<CompositorMsg>, + pub receiver: CompositorReceiver, /// A channel to the constellation. pub constellation_chan: Sender<EmbedderToConstellationMessage>, /// A channel to the time profiler thread. diff --git a/components/compositing/tracing.rs b/components/compositing/tracing.rs index 0373d0f1d1a..907c931aebe 100644 --- a/components/compositing/tracing.rs +++ b/components/compositing/tracing.rs @@ -42,21 +42,7 @@ mod from_constellation { Self::LoadComplete(..) => target!("LoadComplete"), Self::WebDriverMouseButtonEvent(..) => target!("WebDriverMouseButtonEvent"), Self::WebDriverMouseMoveEvent(..) => target!("WebDriverMouseMoveEvent"), - Self::SendInitialTransaction(..) => target!("SendInitialTransaction"), - Self::SendScrollNode(..) => target!("SendScrollNode"), - Self::SendDisplayList { .. } => target!("SendDisplayList"), - Self::HitTest(..) => target!("HitTest"), - Self::GenerateImageKey(..) => target!("GenerateImageKey"), - Self::AddImage(..) => target!("AddImage"), - Self::UpdateImages(..) => target!("UpdateImages"), - Self::GenerateFontKeys(..) => target!("GenerateFontKeys"), - Self::AddFont(..) => target!("AddFont"), - Self::AddSystemFont(..) => target!("AddSystemFont"), - Self::AddFontInstance(..) => target!("AddFontInstance"), - Self::RemoveFonts(..) => target!("RemoveFonts"), - Self::GetClientWindowRect(..) => target!("GetClientWindowRect"), - Self::GetScreenSize(..) => target!("GetScreenSize"), - Self::GetAvailableScreenSize(..) => target!("GetAvailableScreenSize"), + Self::CrossProcess(_) => target!("CrossProcess"), } } } diff --git a/components/constellation/pipeline.rs b/components/constellation/pipeline.rs index 58b5b1c58dc..b6e546acd48 100644 --- a/components/constellation/pipeline.rs +++ b/components/constellation/pipeline.rs @@ -291,7 +291,8 @@ impl Pipeline { webrender_document: state.webrender_document, cross_process_compositor_api: state .compositor_proxy - .cross_process_compositor_api(), + .cross_process_compositor_api + .clone(), webgl_chan: state.webgl_chan, webxr_registry: state.webxr_registry, player_context: state.player_context, diff --git a/components/script/dom/screen.rs b/components/script/dom/screen.rs index 061b2da3eca..4d76b20d626 100644 --- a/components/script/dom/screen.rs +++ b/components/script/dom/screen.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 compositing_traits::CompositorMsg; +use compositing_traits::CrossProcessCompositorMessage; use dom_struct::dom_struct; use euclid::Size2D; use profile_traits::ipc; @@ -41,7 +41,7 @@ impl Screen { self.window .compositor_api() .sender() - .send(CompositorMsg::GetScreenSize( + .send(CrossProcessCompositorMessage::GetScreenSize( self.window.webview_id(), sender, )) @@ -57,7 +57,7 @@ impl Screen { self.window .compositor_api() .sender() - .send(CompositorMsg::GetAvailableScreenSize( + .send(CrossProcessCompositorMessage::GetAvailableScreenSize( self.window.webview_id(), sender, )) diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 689e9689667..2b4f1e2bf55 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -1899,7 +1899,10 @@ impl Window { let (sender, receiver) = ProfiledIpc::channel::<DeviceIndependentIntRect>(timer_profile_chan).unwrap(); let _ = self.compositor_api.sender().send( - compositing_traits::CompositorMsg::GetClientWindowRect(self.webview_id(), sender), + compositing_traits::CrossProcessCompositorMessage::GetClientWindowRect( + self.webview_id(), + sender, + ), ); let rect = receiver.recv().unwrap_or_default(); ( diff --git a/components/servo/lib.rs b/components/servo/lib.rs index 642cff60cb0..68008775c42 100644 --- a/components/servo/lib.rs +++ b/components/servo/lib.rs @@ -48,8 +48,8 @@ pub use compositing_traits::rendering_context::{ OffscreenRenderingContext, RenderingContext, SoftwareRenderingContext, WindowRenderingContext, }; use compositing_traits::{ - CompositorMsg, CompositorProxy, WebrenderExternalImageHandlers, WebrenderExternalImageRegistry, - WebrenderImageHandlerType, + CompositorMsg, CompositorProxy, CompositorReceiver, CrossProcessCompositorApi, + WebrenderExternalImageHandlers, WebrenderExternalImageRegistry, WebrenderImageHandlerType, }; #[cfg(all( not(target_os = "windows"), @@ -82,6 +82,7 @@ use gaol::sandbox::{ChildSandbox, ChildSandboxMethods}; pub use gleam::gl; use gleam::gl::RENDERER; use ipc_channel::ipc::{self, IpcSender}; +use ipc_channel::router::ROUTER; pub use keyboard_types::*; use log::{Log, Metadata, Record, debug, warn}; use media::{GlApi, NativeDisplay, WindowGLContext}; @@ -297,6 +298,8 @@ impl Servo { // messages to client may need to pump a platform-specific event loop // to deliver the message. let event_loop_waker = embedder.create_event_loop_waker(); + let (compositor_proxy, compositor_receiver) = + create_compositor_channel(event_loop_waker.clone()); let (embedder_proxy, embedder_receiver) = create_embedder_channel(event_loop_waker.clone()); let time_profiler_chan = profile_time::Profiler::create( &opts.time_profiling, @@ -304,12 +307,6 @@ impl Servo { ); let mem_profiler_chan = profile_mem::Profiler::create(); - let (compositor_sender, compositor_receiver) = ipc::channel().expect("ipc channel failure"); - let compositor_proxy = CompositorProxy { - sender: compositor_sender, - event_loop_waker: event_loop_waker.clone(), - }; - let devtools_sender = if pref!(devtools_server_enabled) { Some(devtools::start_server( pref!(devtools_server_port) as u16, @@ -993,6 +990,34 @@ fn create_embedder_channel( ) } +fn create_compositor_channel( + event_loop_waker: Box<dyn EventLoopWaker>, +) -> (CompositorProxy, CompositorReceiver) { + let (sender, receiver) = unbounded(); + + let (compositor_ipc_sender, compositor_ipc_receiver) = + ipc::channel().expect("ipc channel failure"); + + let cross_process_compositor_api = CrossProcessCompositorApi(compositor_ipc_sender); + let compositor_proxy = CompositorProxy { + sender, + cross_process_compositor_api, + event_loop_waker, + }; + + let compositor_proxy_clone = compositor_proxy.clone(); + ROUTER.add_typed_route( + compositor_ipc_receiver, + Box::new(move |message| { + compositor_proxy_clone.send(CompositorMsg::CrossProcess( + message.expect("Could not convert Compositor message"), + )); + }), + ); + + (compositor_proxy, CompositorReceiver { receiver }) +} + #[allow(clippy::too_many_arguments)] fn create_constellation( config_dir: Option<PathBuf>, @@ -1029,11 +1054,11 @@ fn create_constellation( ); let system_font_service = Arc::new( - SystemFontService::spawn(compositor_proxy.cross_process_compositor_api()).to_proxy(), + SystemFontService::spawn(compositor_proxy.cross_process_compositor_api.clone()).to_proxy(), ); let (canvas_create_sender, canvas_ipc_sender) = CanvasPaintThread::start( - compositor_proxy.cross_process_compositor_api(), + compositor_proxy.cross_process_compositor_api.clone(), system_font_service.clone(), public_resource_threads.clone(), ); diff --git a/components/shared/compositing/lib.rs b/components/shared/compositing/lib.rs index b598dc1277b..acc14e3de29 100644 --- a/components/shared/compositing/lib.rs +++ b/components/shared/compositing/lib.rs @@ -7,6 +7,7 @@ use std::fmt::{Debug, Error, Formatter}; use base::id::{PipelineId, WebViewId}; +use crossbeam_channel::{Receiver, Sender}; use embedder_traits::{ AnimationState, EventLoopWaker, MouseButton, MouseButtonAction, TouchEventResult, }; @@ -21,6 +22,7 @@ use webrender_api::DocumentId; pub mod display_list; pub mod rendering_context; +use core::fmt; use std::collections::HashMap; use std::sync::{Arc, Mutex}; @@ -41,7 +43,11 @@ use webrender_api::{ /// Sends messages to the compositor. #[derive(Clone)] pub struct CompositorProxy { - pub sender: IpcSender<CompositorMsg>, + pub sender: Sender<CompositorMsg>, + /// Access to [`Self::sender`] that is possible to send across an IPC + /// channel. These messages are routed via the router thread to + /// [`Self::sender`]. + pub cross_process_compositor_api: CrossProcessCompositorApi, pub event_loop_waker: Box<dyn EventLoopWaker>, } @@ -52,14 +58,24 @@ impl CompositorProxy { } self.event_loop_waker.wake(); } +} + +/// The port that the compositor receives messages on. +pub struct CompositorReceiver { + pub receiver: Receiver<CompositorMsg>, +} - pub fn cross_process_compositor_api(&self) -> CrossProcessCompositorApi { - CrossProcessCompositorApi(self.sender.clone()) +impl CompositorReceiver { + pub fn try_recv_compositor_msg(&mut self) -> Option<CompositorMsg> { + self.receiver.try_recv().ok() + } + pub fn recv_compositor_msg(&mut self) -> CompositorMsg { + self.receiver.recv().unwrap() } } /// Messages from (or via) the constellation thread to the compositor. -#[derive(Deserialize, IntoStaticStr, Serialize)] +#[derive(IntoStaticStr)] pub enum CompositorMsg { /// Alerts the compositor that the given pipeline has changed whether it is running animations. ChangeRunningAnimationsState(WebViewId, PipelineId, AnimationState), @@ -96,6 +112,32 @@ pub enum CompositorMsg { /// WebDriver mouse move event WebDriverMouseMoveEvent(WebViewId, f32, f32), + /// Messages forwarded to the compositor by the constellation from other crates. These + /// messages are mainly passed on from the compositor to WebRender. + CrossProcess(CrossProcessCompositorMessage), +} + +pub struct SendableFrameTree { + pub pipeline: CompositionPipeline, + pub children: Vec<SendableFrameTree>, +} + +/// The subset of the pipeline that is needed for layer composition. +#[derive(Clone)] +pub struct CompositionPipeline { + pub id: PipelineId, + pub webview_id: WebViewId, +} + +impl Debug for CompositorMsg { + fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> { + let string: &'static str = self.into(); + write!(formatter, "{string}") + } +} + +#[derive(Deserialize, Serialize)] +pub enum CrossProcessCompositorMessage { /// Inform WebRender of the existence of this pipeline. SendInitialTransaction(WebRenderPipelineId), /// Perform a scroll operation. @@ -155,29 +197,31 @@ pub enum CompositorMsg { GetAvailableScreenSize(WebViewId, IpcSender<DeviceIndependentIntSize>), } -impl Debug for CompositorMsg { - fn fmt(&self, formatter: &mut Formatter) -> Result<(), Error> { - let string: &'static str = self.into(); - write!(formatter, "{string}") +impl fmt::Debug for CrossProcessCompositorMessage { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::AddImage(..) => f.write_str("AddImage"), + Self::GenerateFontKeys(..) => f.write_str("GenerateFontKeys"), + Self::AddSystemFont(..) => f.write_str("AddSystemFont"), + Self::SendInitialTransaction(..) => f.write_str("SendInitialTransaction"), + Self::SendScrollNode(..) => f.write_str("SendScrollNode"), + Self::SendDisplayList { .. } => f.write_str("SendDisplayList"), + Self::HitTest(..) => f.write_str("HitTest"), + Self::GenerateImageKey(..) => f.write_str("GenerateImageKey"), + Self::UpdateImages(..) => f.write_str("UpdateImages"), + Self::RemoveFonts(..) => f.write_str("RemoveFonts"), + Self::AddFontInstance(..) => f.write_str("AddFontInstance"), + Self::AddFont(..) => f.write_str("AddFont"), + Self::GetClientWindowRect(..) => f.write_str("GetClientWindowRect"), + Self::GetScreenSize(..) => f.write_str("GetScreenSize"), + Self::GetAvailableScreenSize(..) => f.write_str("GetAvailableScreenSize"), + } } } -#[derive(Deserialize, Serialize)] -pub struct SendableFrameTree { - pub pipeline: CompositionPipeline, - pub children: Vec<SendableFrameTree>, -} - -/// The subset of the pipeline that is needed for layer composition. -#[derive(Clone, Deserialize, Serialize)] -pub struct CompositionPipeline { - pub id: PipelineId, - pub webview_id: WebViewId, -} - /// A mechanism to send messages from ScriptThread to the parent process' WebRender instance. #[derive(Clone, Deserialize, Serialize)] -pub struct CrossProcessCompositorApi(pub IpcSender<CompositorMsg>); +pub struct CrossProcessCompositorApi(pub IpcSender<CrossProcessCompositorMessage>); impl CrossProcessCompositorApi { /// Create a new [`CrossProcessCompositorApi`] struct that does not have a listener on the other @@ -188,13 +232,18 @@ impl CrossProcessCompositorApi { } /// Get the sender for this proxy. - pub fn sender(&self) -> &IpcSender<CompositorMsg> { + pub fn sender(&self) -> &IpcSender<CrossProcessCompositorMessage> { &self.0 } /// Inform WebRender of the existence of this pipeline. pub fn send_initial_transaction(&self, pipeline: WebRenderPipelineId) { - if let Err(e) = self.0.send(CompositorMsg::SendInitialTransaction(pipeline)) { + if let Err(e) = self + .0 + .send(CrossProcessCompositorMessage::SendInitialTransaction( + pipeline, + )) + { warn!("Error sending initial transaction: {}", e); } } @@ -207,7 +256,7 @@ impl CrossProcessCompositorApi { point: LayoutPoint, scroll_id: ExternalScrollId, ) { - if let Err(e) = self.0.send(CompositorMsg::SendScrollNode( + if let Err(e) = self.0.send(CrossProcessCompositorMessage::SendScrollNode( webview_id, pipeline_id, point, @@ -226,7 +275,7 @@ impl CrossProcessCompositorApi { ) { let (display_list_data, display_list_descriptor) = list.into_data(); let (display_list_sender, display_list_receiver) = ipc::bytes_channel().unwrap(); - if let Err(e) = self.0.send(CompositorMsg::SendDisplayList { + if let Err(e) = self.0.send(CrossProcessCompositorMessage::SendDisplayList { webview_id, display_list_descriptor, display_list_receiver, @@ -261,7 +310,9 @@ impl CrossProcessCompositorApi { ) -> Vec<CompositorHitTestResult> { let (sender, receiver) = ipc::channel().unwrap(); self.0 - .send(CompositorMsg::HitTest(pipeline, point, flags, sender)) + .send(CrossProcessCompositorMessage::HitTest( + pipeline, point, flags, sender, + )) .expect("error sending hit test"); receiver.recv().expect("error receiving hit test result") } @@ -269,7 +320,9 @@ impl CrossProcessCompositorApi { /// Create a new image key. Blocks until the key is available. pub fn generate_image_key(&self) -> Option<ImageKey> { let (sender, receiver) = ipc::channel().unwrap(); - self.0.send(CompositorMsg::GenerateImageKey(sender)).ok()?; + self.0 + .send(CrossProcessCompositorMessage::GenerateImageKey(sender)) + .ok()?; receiver.recv().ok() } @@ -279,14 +332,19 @@ impl CrossProcessCompositorApi { descriptor: ImageDescriptor, data: SerializableImageData, ) { - if let Err(e) = self.0.send(CompositorMsg::AddImage(key, descriptor, data)) { + if let Err(e) = self.0.send(CrossProcessCompositorMessage::AddImage( + key, descriptor, data, + )) { warn!("Error sending image update: {}", e); } } /// Perform an image resource update operation. pub fn update_images(&self, updates: Vec<ImageUpdate>) { - if let Err(e) = self.0.send(CompositorMsg::UpdateImages(updates)) { + if let Err(e) = self + .0 + .send(CrossProcessCompositorMessage::UpdateImages(updates)) + { warn!("error sending image updates: {}", e); } } @@ -299,7 +357,10 @@ impl CrossProcessCompositorApi { if keys.is_empty() && instance_keys.is_empty() { return; } - let _ = self.0.send(CompositorMsg::RemoveFonts(keys, instance_keys)); + let _ = self.0.send(CrossProcessCompositorMessage::RemoveFonts( + keys, + instance_keys, + )); } pub fn add_font_instance( @@ -309,7 +370,7 @@ impl CrossProcessCompositorApi { size: f32, flags: FontInstanceFlags, ) { - let _x = self.0.send(CompositorMsg::AddFontInstance( + let _x = self.0.send(CrossProcessCompositorMessage::AddFontInstance( font_instance_key, font_key, size, @@ -318,11 +379,15 @@ impl CrossProcessCompositorApi { } pub fn add_font(&self, font_key: FontKey, data: Arc<IpcSharedMemory>, index: u32) { - let _ = self.0.send(CompositorMsg::AddFont(font_key, data, index)); + let _ = self.0.send(CrossProcessCompositorMessage::AddFont( + font_key, data, index, + )); } pub fn add_system_font(&self, font_key: FontKey, handle: NativeFontHandle) { - let _ = self.0.send(CompositorMsg::AddSystemFont(font_key, handle)); + let _ = self.0.send(CrossProcessCompositorMessage::AddSystemFont( + font_key, handle, + )); } pub fn fetch_font_keys( @@ -331,7 +396,7 @@ impl CrossProcessCompositorApi { number_of_font_instance_keys: usize, ) -> (Vec<FontKey>, Vec<FontInstanceKey>) { let (sender, receiver) = ipc_channel::ipc::channel().expect("Could not create IPC channel"); - let _ = self.0.send(CompositorMsg::GenerateFontKeys( + let _ = self.0.send(CrossProcessCompositorMessage::GenerateFontKeys( number_of_font_keys, number_of_font_instance_keys, sender, |