From 4c12008f5843413fbf5b2454e1284d61dc464b6c Mon Sep 17 00:00:00 2001 From: Shubham Gupta Date: Wed, 26 Mar 2025 14:05:45 +0800 Subject: [PATCH] Pass Viewport Description to compositor Signed-off-by: Shubham Gupta --- components/compositing/compositor.rs | 1 + components/compositing/tracing.rs | 1 + components/script/dom/htmlmetaelement.rs | 18 ++++++++++++++++-- components/shared/compositing/lib.rs | 4 ++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/components/compositing/compositor.rs b/components/compositing/compositor.rs index 0acbbec977a..afd4124cf87 100644 --- a/components/compositing/compositor.rs +++ b/components/compositing/compositor.rs @@ -973,6 +973,7 @@ impl IOCompositor { warn!("Sending response to get screen size failed ({error:?})."); } }, + CompositorMsg::Viewport(_webview_id, _viewport_description) => {}, } } diff --git a/components/compositing/tracing.rs b/components/compositing/tracing.rs index a8bb8b42bb8..65f9bd76c08 100644 --- a/components/compositing/tracing.rs +++ b/components/compositing/tracing.rs @@ -59,6 +59,7 @@ mod from_constellation { Self::GetScreenSize(..) => target!("GetScreenSize"), Self::GetAvailableScreenSize(..) => target!("GetAvailableScreenSize"), Self::CollectMemoryReport(..) => target!("CollectMemoryReport"), + Self::Viewport(..) => target!("Viewport"), } } } diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index 8453258308d..4ec6db7212c 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -2,6 +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 std::str::FromStr; + +use compositing_traits::CompositorMsg; use compositing_traits::viewport_description::ViewportDescription; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix, local_name, ns}; @@ -126,8 +129,19 @@ impl HTMLMetaElement { return; } let element = self.upcast::(); - if let Some(content) = element.get_attribute(&ns!(), &local_name!("content")) { - let _viewport = ViewportDescription::from_str(&content.value()).unwrap_or_default(); + let Some(content) = element.get_attribute(&ns!(), &local_name!("content")) else { + return; + }; + + if let Ok(viewport) = ViewportDescription::from_str(&content.value()) { + self.owner_window() + .compositor_api() + .sender() + .send(CompositorMsg::Viewport( + self.owner_window().webview_id(), + viewport, + )) + .unwrap(); } } diff --git a/components/shared/compositing/lib.rs b/components/shared/compositing/lib.rs index ee4e230fcf0..8dadf93d628 100644 --- a/components/shared/compositing/lib.rs +++ b/components/shared/compositing/lib.rs @@ -43,6 +43,8 @@ use webrender_api::{ ImageKey, NativeFontHandle, PipelineId as WebRenderPipelineId, }; +use crate::viewport_description::ViewportDescription; + /// Sends messages to the compositor. #[derive(Clone)] pub struct CompositorProxy { @@ -177,6 +179,8 @@ pub enum CompositorMsg { /// Measure the current memory usage associated with the compositor. /// The report must be sent on the provided channel once it's complete. CollectMemoryReport(ReportsChan), + /// A top-level frame has parsed a viewport metatag and is sending the new constraints. + Viewport(WebViewId, ViewportDescription), } impl Debug for CompositorMsg {