diff options
author | Shubham Gupta <32428749+shubhamg13@users.noreply.github.com> | 2025-06-06 23:13:51 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-06 15:13:51 +0000 |
commit | aff2a8537216fb2f8a18f2c6e2cf47b34d455f48 (patch) | |
tree | 2274bf367de4dd417077290df4a7af0fc7094c07 /components/script | |
parent | c7a215faba8ed2ebfa1624b020d82303130f0c9e (diff) | |
download | servo-aff2a8537216fb2f8a18f2c6e2cf47b34d455f48.tar.gz servo-aff2a8537216fb2f8a18f2c6e2cf47b34d455f48.zip |
Add support for parsing and applying `viewport` `<meta>` (#35901)
This patch comprises following steps:
1. Parses the `viewport` Attribute from `<meta>`.
2. Creates a `ViewportDescription` struct.
3. Populate values into Viewport struct.
4. Pass & Stash Viewport Description to Webview.
5. Process parsed values of `viewport <meta>`
Testing: Tested locally.
Fixes: #36159
---------
Signed-off-by: Shubham Gupta <shubham13297@gmail.com>
Signed-off-by: Xiaocheng Hu <xiaochengh.work@gmail.com>
Co-authored-by: Xiaocheng Hu <xiaochengh.work@gmail.com>
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/htmlmetaelement.rs | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/components/script/dom/htmlmetaelement.rs b/components/script/dom/htmlmetaelement.rs index e94a5e1ff33..4ec6db7212c 100644 --- a/components/script/dom/htmlmetaelement.rs +++ b/components/script/dom/htmlmetaelement.rs @@ -2,6 +2,10 @@ * 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}; use js::rust::HandleObject; @@ -61,6 +65,9 @@ impl HTMLMetaElement { if name == "referrer" { self.apply_referrer(); } + if name == "viewport" { + self.parse_and_send_viewport_if_necessary(); + } // https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv } else if !self.HttpEquiv().is_empty() { // TODO: Implement additional http-equiv candidates @@ -115,6 +122,29 @@ impl HTMLMetaElement { } } + /// <https://drafts.csswg.org/css-viewport/#parsing-algorithm> + fn parse_and_send_viewport_if_necessary(&self) { + // Skip processing if this isn't the top level frame + if !self.owner_window().is_top_level() { + return; + } + let element = self.upcast::<Element>(); + 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(); + } + } + /// <https://html.spec.whatwg.org/multipage/#attr-meta-http-equiv-content-security-policy> fn apply_csp_list(&self) { if let Some(parent) = self.upcast::<Node>().GetParentElement() { |